pdbconv -> p2r

This commit is contained in:
Ryan Fleury
2024-02-13 15:05:46 -08:00
parent 67859f228b
commit ecd21d0c1b
5 changed files with 312 additions and 312 deletions
+1 -1
View File
@@ -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.
+3 -3
View File
@@ -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
File diff suppressed because it is too large Load Diff
+110 -110
View File
@@ -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
@@ -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