mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
added missing LF_ENDPRECOMP type, fixed case for S_OBJNAME symbol,
merged leaf id kinds into main leaf enum, renamed public flags enum, removed type dependency on PDB string table and PDB coff section array
This commit is contained in:
+15
-5
@@ -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;
|
||||
|
||||
+48
-32
@@ -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
|
||||
|
||||
@@ -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}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -447,6 +447,7 @@ String8 result = str8_lit("<Unknown CV_LeafKind>");
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user