From af4972a3331d7b3e76b541bcaff4887db6d01406 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 29 May 2025 17:50:35 -0700 Subject: [PATCH] all constants evaluation; constant autocompletion; constant name string baking fix --- src/raddbg/raddbg_core.c | 3 +- src/raddbg/raddbg_eval.c | 8 +++++ src/raddump/raddump.c | 4 +++ src/raddump/raddump_main.c | 61 +++++++++++++++++---------------- src/rdi_from_pdb/rdi_from_pdb.c | 11 +++--- src/rdi_make/rdi_make_local.c | 1 + 6 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 781d788b..513bf07d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9960,7 +9960,7 @@ rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs) // rjf: calculate most general list expression, given the dst_eval space B32 force_allow = 0; B32 expr_based_replace = 1; - String8 list_expr = str8_lit("query:locals, query:globals, query:thread_locals, query:procedures, query:types"); + String8 list_expr = str8_lit("query:locals, query:globals, query:thread_locals, query:procedures, query:types, query:constants"); { E_TypeKey maybe_enum_type = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums); if(dst_eval.space.kind == RD_EvalSpaceKind_MetaCfg) @@ -12169,6 +12169,7 @@ rd_frame(void) { str8_lit_comp("procedures"), str8_lit_comp("thread_locals"), + str8_lit_comp("constants"), str8_lit_comp("globals"), str8_lit_comp("types"), }; diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index f67da862..4da6deb4 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1553,6 +1553,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table) else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;} else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariables;} else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariables;} + else if(str8_match(lhs_type->name, str8_lit("constants"), 0)) {section = RDI_SectionKind_Constants;} else if(str8_match(lhs_type->name, str8_lit("types"), 0)) {section = RDI_SectionKind_UDTs;} } @@ -1646,6 +1647,13 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) symbol_name.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &symbol_name.size); item_string = symbol_name; }break; + case RDI_SectionKind_Constants: + { + RDI_Constant *cnst = rdi_element_from_name_idx(module->rdi, Constants, element_idx); + String8 symbol_name = {0}; + symbol_name.str = rdi_string_from_idx(module->rdi, cnst->name_string_idx, &symbol_name.size); + item_string = symbol_name; + }break; case RDI_SectionKind_UDTs: { RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); diff --git a/src/raddump/raddump.c b/src/raddump/raddump.c index bbac15e8..88ba2992 100644 --- a/src/raddump/raddump.c +++ b/src/raddump/raddump.c @@ -1683,7 +1683,9 @@ rdi_print(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RD_Op rd_indent(); for (U64 i = 0; i < tvar_count; ++i) { rd_printf("thread_variable[%llu]:", i); + rd_indent(); rdi_print_thread_variable(arena, out, indent, rdi, &tvar_array[i]); + rd_unindent(); } rd_unindent(); rd_newline(); @@ -1695,7 +1697,9 @@ rdi_print(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RD_Op rd_indent(); for (U64 i = 0; i < constants_count; ++i) { rd_printf("constant[%llu]:", i); + rd_indent(); rdi_print_constant(arena, out, indent, rdi, &constants_array[i]); + rd_unindent(); } rd_unindent(); rd_newline(); diff --git a/src/raddump/raddump_main.c b/src/raddump/raddump_main.c index d6fee2b4..69582b8f 100644 --- a/src/raddump/raddump_main.c +++ b/src/raddump/raddump_main.c @@ -95,7 +95,7 @@ #include "radcon/radcon_pdb.c" #include "radcon/radcon_dwarf.c" #include "radcon/radcon.c" - + #include "linker/thread_pool/thread_pool.h" #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.h" @@ -116,9 +116,9 @@ global read_only struct } g_rd_dump_option_map[] = { { RD_Option_Help, "help", "Print help and exit" }, { RD_Option_Version, "version", "Print version and exit" }, - + { RD_Option_NoRdi, "nordi", "Don't load RAD Debug Info" }, - + { RD_Option_Headers, "headers", "Dump DOS header, file header, optional header, and/or archive header" }, { RD_Option_Sections, "sections", "Dump section headers as table" }, { RD_Option_Rawdata, "rawdata", "Dump raw section data" }, @@ -134,7 +134,7 @@ global read_only struct { RD_Option_LoadConfig, "loadconfig", "Dump load config" }, { RD_Option_Resources, "resources", "Dump resource directory" }, { RD_Option_LongNames, "longnames", "Dump archive long names" }, - + { RD_Option_DebugInfo, "debug_info", "Dump .debug_info" }, { RD_Option_DebugAbbrev, "debug_abbrev", "Dump .debug_abbrev" }, { RD_Option_DebugLine, "debug_line", "Dump .debug_line" }, @@ -151,7 +151,7 @@ global read_only struct { RD_Option_DebugStrOffsets, "debug_stroffsets", "Dump .debug_stroffsets" }, { RD_Option_Dwarf, "dwarf", "Dump all DWARF sections" }, { RD_Option_RelaxDwarfParser, "relax_dwarf_parser", "Relaxes version requirement on attribute and form encodings" }, - + { RD_Option_RdiDataSections, "rdi_data_sections", "Dump data sections" }, { RD_Option_RdiTopLevelInfo, "rdi_top_level_info", "Dump top level info" }, { RD_Option_RdiBinarySections, "rdi_binary_sections", "Dump binary sections" }, @@ -165,12 +165,13 @@ global read_only struct { RD_Option_RdiUserDefinedTypes, "rdi_udt", "Dump user defined types" }, { RD_Option_RdiGlobalVars, "rdi_global_vars", "Dump global variables" }, { RD_Option_RdiThreadVars, "rdi_thread_vars", "Dump thread variables" }, + { RD_Option_RdiConstants, "rdi_constants", "Dump constants" }, { RD_Option_RdiScopes, "rdi_scopes", "Dump scopes" }, { RD_Option_RdiScopeVMap, "rdi_scope_virtual_map", "Dump scope virtual map" }, { RD_Option_RdiInlineSites, "rdi_inline_sites", "Dump inline sites" }, { RD_Option_RdiNameMaps, "rdi_name_maps", "Dump name maps" }, { RD_Option_RdiStrings, "rdi_strings", "Dump strings" }, - + { RD_Option_Help, "h", "Alias for -help" }, { RD_Option_Version, "v", "Alias for -version" }, { RD_Option_Sections, "s", "Alias for -sections" }, @@ -186,7 +187,7 @@ internal void entry_point(CmdLine *cmdline) { Arena *arena = arena_alloc(); - + // make indent String8List *out = push_array(arena, String8List, 1); String8 indent; @@ -196,7 +197,7 @@ entry_point(CmdLine *cmdline) MemorySet(indent_buffer, ' ', indent_buffer_size); indent = str8(indent_buffer, 0); } - + // parse options RD_Option opts = 0; { @@ -212,16 +213,16 @@ entry_point(CmdLine *cmdline) break; } } - + if (opt == 0) { rd_errorf("Unknown argument: \"%S\"", cmd->string); goto exit; } - + opts |= opt; } } - + // print help if (opts & RD_Option_Help) { int longest_cmd_switch = 0; @@ -241,14 +242,14 @@ entry_point(CmdLine *cmdline) rd_unindent(); goto exit; } - + // print version if (opts & RD_Option_Version) { rd_printf(BUILD_TITLE_STRING_LITERAL); rd_printf("\traddump "); goto exit; } - + // input check if (cmdline->inputs.node_count == 0) { rd_errorf("No input file specified"); @@ -257,35 +258,35 @@ entry_point(CmdLine *cmdline) rd_errorf("Too many inputs specified, expected one"); goto exit; } - + // read input String8 file_path = str8_list_first(&cmdline->inputs); String8 raw_data = os_data_from_file_path(arena, file_path); - + // is read ok? if (raw_data.size == 0) { rd_errorf("Unable to read input file \"%S\"", file_path); goto exit; } - + // format input rd_format_preamble(arena, out, indent, file_path, raw_data); if (rd_is_rdi(raw_data)) { RDI_Parsed rdi = {0}; RDI_ParseStatus parse_status = rdi_parse(raw_data.str, raw_data.size, &rdi); switch (parse_status) { - case RDI_ParseStatus_Good: { - RD_Option rdi_print_opts = opts; - if ((rdi_print_opts & RD_Option_RdiAll) == 0) { - rdi_print_opts |= RD_Option_RdiAll; - } - rdi_print(arena, out, indent, &rdi, rdi_print_opts); - } break; - case RDI_ParseStatus_HeaderDoesNotMatch: rd_errorf("RDI Parse: header does not match"); break; - case RDI_ParseStatus_UnsupportedVersionNumber: rd_errorf("RDI Parse: unsupported version"); break; - case RDI_ParseStatus_InvalidDataSecionLayout: rd_errorf("RDI Parse: invalid data section layout"); break; - case RDI_ParseStatus_MissingRequiredSection: rd_errorf("RDI Parse: missing required section"); break; - default: rd_errorf("RDI Parse: unknown parse status %u", parse_status); break; + case RDI_ParseStatus_Good: { + RD_Option rdi_print_opts = opts; + if ((rdi_print_opts & RD_Option_RdiAll) == 0) { + rdi_print_opts |= RD_Option_RdiAll; + } + rdi_print(arena, out, indent, &rdi, rdi_print_opts); + } break; + case RDI_ParseStatus_HeaderDoesNotMatch: rd_errorf("RDI Parse: header does not match"); break; + case RDI_ParseStatus_UnsupportedVersionNumber: rd_errorf("RDI Parse: unsupported version"); break; + case RDI_ParseStatus_InvalidDataSecionLayout: rd_errorf("RDI Parse: invalid data section layout"); break; + case RDI_ParseStatus_MissingRequiredSection: rd_errorf("RDI Parse: missing required section"); break; + default: rd_errorf("RDI Parse: unknown parse status %u", parse_status); break; } } else if (coff_is_regular_archive(raw_data) || coff_is_thin_archive(raw_data)) { coff_print_archive(arena, out, indent, raw_data, opts); @@ -305,11 +306,11 @@ entry_point(CmdLine *cmdline) //elf_print_dwarf_expressions(arena, out, indent, raw_data); } -exit:; + exit:; // print formatted string String8 out_string = str8_list_join(arena, out, &(StringJoin){ .sep = str8_lit("\n"),}); fprintf(stdout, "%.*s", str8_varg(out_string)); - + arena_release(arena); } diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 7a6a9860..b0dd17cd 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2971,10 +2971,13 @@ ASYNC_WORK_DEF(p2r_symbol_stream_convert_work) } // rjf: build constant symbol - RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, &sym_constants, sym_constants_chunk_cap); - cnst->name = name_qualified; - cnst->type = type; - rdim_symbol_push_value_data(arena, &sym_constants, cnst, val_data); + if(name_qualified.size != 0) + { + RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, &sym_constants, sym_constants_chunk_cap); + cnst->name = name_qualified; + cnst->type = type; + rdim_symbol_push_value_data(arena, &sym_constants, cnst, val_data); + } }break; } } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 23f6d741..af016e81 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -768,6 +768,7 @@ rdim_bake(RDIM_LocalState *state, RDIM_BakeParams *in_params) &in_params->global_variables, &in_params->thread_variables, &in_params->procedures, + &in_params->constants, }; for(U64 list_idx = 0; list_idx < ArrayCount(symbol_lists); list_idx += 1) {