diff --git a/src/codeview/codeview.c b/src/codeview/codeview.c index c6189600..8e9d4f6b 100644 --- a/src/codeview/codeview.c +++ b/src/codeview/codeview.c @@ -80,6 +80,13 @@ cv_numeric_from_data_range(U8 *first, U8 *opl) return result; } +internal U64 +cv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out) +{ + *out = cv_numeric_from_data_range(data.str + offset, data.str + data.size); + return out->encoded_size; +} + internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num) { @@ -411,7 +418,7 @@ cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first) //~ CodeView C13 Parser Functions internal CV_C13Parsed * -cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections) +cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections) { ProfBeginFunction(); @@ -488,10 +495,10 @@ cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_ B32 has_cols = !!(hdr->flags & CV_C13SubSecLinesFlag_HasColumns); U64 secrel_off = hdr->sec_off; U64 secrel_opl = secrel_off + hdr->len; - U64 sec_base_off = sections->sections[sec_idx - 1].voff; + U64 sec_base_off = sections.v[sec_idx - 1].voff; // rjf: bad section index -> skip - if(sec_idx < 1 || sections->count < sec_idx) + if(sec_idx < 1 || sections.count < sec_idx) { continue; } @@ -511,7 +518,8 @@ cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_ { CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + file_off); U32 name_off = checksum->name_off; - file_name = pdb_strtbl_string_from_off(strtbl, name_off); + file_name = str8_cstring_capped((char*)(strtbl.str + name_off), + (char*)(strtbl.str + strtbl.size)); } // array layouts @@ -587,7 +595,8 @@ cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_ { CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + hdr->file_off); U32 name_off = checksum->name_off; - file_name = pdb_strtbl_string_from_off(strtbl, name_off); + file_name = str8_cstring_capped((char*)(strtbl.str + name_off), + (char*)(strtbl.str + strtbl.size)); } // rjf: parse extra files @@ -608,6 +617,7 @@ cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_ SLLQueuePush(node->inlinee_lines_first, node->inlinee_lines_last, n); n->v.inlinee = hdr->inlinee; n->v.file_name = file_name; + n->v.file_off = hdr->file_off; n->v.first_source_ln = hdr->first_source_ln; n->v.extra_file_count = extra_file_count; n->v.extra_files = extra_files; diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 196cbaec..42f05d97 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -9,9 +9,15 @@ //////////////////////////////// //~ rjf: CodeView Format Shared Types -typedef U32 CV_TypeId; -typedef U32 CV_ItemId; +#define CV_TypeIndex_Max max_U32 +typedef U32 CV_TypeIndex; +typedef CV_TypeIndex CV_TypeId; +typedef CV_TypeIndex CV_ItemId; + +#define CV_ModIndex_Max max_U16 +#define CV_ModIndex_Invalid CV_ModIndex_Max typedef U16 CV_ModIndex; + typedef U16 CV_SectionIndex; typedef U16 CV_Reg; @@ -1252,8 +1258,8 @@ struct CV_SymAnnotation //- (SymKind: OBJNAME) -typedef struct CV_SymObjname CV_SymObjname; -struct CV_SymObjname +typedef struct CV_SymObjName CV_SymObjName; +struct CV_SymObjName { U32 sig; // U8[] name (null terminated) @@ -1374,19 +1380,19 @@ struct CV_SymData32 //- (SymKind: PUB32) -typedef U32 CV_PubFlags; +typedef U32 CV_Pub32Flags; enum { - CV_PubFlag_Code = (1 << 0), - CV_PubFlag_Function = (1 << 1), - CV_PubFlag_ManagedCode = (1 << 2), - CV_PubFlag_MSIL = (1 << 3), + CV_Pub32Flag_Code = (1 << 0), + CV_Pub32Flag_Function = (1 << 1), + CV_Pub32Flag_ManagedCode = (1 << 2), + CV_Pub32Flag_MSIL = (1 << 3), }; typedef struct CV_SymPub32 CV_SymPub32; struct CV_SymPub32 { - CV_PubFlags flags; + CV_Pub32Flags flags; U32 off; CV_SectionIndex sec; // U8[] name (null terminated) @@ -1695,6 +1701,24 @@ struct CV_SymDiscarded }; //- (SymKind: COMPILE3) +typedef U32 CV_Compile3Flags; +enum +{ + CV_Compile3Flag_EC = (1 << 8), + CV_Compile3Flag_NoDbgInfo = (1 << 9), + CV_Compile3Flag_LTCG = (1 << 10), + CV_Compile3Flag_NoDataAlign = (1 << 11), + CV_Compile3Flag_ManagedPresent = (1 << 12), + CV_Compile3Flag_SecurityChecks = (1 << 13), + CV_Compile3Flag_HotPatch = (1 << 14), + CV_Compile3Flag_CVTCIL = (1 << 15), + CV_Compile3Flag_MSILModule = (1 << 16), + CV_Compile3Flag_SDL = (1 << 17), + CV_Compile3Flag_PGO = (1 << 18), + CV_Compile3Flag_EXP = (1 << 19), + + CV_Compile3Flag_Language_Shift = 0, CV_Compile3Flag_Language_Mask = 0xff, +}; typedef U32 CV_Compile3Flags; #define CV_Compile3Flags_ExtractLanguage(f) (((f) )&0xFF) @@ -1803,6 +1827,8 @@ struct CV_SymDefrangeFramepointerRel //- (SymKind: DEFRANGE_SUBFIELD_REGISTER) +#define CV_DefrangeSubfieldRegister_ExtractParentOffset(x) ((x) & 0x1FFF) + typedef struct CV_SymDefrangeSubfieldRegister CV_SymDefrangeSubfieldRegister; struct CV_SymDefrangeSubfieldRegister { @@ -2056,24 +2082,6 @@ struct CV_SymInlinees // (type info) // -#define CV_LeafIDKindXList(X) \ -X(FUNC_ID, 0x1601)\ -X(MFUNC_ID, 0x1602)\ -X(BUILDINFO, 0x1603)\ -X(SUBSTR_LIST, 0x1604)\ -X(STRING_ID, 0x1605)\ -X(UDT_SRC_LINE, 0x1606)\ -X(UDT_MOD_SRC_LINE, 0x1607) - -typedef U16 CV_LeafIDKind; -typedef enum CV_LeafIDKindEnum -{ -#define X(N,c) CV_LeafIDKind_##N = c, - CV_LeafIDKindXList(X) -#undef X -} -CV_LeafIDKindEnum; - #define CV_TypeId_Variadic 0 #define CV_BasicPointerKindXList(X) \ @@ -2285,10 +2293,18 @@ struct CV_LeafPreComp { U32 start_index; U32 count; - U32 signature; + U32 sig; // U8[] name (null terminated) }; +//- (LeafKind; END_PRECOMP) + +typedef struct CV_LeafEndPreComp CV_LeafEndPreComp; +struct CV_LeafEndPreComp +{ + U32 sig; +}; + //- (LeafKind: TYPESERVER) typedef struct CV_LeafTypeServer CV_LeafTypeServer; @@ -3004,6 +3020,7 @@ typedef struct CV_C13InlineeLinesParsed CV_C13InlineeLinesParsed; struct CV_C13InlineeLinesParsed { CV_ItemId inlinee; + U32 file_off; String8 file_name; U32 first_source_ln; U32 extra_file_count; @@ -3067,6 +3084,7 @@ internal U64 cv_hash_from_string(String8 string); internal U64 cv_hash_from_item_id(CV_ItemId item_id); internal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl); +internal U64 cv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out); internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num); internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num); @@ -3098,8 +3116,6 @@ internal CV_LeafParsed *cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_Ty //////////////////////////////// //~ CodeView C13 Parser Functions -typedef struct PDB_Strtbl PDB_Strtbl; -typedef struct PDB_CoffSectionArray PDB_CoffSectionArray; -internal CV_C13Parsed *cv_c13_parsed_from_data(Arena *arena, String8 c13_data, struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections); +internal CV_C13Parsed *cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections); #endif // CODEVIEW_H diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index 235ef75b..3cfb11e6 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -246,7 +246,7 @@ cv_string_from_arch: {MANTYPREF - 0x1028} {UNAMESPACE_ST - 0x1029} {ST_MAX - 0x1100} - {OBJNAME Objname 0x1101} + {OBJNAME ObjName 0x1101} {THUNK32 Thunk32 0x1102} {BLOCK32 Block32 0x1103} {WITH32 - 0x1104} @@ -462,6 +462,7 @@ CV_BasicTypeTable: @table(name header_type_name val) CV_LeafKindTable: { + {NOTYPE - 0x0000} {MODIFIER_16t - 0x0001} {POINTER_16t - 0x0002} {ARRAY_16t - 0x0003} @@ -586,6 +587,13 @@ CV_LeafKindTable: {VECTOR - 0x151b} {MATRIX - 0x151c} {VFTABLE - 0x151d} + {FUNC_ID FuncId 0x1601} + {MFUNC_ID MFuncId 0x1602} + {BUILDINFO BuildInfo 0x1603} + {SUBSTR_LIST SubstrList 0x1604} + {STRING_ID StringId 0x1605} + {UDT_SRC_LINE UDTSrcLine 0x1606} + {UDT_MOD_SRC_LINE UDTModSrcLine 0x1607} {CLASS2 Struct2 0x1608} {STRUCT2 Struct2 0x1609} } diff --git a/src/codeview/codeview_stringize.c b/src/codeview/codeview_stringize.c index d017d155..1338448e 100644 --- a/src/codeview/codeview_stringize.c +++ b/src/codeview/codeview_stringize.c @@ -408,11 +408,11 @@ cv_stringize_sym_range(Arena *arena, String8List *out, case CV_SymKind_OBJNAME: { - if (sizeof(CV_SymObjname) > cap){ + if (sizeof(CV_SymObjName) > cap){ str8_list_push(arena, out, str8_lit(" bad symbol range\n")); } else{ - CV_SymObjname *objname = (CV_SymObjname*)first; + CV_SymObjName *objname = (CV_SymObjName*)first; // sig str8_list_pushf(arena, out, " sig=%u\n", objname->sig); @@ -568,22 +568,22 @@ cv_stringize_sym_range(Arena *arena, String8List *out, CV_SymPub32 *pub32 = (CV_SymPub32*)first; // flags - CV_PubFlags flags = pub32->flags; + CV_Pub32Flags flags = pub32->flags; str8_list_push(arena, out, str8_lit(" flags=")); if (flags == 0){ str8_list_push(arena, out, str8_lit("0|")); } else{ - if (flags&CV_PubFlag_Code){ + if (flags&CV_Pub32Flag_Code){ str8_list_push(arena, out, str8_lit("Code|")); } - if (flags&CV_PubFlag_Function){ + if (flags&CV_Pub32Flag_Function){ str8_list_push(arena, out, str8_lit("Function|")); } - if (flags&CV_PubFlag_ManagedCode){ + if (flags&CV_Pub32Flag_ManagedCode){ str8_list_push(arena, out, str8_lit("ManagedCode|")); } - if (flags&CV_PubFlag_MSIL){ + if (flags&CV_Pub32Flag_MSIL){ str8_list_push(arena, out, str8_lit("MSIL|")); } } @@ -2004,7 +2004,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_FUNC_ID: + case CV_LeafKind_FUNC_ID: { if (sizeof(CV_LeafFuncId) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2020,7 +2020,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_MFUNC_ID: + case CV_LeafKind_MFUNC_ID: { if (sizeof(CV_LeafMFuncId) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2036,7 +2036,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_BUILDINFO: + case CV_LeafKind_BUILDINFO: { if (sizeof(CV_LeafBuildInfo) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2057,7 +2057,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_SUBSTR_LIST: + case CV_LeafKind_SUBSTR_LIST: { if (sizeof(CV_LeafSubstrList) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2078,7 +2078,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_STRING_ID: + case CV_LeafKind_STRING_ID: { if (sizeof(CV_LeafStringId) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2093,7 +2093,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, } }break; - case CV_LeafIDKind_UDT_SRC_LINE: + case CV_LeafKind_UDT_SRC_LINE: { if (sizeof(CV_LeafUDTSrcLine) > cap){ str8_list_push(arena, out, str8_lit(" bad leaf range\n")); @@ -2243,7 +2243,7 @@ cv_stringize_leaf_range(Arena *arena, String8List *out, //case CV_LeafIDKind_SUBSTR_LIST: //case CV_LeafIDKind_STRING_ID: //case CV_LeafIDKind_UDT_SRC_LINE: - case CV_LeafIDKind_UDT_MOD_SRC_LINE: + case CV_LeafKind_UDT_MOD_SRC_LINE: { str8_list_push(arena, out, str8_lit(" no stringizer path\n")); diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c index 702a2b4f..7e5be454 100644 --- a/src/codeview/generated/codeview.meta.c +++ b/src/codeview/generated/codeview.meta.c @@ -447,6 +447,7 @@ String8 result = str8_lit(""); switch(v) { default:{}break; +case CV_LeafKind_NOTYPE:{result = str8_lit("NOTYPE");}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; @@ -571,6 +572,13 @@ 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_FUNC_ID:{result = str8_lit("FUNC_ID");}break; +case CV_LeafKind_MFUNC_ID:{result = str8_lit("MFUNC_ID");}break; +case CV_LeafKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_LeafKind_SUBSTR_LIST:{result = str8_lit("SUBSTR_LIST");}break; +case CV_LeafKind_STRING_ID:{result = str8_lit("STRING_ID");}break; +case CV_LeafKind_UDT_SRC_LINE:{result = str8_lit("UDT_SRC_LINE");}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = str8_lit("UDT_MOD_SRC_LINE");}break; case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; } @@ -592,7 +600,7 @@ 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_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; @@ -696,6 +704,13 @@ 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_FUNC_ID:{result = sizeof(CV_LeafFuncId);}break; +case CV_LeafKind_MFUNC_ID:{result = sizeof(CV_LeafMFuncId);}break; +case CV_LeafKind_BUILDINFO:{result = sizeof(CV_LeafBuildInfo);}break; +case CV_LeafKind_SUBSTR_LIST:{result = sizeof(CV_LeafSubstrList);}break; +case CV_LeafKind_STRING_ID:{result = sizeof(CV_LeafStringId);}break; +case CV_LeafKind_UDT_SRC_LINE:{result = sizeof(CV_LeafUDTSrcLine);}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = sizeof(CV_LeafUDTModSrcLine);}break; case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; } diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h index 14932db2..9606dbf5 100644 --- a/src/codeview/generated/codeview.meta.h +++ b/src/codeview/generated/codeview.meta.h @@ -381,6 +381,7 @@ CV_BasicType_PTR = 0xf0, typedef U16 CV_LeafKind; typedef enum CV_LeafKindEnum { +CV_LeafKind_NOTYPE = 0x0000, CV_LeafKind_MODIFIER_16t = 0x0001, CV_LeafKind_POINTER_16t = 0x0002, CV_LeafKind_ARRAY_16t = 0x0003, @@ -505,6 +506,13 @@ CV_LeafKind_BINTERFACE = 0x151a, CV_LeafKind_VECTOR = 0x151b, CV_LeafKind_MATRIX = 0x151c, CV_LeafKind_VFTABLE = 0x151d, +CV_LeafKind_FUNC_ID = 0x1601, +CV_LeafKind_MFUNC_ID = 0x1602, +CV_LeafKind_BUILDINFO = 0x1603, +CV_LeafKind_SUBSTR_LIST = 0x1604, +CV_LeafKind_STRING_ID = 0x1605, +CV_LeafKind_UDT_SRC_LINE = 0x1606, +CV_LeafKind_UDT_MOD_SRC_LINE = 0x1607, CV_LeafKind_CLASS2 = 0x1608, CV_LeafKind_STRUCT2 = 0x1609, } CV_LeafKindEnum; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 7c4bb8bd..0e6465e8 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -742,7 +742,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) case CV_SymKind_GPROC32: { CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections.count) ? &in->coff_sections.v[proc32->sec-1] : 0; if(section != 0) { base_voff = section->voff + proc32->off; @@ -1064,7 +1064,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_link_name_map_build_task__entry_point) // 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; + COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= in->coff_sections.count) ? &in->coff_sections.v[pub32->sec-1] : 0; U64 voff = 0; if(section != 0) { @@ -2317,7 +2317,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) 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; + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections.count) ? &in->coff_sections.v[block32->sec-1] : 0; if(section != 0) { U64 voff_first = section->voff + block32->off; @@ -2344,7 +2344,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) // 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; + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections.count) ? &in->coff_sections.v[data32->sec-1] : 0; U64 voff = (section ? section->voff : 0) + data32->off; // rjf: determine if this is an exact duplicate global @@ -2427,7 +2427,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) // 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; + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections.count) ? &in->coff_sections.v[proc32->sec-1] : 0; if(section != 0) { U64 voff_first = section->voff + proc32->off; @@ -2672,7 +2672,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) 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; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); @@ -2711,7 +2711,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) // 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; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); @@ -2744,7 +2744,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) 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; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[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_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); @@ -2818,7 +2818,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) CV_Reg cv_reg = defrange_register_rel->reg; RDI_RegCode reg_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; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); @@ -2863,7 +2863,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) void *raw_leaf = rec_data.str + sizeof(U16); // rjf: extract method inline info - if(rec_range.hdr.kind == CV_LeafIDKind_MFUNC_ID && + if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) { CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; @@ -2873,7 +2873,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) } // rjf: extract non-method function inline info - else if(rec_range.hdr.kind == CV_LeafIDKind_FUNC_ID && + else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && rec_range.hdr.size >= sizeof(CV_LeafFuncId)) { CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; @@ -3090,7 +3090,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) 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); + String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); 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); @@ -3101,11 +3101,13 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: parse PDB strtbl // PDB_Strtbl *strtbl = 0; + String8 raw_strtbl = str8_zero(); if(named_streams != 0) ProfScope("parse PDB strtbl") { - MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_STRTABLE]; + MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); strtbl = pdb_strtbl_from_data(arena, strtbl_data); + raw_strtbl = str8_substr(strtbl_data, rng_1u64(strtbl->strblock_min, strtbl->strblock_max)); } ////////////////////////////////////////////////////////////// @@ -3141,14 +3143,12 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) ////////////////////////////////////////////////////////////// //- rjf: parse coff sections // - PDB_CoffSectionArray *coff_sections = 0; - U64 coff_section_count = 0; + COFF_SectionHeaderArray coff_sections = {0}; 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); - coff_section_count = coff_sections->count; } ////////////////////////////////////////////////////////////// @@ -3276,7 +3276,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) 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, 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].strtbl = raw_strtbl; c13_tasks_inputs[idx].coff_sections = coff_sections; c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, 0, &c13_tasks_inputs[idx]); } @@ -3293,10 +3293,9 @@ 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; + COFF_SectionHeader *coff_sec_ptr = coff_sections.v; + COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_sections.count; for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) { U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; @@ -3357,10 +3356,10 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) //- rjf: build binary sections list // RDIM_BinarySectionList binary_sections = {0}; - if(coff_sections != 0) ProfScope("build binary section list") + ProfScope("build binary section list") { - COFF_SectionHeader *coff_ptr = coff_sections->sections; - COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; + COFF_SectionHeader *coff_ptr = coff_sections.v; + COFF_SectionHeader *coff_opl = coff_ptr + coff_sections.count; for(;coff_ptr < coff_opl; coff_ptr += 1) { char *name_first = (char*)coff_ptr->name; diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index c3f5c149..89704861 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -109,8 +109,8 @@ typedef struct P2R_C13StreamParseIn P2R_C13StreamParseIn; struct P2R_C13StreamParseIn { String8 data; - PDB_Strtbl *strtbl; - PDB_CoffSectionArray *coff_sections; + String8 strtbl; + COFF_SectionHeaderArray coff_sections; }; //- rjf: comp unit parsing @@ -127,7 +127,7 @@ typedef struct P2R_CompUnitContributionsParseIn P2R_CompUnitContributionsParseIn struct P2R_CompUnitContributionsParseIn { String8 data; - PDB_CoffSectionArray *coff_sections; + COFF_SectionHeaderArray coff_sections; }; //////////////////////////////// @@ -174,7 +174,7 @@ typedef struct P2R_UnitConvertIn P2R_UnitConvertIn; struct P2R_UnitConvertIn { PDB_Strtbl *pdb_strtbl; - PDB_CoffSectionArray *coff_sections; + COFF_SectionHeaderArray coff_sections; PDB_CompUnitArray *comp_units; PDB_CompUnitContributionArray *comp_unit_contributions; CV_SymParsed **comp_unit_syms; @@ -196,7 +196,7 @@ typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; struct P2R_LinkNameMapBuildIn { CV_SymParsed *sym; - PDB_CoffSectionArray *coff_sections; + COFF_SectionHeaderArray coff_sections; P2R_LinkNameMap *link_name_map; }; @@ -249,7 +249,7 @@ typedef struct P2R_SymbolStreamConvertIn P2R_SymbolStreamConvertIn; struct P2R_SymbolStreamConvertIn { RDI_Arch arch; - PDB_CoffSectionArray *coff_sections; + COFF_SectionHeaderArray coff_sections; PDB_TpiHashParsed *tpi_hash; CV_LeafParsed *tpi_leaf; CV_LeafParsed *ipi_leaf;