mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-14 16:12:24 -07:00
pass over rdi dumping code; relocate to rdi_format_local; eliminate redundant helpers; plug into radbin
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -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,5 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind);
|
||||
|
||||
|
||||
|
||||
+31
-4
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user