pass over rdi dumping code; relocate to rdi_format_local; eliminate redundant helpers; plug into radbin

This commit is contained in:
Ryan Fleury
2025-06-10 14:14:39 -07:00
parent 6096869004
commit 834f38f73b
12 changed files with 1467 additions and 1285 deletions
+1 -1
View File
@@ -588,7 +588,7 @@ CV_LeafKindTable:
{MATRIX - 0x151c}
{VFTABLE - 0x151d}
{FUNC_ID FuncId 0x1601}
{MFUNC_ID MFuncId 0x1602}
{MFUNC_ID MFuncId 0x1602}
{BUILDINFO BuildInfo 0x1603}
{SUBSTR_LIST SubstrList 0x1604}
{STRING_ID StringId 0x1605}
+2 -2
View File
@@ -146,8 +146,8 @@ RDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out);
RDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out);
RDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out);
RDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx);
#define rdi_table_from_name(rdi, name, count_out) (RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out))
#define rdi_element_from_name_idx(rdi, name, idx) (RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx))
#define rdi_table_from_name(rdi, name, count_out) ((RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out)))
#define rdi_element_from_name_idx(rdi, name, idx) ((RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx)))
//- info about whole parse
RDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi);
+1 -1
View File
@@ -1313,7 +1313,7 @@ rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM
scopes->location_count +=1;
}
//- location block chunk list
//- rjf:location block chunk list
RDI_PROC RDI_LocationBlock *
rdim_location_block_chunk_list_push_array(RDIM_Arena *arena, RDIM_String8List *list, RDI_U32 count)
+2 -3
View File
@@ -1519,9 +1519,8 @@ 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_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location);
//- location block chunk list
RDI_PROC RDI_LocationBlock * rdim_location_block_chunk_list_push_array(RDIM_Arena *arena, RDIM_String8List *list, RDI_U32 count);
//- rjf:location block chunk list
RDI_PROC RDI_LocationBlock *rdim_location_block_chunk_list_push_array(RDIM_Arena *arena, RDIM_String8List *list, RDI_U32 count);
RDI_PROC RDI_U32 rdim_count_from_location_block_chunk_list(RDIM_String8List *list);
////////////////////////////////
-13
View File
@@ -1,14 +1 @@
internal String8
rdi_string_from_name_map_kind(RDI_NameMapKind kind)
{
String8 result = {0};
switch(kind)
{
default:{}break;
#define X(name) case RDI_NameMapKind_##name:{result = str8_lit(#name);}break;
RDI_NameMapKind_XList
#undef X
}
return result;
}
-1
View File
@@ -1,5 +1,4 @@
#pragma once
internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind);
+31 -4
View File
@@ -90,13 +90,40 @@ os_write_data_list_to_file_path(String8 path, String8List list)
if(!os_handle_match(file, os_handle_zero()))
{
good = 1;
U64 off = 0;
for(String8Node *n = list.first; n != 0; n = n->next)
Temp scratch = scratch_begin(0, 0);
U64 write_buffer_size = KB(64);
U8 *write_buffer = push_array_no_zero(scratch.arena, U8, write_buffer_size);
U64 write_buffer_write_pos = 0;
U64 write_buffer_read_pos = 0;
U64 file_off = 0;
{
os_file_write(file, r1u64(off, off+n->string.size), n->string.str);
off += n->string.size;
for(String8Node *n = list.first; n != 0; n = n->next)
{
for(U64 n_off = 0; n_off < n->string.size;)
{
U64 write_buffer_unconsumed_size = (write_buffer_write_pos - write_buffer_read_pos);
U64 write_buffer_available_size = (write_buffer_size - write_buffer_unconsumed_size);
if(write_buffer_available_size == 0)
{
os_file_write(file, r1u64(file_off, file_off+write_buffer_size), write_buffer);
file_off += write_buffer_size;
write_buffer_read_pos += write_buffer_size;
}
else
{
U64 bytes_to_copy = Min(write_buffer_available_size, n->string.size - n_off);
write_buffer_write_pos += ring_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy);
n_off += bytes_to_copy;
}
}
}
if(write_buffer_write_pos > write_buffer_read_pos)
{
os_file_write(file, r1u64(file_off, file_off + (write_buffer_write_pos-write_buffer_read_pos)), write_buffer);
}
}
os_file_close(file);
scratch_end(scratch);
}
return good;
}
+29 -11
View File
@@ -406,10 +406,9 @@ rb_entry_point(CmdLine *cmdline)
fprintf(stderr, "%.*s Help\n", str8_varg(output_kind_info[output_kind].title));
fprintf(stderr, "To see top-level options for radbin, run the binary with no arguments.\n\n");
}
fprintf(stderr, "-------------------------------------------------------------------------------\n\n");
}
fprintf(stderr, "-------------------------------------------------------------------------------\n\n");
//////////////////////////////
//- rjf: perform operation based on output kind
//
@@ -820,6 +819,8 @@ rb_entry_point(CmdLine *cmdline)
//
case OutputKind_Dump:
{
B32 deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic"));
//- rjf: no inputs => help
if(cmdline->inputs.node_count == 0)
{
@@ -832,7 +833,31 @@ rb_entry_point(CmdLine *cmdline)
for(RB_FileNode *n = input_files.first; n != 0; n = n->next)
{
RB_File *f = n->v;
// TODO(rjf)
str8_list_pushf(arena, &output_blobs, "# %S (%S)\n\n", deterministic ? str8_skip_last_slash(f->path) : f->path, rb_file_format_display_name_table[f->format]);
switch(f->format)
{
default:{}break;
//- rjf: RDI file
case RB_FileFormat_RDI:
{
RDI_Parsed rdi = {0};
RDI_ParseStatus rdi_status = rdi_parse(f->data.str, f->data.size, &rdi);
switch(rdi_status)
{
default:{}break;
case RDI_ParseStatus_HeaderDoesNotMatch: {str8_list_pushf(arena, &output_blobs, "");}break;
case RDI_ParseStatus_UnsupportedVersionNumber:{str8_list_pushf(arena, &output_blobs, "");}break;
case RDI_ParseStatus_InvalidDataSecionLayout: {}break;
case RDI_ParseStatus_MissingRequiredSection: {}break;
case RDI_ParseStatus_Good:
{
String8List dump = rdi_dump_list_from_parsed(arena, &rdi, RDI_DumpSubsetFlag_All);
str8_list_concat_in_place(&output_blobs, &dump);
}break;
}
}break;
}
}
//- rjf: join with output
@@ -845,14 +870,7 @@ rb_entry_point(CmdLine *cmdline)
//
if(output_path.size != 0) ProfScope("write outputs [file]")
{
OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_path);
U64 off = 0;
for(String8Node *n = output_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;
}
os_file_close(output_file);
os_write_data_list_to_file_path(output_path, output_blobs);
log_infof("Results written to %S", output_path);
}
else ProfScope("write outputs [stdout]")
File diff suppressed because it is too large Load Diff
-30
View File
@@ -189,36 +189,6 @@ internal void rd_print_raw_data (Arena *arena, String8List *out, String8 ind
// RDI
internal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v);
internal String8 rdi_string_from_arch (Arena *arena, RDI_Arch v);
internal String8 rdi_string_from_language (Arena *arena, RDI_Language v);
internal String8 rdi_string_from_local_kind (Arena *arena, RDI_LocalKind v);
//internal String8 rdi_string_from_type_kind (Arena *arena, RDI_TypeKind v);
internal String8 rdi_string_from_member_kind (Arena *arena, RDI_MemberKind v);
internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags);
internal String8 rdi_string_from_type_modifier (Arena *arena, RDI_TypeModifierFlags flags);
internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags);
internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags);
internal void rdi_print_data_sections (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi);
internal void rdi_print_top_level_info (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_TopLevelInfo *tli);
internal void rdi_print_binary_section (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_BinarySection *bin_section);
internal void rdi_print_file_path (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_FilePathNode *file_path);
internal void rdi_print_source_file (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_SourceFile *source_file);
internal void rdi_print_line_table (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_LineTable *line_table);
internal void rdi_print_source_line_map(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_SourceLineMap *map);
internal void rdi_print_unit (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_Unit *unit);
internal void rdi_print_type_node (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_TypeNode *type);
internal void rdi_print_udt (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_UDT *udt);
internal void rdi_print_global_variable(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_GlobalVariable *gvar);
internal void rdi_print_thread_variable(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_ThreadVariable *tvar);
internal void rdi_print_constant (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_Constant *constant);
internal void rdi_print_procedure (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_Arch arch);
internal void rdi_print_scope (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_Scope *scope, RDI_Arch arch);
internal void rdi_print_inline_site (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, U64 idx, RDI_InlineSite *inline_site);
internal void rdi_print_vmap_entry (Arena *arena, String8List *out, String8 indent, RDI_VMapEntry *v);
// DWARF
internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format);
File diff suppressed because it is too large Load Diff
+91
View File
@@ -7,6 +7,97 @@
#include "lib_rdi_format/rdi_format.h"
#include "lib_rdi_format/rdi_format_parse.h"
////////////////////////////////
//~ rjf: RDI Dumping Flags
#define RDI_DumpSubset_XList \
X(DataSections, data_sections, "DATA SECTIONS")\
X(TopLevelInfo, top_level_info, "TOP LEVEL INFO")\
X(BinarySections, binary_sections, "BINARY SECTIONS")\
X(FilePaths, file_paths, "FILE PATHS")\
X(SourceFiles, source_files, "SOURCE FILES")\
X(LineTables, line_tables, "LINE TABLES")\
X(SourceLineMaps, source_line_maps, "SOURCE LINE MAPS")\
X(Units, units, "UNITS")\
X(UnitVMap, unit_vmap, "UNIT VMAP")\
X(TypeNodes, type_nodes, "TYPE NODES")\
X(UserDefinedTypes, user_defined_types, "USER DEFINED TYPES")\
X(GlobalVariables, global_variables, "GLOBAL VARIABLES")\
X(GlobalVariablesVMap, global_variables_vmap, "GLOBAL VARIABLE VMAP")\
X(ThreadVariables, thread_variables, "THREAD VARIABLES")\
X(Constants, constants, "CONSTANTS")\
X(Procedures, procedures, "PROCEDURES")\
X(Scopes, scopes, "SCOPES")\
X(ScopeVMap, scope_vmap, "SCOPE VMAP")\
X(InlineSites, inline_sites, "INLINE SITES")\
X(NameMaps, name_maps, "NAME MAPS")\
X(Strings, strings, "STRINGS")\
typedef enum RDI_DumpSubset
{
#define X(name, name_lower, title) RDI_DumpSubset_##name,
RDI_DumpSubset_XList
#undef X
}
RDI_DumpSubset;
typedef U32 RDI_DumpSubsetFlags;
enum
{
#define X(name, name_lower, title) RDI_DumpSubsetFlag_##name = (1<<RDI_DumpSubset_##name),
RDI_DumpSubset_XList
#undef X
RDI_DumpSubsetFlag_All = 0xffffffffu,
};
read_only global String8 rdi_name_lowercase_from_dump_subset_table[] =
{
#define X(name, name_lower, title) str8_lit_comp(#name_lower),
RDI_DumpSubset_XList
#undef X
};
read_only global String8 rdi_name_title_from_dump_subset_table[] =
{
#define X(name, name_lower, title) str8_lit_comp(title),
RDI_DumpSubset_XList
#undef X
};
////////////////////////////////
//~ rjf: RDI Decompression
internal void rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi);
////////////////////////////////
//~ rjf: Lookup Helpers
internal String8 str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx);
////////////////////////////////
//~ rjf: String <=> Enum
internal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v);
internal String8 rdi_string_from_arch (Arena *arena, RDI_Arch v);
internal String8 rdi_string_from_language (Arena *arena, RDI_Language v);
internal String8 rdi_string_from_local_kind (Arena *arena, RDI_LocalKind v);
#if 0 // TODO(rjf): conflicts with RDI...
internal String8 rdi_string_from_type_kind (Arena *arena, RDI_TypeKind v);
#endif
internal String8 rdi_string_from_member_kind (Arena *arena, RDI_MemberKind v);
internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind);
internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags);
internal String8 rdi_string_from_type_modifier (Arena *arena, RDI_TypeModifierFlags flags);
internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags);
internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags);
internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc);
internal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range);
////////////////////////////////
//~ rjf: RDI Dumping
internal void rdi_dump_scope (Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, RDI_Scope *scope, RDI_Arch arch);
internal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags);
#endif // RDI_FORMAT_LOCAL_H