mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-07 14:28:40 +00:00
reading/cleanup/organization pass over main symbol conversion pass in raddbgi_from_pdb; automate & table-drive a few pieces via metacode tables
This commit is contained in:
@@ -1059,8 +1059,8 @@ enum
|
|||||||
CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup"
|
CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup"
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct CV_Return CV_Return;
|
typedef struct CV_SymReturn CV_SymReturn;
|
||||||
struct CV_Return
|
struct CV_SymReturn
|
||||||
{
|
{
|
||||||
CV_GenericFlags flags;
|
CV_GenericFlags flags;
|
||||||
CV_GenericStyle style;
|
CV_GenericStyle style;
|
||||||
|
|||||||
+214
-194
@@ -152,201 +152,201 @@ cv_string_from_arch:
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: CV Sym Kinds
|
//~ rjf: CV Sym Kinds
|
||||||
|
|
||||||
@table(name val) CV_SymKindTable:
|
@table(name header_type_name val) CV_SymKindTable:
|
||||||
{
|
{
|
||||||
{COMPILE 0x0001}
|
{COMPILE Compile 0x0001}
|
||||||
{REGISTER_16t 0x0002}
|
{REGISTER_16t - 0x0002}
|
||||||
{CONSTANT_16t 0x0003}
|
{CONSTANT_16t - 0x0003}
|
||||||
{UDT_16t 0x0004}
|
{UDT_16t - 0x0004}
|
||||||
{SSEARCH 0x0005}
|
{SSEARCH StartSearch 0x0005}
|
||||||
{END 0x0006}
|
{END - 0x0006}
|
||||||
{SKIP 0x0007}
|
{SKIP - 0x0007}
|
||||||
{CVRESERVE 0x0008}
|
{CVRESERVE - 0x0008}
|
||||||
{OBJNAME_ST 0x0009}
|
{OBJNAME_ST - 0x0009}
|
||||||
{ENDARG 0x000a}
|
{ENDARG - 0x000a}
|
||||||
{COBOLUDT_16t 0x000b}
|
{COBOLUDT_16t - 0x000b}
|
||||||
{MANYREG_16t 0x000c}
|
{MANYREG_16t - 0x000c}
|
||||||
{RETURN 0x000d}
|
{RETURN Return 0x000d}
|
||||||
{ENTRYTHIS 0x000e}
|
{ENTRYTHIS - 0x000e}
|
||||||
{BPREL16 0x0100}
|
{BPREL16 - 0x0100}
|
||||||
{LDATA16 0x0101}
|
{LDATA16 - 0x0101}
|
||||||
{GDATA16 0x0102}
|
{GDATA16 - 0x0102}
|
||||||
{PUB16 0x0103}
|
{PUB16 - 0x0103}
|
||||||
{LPROC16 0x0104}
|
{LPROC16 - 0x0104}
|
||||||
{GPROC16 0x0105}
|
{GPROC16 - 0x0105}
|
||||||
{THUNK16 0x0106}
|
{THUNK16 - 0x0106}
|
||||||
{BLOCK16 0x0107}
|
{BLOCK16 - 0x0107}
|
||||||
{WITH16 0x0108}
|
{WITH16 - 0x0108}
|
||||||
{LABEL16 0x0109}
|
{LABEL16 - 0x0109}
|
||||||
{CEXMODEL16 0x010a}
|
{CEXMODEL16 - 0x010a}
|
||||||
{VFTABLE16 0x010b}
|
{VFTABLE16 - 0x010b}
|
||||||
{REGREL16 0x010c}
|
{REGREL16 - 0x010c}
|
||||||
{BPREL32_16t 0x0200}
|
{BPREL32_16t - 0x0200}
|
||||||
{LDATA32_16t 0x0201}
|
{LDATA32_16t - 0x0201}
|
||||||
{GDATA32_16t 0x0202}
|
{GDATA32_16t - 0x0202}
|
||||||
{PUB32_16t 0x0203}
|
{PUB32_16t - 0x0203}
|
||||||
{LPROC32_16t 0x0204}
|
{LPROC32_16t - 0x0204}
|
||||||
{GPROC32_16t 0x0205}
|
{GPROC32_16t - 0x0205}
|
||||||
{THUNK32_ST 0x0206}
|
{THUNK32_ST - 0x0206}
|
||||||
{BLOCK32_ST 0x0207}
|
{BLOCK32_ST - 0x0207}
|
||||||
{WITH32_ST 0x0208}
|
{WITH32_ST - 0x0208}
|
||||||
{LABEL32_ST 0x0209}
|
{LABEL32_ST - 0x0209}
|
||||||
{CEXMODEL32 0x020a}
|
{CEXMODEL32 - 0x020a}
|
||||||
{VFTABLE32_16t 0x020b}
|
{VFTABLE32_16t - 0x020b}
|
||||||
{REGREL32_16t 0x020c}
|
{REGREL32_16t - 0x020c}
|
||||||
{LTHREAD32_16t 0x020d}
|
{LTHREAD32_16t - 0x020d}
|
||||||
{GTHREAD32_16t 0x020e}
|
{GTHREAD32_16t - 0x020e}
|
||||||
{SLINK32 0x020f}
|
{SLINK32 SLink32 0x020f}
|
||||||
{LPROCMIPS_16t 0x0300}
|
{LPROCMIPS_16t - 0x0300}
|
||||||
{GPROCMIPS_16t 0x0301}
|
{GPROCMIPS_16t - 0x0301}
|
||||||
{PROCREF_ST 0x0400}
|
{PROCREF_ST - 0x0400}
|
||||||
{DATAREF_ST 0x0401}
|
{DATAREF_ST - 0x0401}
|
||||||
{ALIGN 0x0402}
|
{ALIGN - 0x0402}
|
||||||
{LPROCREF_ST 0x0403}
|
{LPROCREF_ST - 0x0403}
|
||||||
{OEM 0x0404}
|
{OEM OEM 0x0404}
|
||||||
{TI16_MAX 0x1000}
|
{TI16_MAX - 0x1000}
|
||||||
{CONSTANT_ST 0x1002}
|
{CONSTANT_ST - 0x1002}
|
||||||
{UDT_ST 0x1003}
|
{UDT_ST - 0x1003}
|
||||||
{COBOLUDT_ST 0x1004}
|
{COBOLUDT_ST - 0x1004}
|
||||||
{MANYREG_ST 0x1005}
|
{MANYREG_ST - 0x1005}
|
||||||
{BPREL32_ST 0x1006}
|
{BPREL32_ST - 0x1006}
|
||||||
{LDATA32_ST 0x1007}
|
{LDATA32_ST - 0x1007}
|
||||||
{GDATA32_ST 0x1008}
|
{GDATA32_ST - 0x1008}
|
||||||
{PUB32_ST 0x1009}
|
{PUB32_ST - 0x1009}
|
||||||
{LPROC32_ST 0x100a}
|
{LPROC32_ST - 0x100a}
|
||||||
{GPROC32_ST 0x100b}
|
{GPROC32_ST - 0x100b}
|
||||||
{VFTABLE32 0x100c}
|
{VFTABLE32 VPath32 0x100c}
|
||||||
{REGREL32_ST 0x100d}
|
{REGREL32_ST - 0x100d}
|
||||||
{LTHREAD32_ST 0x100e}
|
{LTHREAD32_ST - 0x100e}
|
||||||
{GTHREAD32_ST 0x100f}
|
{GTHREAD32_ST - 0x100f}
|
||||||
{LPROCMIPS_ST 0x1010}
|
{LPROCMIPS_ST - 0x1010}
|
||||||
{GPROCMIPS_ST 0x1011}
|
{GPROCMIPS_ST - 0x1011}
|
||||||
{FRAMEPROC 0x1012}
|
{FRAMEPROC Frameproc 0x1012}
|
||||||
{COMPILE2_ST 0x1013}
|
{COMPILE2_ST - 0x1013}
|
||||||
{MANYREG2_ST 0x1014}
|
{MANYREG2_ST - 0x1014}
|
||||||
{LPROCIA64_ST 0x1015}
|
{LPROCIA64_ST - 0x1015}
|
||||||
{GPROCIA64_ST 0x1016}
|
{GPROCIA64_ST - 0x1016}
|
||||||
{LOCALSLOT_ST 0x1017}
|
{LOCALSLOT_ST - 0x1017}
|
||||||
{PARAMSLOT_ST 0x1018}
|
{PARAMSLOT_ST - 0x1018}
|
||||||
{ANNOTATION 0x1019}
|
{ANNOTATION Annotation 0x1019}
|
||||||
{GMANPROC_ST 0x101a}
|
{GMANPROC_ST - 0x101a}
|
||||||
{LMANPROC_ST 0x101b}
|
{LMANPROC_ST - 0x101b}
|
||||||
{RESERVED1 0x101c}
|
{RESERVED1 - 0x101c}
|
||||||
{RESERVED2 0x101d}
|
{RESERVED2 - 0x101d}
|
||||||
{RESERVED3 0x101e}
|
{RESERVED3 - 0x101e}
|
||||||
{RESERVED4 0x101f}
|
{RESERVED4 - 0x101f}
|
||||||
{LMANDATA_ST 0x1020}
|
{LMANDATA_ST - 0x1020}
|
||||||
{GMANDATA_ST 0x1021}
|
{GMANDATA_ST - 0x1021}
|
||||||
{MANFRAMEREL_ST 0x1022}
|
{MANFRAMEREL_ST - 0x1022}
|
||||||
{MANREGISTER_ST 0x1023}
|
{MANREGISTER_ST - 0x1023}
|
||||||
{MANSLOT_ST 0x1024}
|
{MANSLOT_ST - 0x1024}
|
||||||
{MANMANYREG_ST 0x1025}
|
{MANMANYREG_ST - 0x1025}
|
||||||
{MANREGREL_ST 0x1026}
|
{MANREGREL_ST - 0x1026}
|
||||||
{MANMANYREG2_ST 0x1027}
|
{MANMANYREG2_ST - 0x1027}
|
||||||
{MANTYPREF 0x1028}
|
{MANTYPREF - 0x1028}
|
||||||
{UNAMESPACE_ST 0x1029}
|
{UNAMESPACE_ST - 0x1029}
|
||||||
{ST_MAX 0x1100}
|
{ST_MAX - 0x1100}
|
||||||
{OBJNAME 0x1101}
|
{OBJNAME Objname 0x1101}
|
||||||
{THUNK32 0x1102}
|
{THUNK32 Thunk32 0x1102}
|
||||||
{BLOCK32 0x1103}
|
{BLOCK32 Block32 0x1103}
|
||||||
{WITH32 0x1104}
|
{WITH32 - 0x1104}
|
||||||
{LABEL32 0x1105}
|
{LABEL32 Label32 0x1105}
|
||||||
{REGISTER 0x1106}
|
{REGISTER Register 0x1106}
|
||||||
{CONSTANT 0x1107}
|
{CONSTANT Constant 0x1107}
|
||||||
{UDT 0x1108}
|
{UDT UDT 0x1108}
|
||||||
{COBOLUDT 0x1109}
|
{COBOLUDT - 0x1109}
|
||||||
{MANYREG 0x110a}
|
{MANYREG Manyreg 0x110a}
|
||||||
{BPREL32 0x110b}
|
{BPREL32 BPRel32 0x110b}
|
||||||
{LDATA32 0x110c}
|
{LDATA32 Data32 0x110c}
|
||||||
{GDATA32 0x110d}
|
{GDATA32 Data32 0x110d}
|
||||||
{PUB32 0x110e}
|
{PUB32 Pub32 0x110e}
|
||||||
{LPROC32 0x110f}
|
{LPROC32 Proc32 0x110f}
|
||||||
{GPROC32 0x1110}
|
{GPROC32 Proc32 0x1110}
|
||||||
{REGREL32 0x1111}
|
{REGREL32 Regrel32 0x1111}
|
||||||
{LTHREAD32 0x1112}
|
{LTHREAD32 Thread32 0x1112}
|
||||||
{GTHREAD32 0x1113}
|
{GTHREAD32 Thread32 0x1113}
|
||||||
{LPROCMIPS 0x1114}
|
{LPROCMIPS - 0x1114}
|
||||||
{GPROCMIPS 0x1115}
|
{GPROCMIPS - 0x1115}
|
||||||
{COMPILE2 0x1116}
|
{COMPILE2 Compile2 0x1116}
|
||||||
{MANYREG2 0x1117}
|
{MANYREG2 Manyreg2 0x1117}
|
||||||
{LPROCIA64 0x1118}
|
{LPROCIA64 - 0x1118}
|
||||||
{GPROCIA64 0x1119}
|
{GPROCIA64 - 0x1119}
|
||||||
{LOCALSLOT 0x111a}
|
{LOCALSLOT Slot 0x111a}
|
||||||
{PARAMSLOT 0x111b}
|
{PARAMSLOT - 0x111b}
|
||||||
{LMANDATA 0x111c}
|
{LMANDATA - 0x111c}
|
||||||
{GMANDATA 0x111d}
|
{GMANDATA - 0x111d}
|
||||||
{MANFRAMEREL 0x111e}
|
{MANFRAMEREL AttrFrameRel 0x111e}
|
||||||
{MANREGISTER 0x111f}
|
{MANREGISTER AttrReg 0x111f}
|
||||||
{MANSLOT 0x1120}
|
{MANSLOT - 0x1120}
|
||||||
{MANMANYREG 0x1121}
|
{MANMANYREG AttrManyReg 0x1121}
|
||||||
{MANREGREL 0x1122}
|
{MANREGREL AttrRegRel 0x1122}
|
||||||
{MANMANYREG2 0x1123}
|
{MANMANYREG2 - 0x1123}
|
||||||
{UNAMESPACE 0x1124}
|
{UNAMESPACE UNamespace 0x1124}
|
||||||
{PROCREF 0x1125}
|
{PROCREF Ref2 0x1125}
|
||||||
{DATAREF 0x1126}
|
{DATAREF Ref2 0x1126}
|
||||||
{LPROCREF 0x1127}
|
{LPROCREF Ref2 0x1127}
|
||||||
{ANNOTATIONREF 0x1128}
|
{ANNOTATIONREF - 0x1128}
|
||||||
{TOKENREF 0x1129}
|
{TOKENREF - 0x1129}
|
||||||
{GMANPROC 0x112a}
|
{GMANPROC - 0x112a}
|
||||||
{LMANPROC 0x112b}
|
{LMANPROC - 0x112b}
|
||||||
{TRAMPOLINE 0x112c}
|
{TRAMPOLINE Trampoline 0x112c}
|
||||||
{MANCONSTANT 0x112d}
|
{MANCONSTANT - 0x112d}
|
||||||
{ATTR_FRAMEREL 0x112e}
|
{ATTR_FRAMEREL AttrFrameRel 0x112e}
|
||||||
{ATTR_REGISTER 0x112f}
|
{ATTR_REGISTER AttrReg 0x112f}
|
||||||
{ATTR_REGREL 0x1130}
|
{ATTR_REGREL AttrRegRel 0x1130}
|
||||||
{ATTR_MANYREG 0x1131}
|
{ATTR_MANYREG AttrManyReg 0x1131}
|
||||||
{SEPCODE 0x1132}
|
{SEPCODE Sepcode 0x1132}
|
||||||
{DEFRANGE_2005 0x1134}
|
{DEFRANGE_2005 - 0x1134}
|
||||||
{DEFRANGE2_2005 0x1135}
|
{DEFRANGE2_2005 - 0x1135}
|
||||||
{SECTION 0x1136}
|
{SECTION Section 0x1136}
|
||||||
{COFFGROUP 0x1137}
|
{COFFGROUP CoffGroup 0x1137}
|
||||||
{EXPORT 0x1138}
|
{EXPORT Export 0x1138}
|
||||||
{CALLSITEINFO 0x1139}
|
{CALLSITEINFO CallSiteInfo 0x1139}
|
||||||
{FRAMECOOKIE 0x113a}
|
{FRAMECOOKIE FrameCookie 0x113a}
|
||||||
{DISCARDED 0x113b}
|
{DISCARDED Discarded 0x113b}
|
||||||
{COMPILE3 0x113c}
|
{COMPILE3 Compile3 0x113c}
|
||||||
{ENVBLOCK 0x113d}
|
{ENVBLOCK EnvBlock 0x113d}
|
||||||
{LOCAL 0x113e}
|
{LOCAL Local 0x113e}
|
||||||
{DEFRANGE 0x113f}
|
{DEFRANGE - 0x113f}
|
||||||
{DEFRANGE_SUBFIELD 0x1140}
|
{DEFRANGE_SUBFIELD DefrangeSubfield 0x1140}
|
||||||
{DEFRANGE_REGISTER 0x1141}
|
{DEFRANGE_REGISTER DefrangeRegister 0x1141}
|
||||||
{DEFRANGE_FRAMEPOINTER_REL 0x1142}
|
{DEFRANGE_FRAMEPOINTER_REL DefrangeFramepointerRel 0x1142}
|
||||||
{DEFRANGE_SUBFIELD_REGISTER 0x1143}
|
{DEFRANGE_SUBFIELD_REGISTER DefrangeSubfieldRegister 0x1143}
|
||||||
{DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE 0x1144}
|
{DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefrangeFramepointerRelFullScope 0x1144}
|
||||||
{DEFRANGE_REGISTER_REL 0x1145}
|
{DEFRANGE_REGISTER_REL DefrangeRegisterRel 0x1145}
|
||||||
{LPROC32_ID 0x1146}
|
{LPROC32_ID - 0x1146}
|
||||||
{GPROC32_ID 0x1147}
|
{GPROC32_ID - 0x1147}
|
||||||
{LPROCMIPS_ID 0x1148}
|
{LPROCMIPS_ID - 0x1148}
|
||||||
{GPROCMIPS_ID 0x1149}
|
{GPROCMIPS_ID - 0x1149}
|
||||||
{LPROCIA64_ID 0x114a}
|
{LPROCIA64_ID - 0x114a}
|
||||||
{GPROCIA64_ID 0x114b}
|
{GPROCIA64_ID - 0x114b}
|
||||||
{BUILDINFO 0x114c}
|
{BUILDINFO BuildInfo 0x114c}
|
||||||
{INLINESITE 0x114d}
|
{INLINESITE InlineSite 0x114d}
|
||||||
{INLINESITE_END 0x114e}
|
{INLINESITE_END - 0x114e}
|
||||||
{PROC_ID_END 0x114f}
|
{PROC_ID_END - 0x114f}
|
||||||
{DEFRANGE_HLSL 0x1150}
|
{DEFRANGE_HLSL - 0x1150}
|
||||||
{GDATA_HLSL 0x1151}
|
{GDATA_HLSL - 0x1151}
|
||||||
{LDATA_HLSL 0x1152}
|
{LDATA_HLSL - 0x1152}
|
||||||
{FILESTATIC 0x1153}
|
{FILESTATIC FileStatic 0x1153}
|
||||||
{LPROC32_DPC 0x1155}
|
{LPROC32_DPC - 0x1155}
|
||||||
{LPROC32_DPC_ID 0x1156}
|
{LPROC32_DPC_ID - 0x1156}
|
||||||
{DEFRANGE_DPC_PTR_TAG 0x1157}
|
{DEFRANGE_DPC_PTR_TAG - 0x1157}
|
||||||
{DPC_SYM_TAG_MAP 0x1158}
|
{DPC_SYM_TAG_MAP - 0x1158}
|
||||||
{ARMSWITCHTABLE 0x1159}
|
{ARMSWITCHTABLE - 0x1159}
|
||||||
{CALLEES 0x115a}
|
{CALLEES FunctionList 0x115a}
|
||||||
{CALLERS 0x115b}
|
{CALLERS FunctionList 0x115b}
|
||||||
{POGODATA 0x115c}
|
{POGODATA PogoInfo 0x115c}
|
||||||
{INLINESITE2 0x115d}
|
{INLINESITE2 InlineSite2 0x115d}
|
||||||
{HEAPALLOCSITE 0x115e}
|
{HEAPALLOCSITE HeapAllocSite 0x115e}
|
||||||
{MOD_TYPEREF 0x115f}
|
{MOD_TYPEREF ModTypeRef 0x115f}
|
||||||
{REF_MINIPDB 0x1160}
|
{REF_MINIPDB RefMiniPdb 0x1160}
|
||||||
{PDBMAP 0x1161}
|
{PDBMAP - 0x1161}
|
||||||
{GDATA_HLSL32 0x1162}
|
{GDATA_HLSL32 - 0x1162}
|
||||||
{LDATA_HLSL32 0x1163}
|
{LDATA_HLSL32 - 0x1163}
|
||||||
{GDATA_HLSL32_EX 0x1164}
|
{GDATA_HLSL32_EX - 0x1164}
|
||||||
{LDATA_HLSL32_EX 0x1165}
|
{LDATA_HLSL32_EX - 0x1165}
|
||||||
{FASTLINK 0x1167}
|
{FASTLINK FastLink 0x1167}
|
||||||
{INLINEES 0x1168}
|
{INLINEES Inlinees 0x1168}
|
||||||
}
|
}
|
||||||
|
|
||||||
@enum(U16) CV_SymKind:
|
@enum(U16) CV_SymKind:
|
||||||
@@ -360,6 +360,26 @@ cv_string_from_sym_kind:
|
|||||||
@expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`;
|
@expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@gen(functions)
|
||||||
|
{
|
||||||
|
`internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);`;
|
||||||
|
}
|
||||||
|
|
||||||
|
@gen(functions) @c_file
|
||||||
|
{
|
||||||
|
`internal U64`;
|
||||||
|
`cv_header_struct_size_from_sym_kind(CV_SymKind v)`;
|
||||||
|
`{`;
|
||||||
|
`U64 result = 0;`;
|
||||||
|
`switch(v)`;
|
||||||
|
`{`;
|
||||||
|
`default:{}break;`;
|
||||||
|
@expand(CV_SymKindTable a) `$(a.header_type_name != "-" -> "case CV_SymKind_"..a.name..":{result = sizeof(CV_Sym"..a.header_type_name..");}break;")`;
|
||||||
|
`}`;
|
||||||
|
`return result;`;
|
||||||
|
`}`;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: CV Leaf
|
//~ rjf: CV Leaf
|
||||||
|
|
||||||
|
|||||||
@@ -449,6 +449,85 @@ case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break;
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal U64
|
||||||
|
cv_header_struct_size_from_sym_kind(CV_SymKind v)
|
||||||
|
{
|
||||||
|
U64 result = 0;
|
||||||
|
switch(v)
|
||||||
|
{
|
||||||
|
default:{}break;
|
||||||
|
case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break;
|
||||||
|
case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break;
|
||||||
|
case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break;
|
||||||
|
case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break;
|
||||||
|
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_THUNK32:{result = sizeof(CV_SymThunk32);}break;
|
||||||
|
case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break;
|
||||||
|
case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break;
|
||||||
|
case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break;
|
||||||
|
case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break;
|
||||||
|
case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break;
|
||||||
|
case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break;
|
||||||
|
case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break;
|
||||||
|
case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break;
|
||||||
|
case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break;
|
||||||
|
case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break;
|
||||||
|
case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break;
|
||||||
|
case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break;
|
||||||
|
case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break;
|
||||||
|
case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break;
|
||||||
|
case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break;
|
||||||
|
case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break;
|
||||||
|
case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break;
|
||||||
|
case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break;
|
||||||
|
case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break;
|
||||||
|
case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break;
|
||||||
|
case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break;
|
||||||
|
case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break;
|
||||||
|
case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break;
|
||||||
|
case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break;
|
||||||
|
case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break;
|
||||||
|
case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break;
|
||||||
|
case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break;
|
||||||
|
case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break;
|
||||||
|
case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break;
|
||||||
|
case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break;
|
||||||
|
case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break;
|
||||||
|
case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break;
|
||||||
|
case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break;
|
||||||
|
case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break;
|
||||||
|
case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break;
|
||||||
|
case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break;
|
||||||
|
case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break;
|
||||||
|
case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break;
|
||||||
|
case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break;
|
||||||
|
case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break;
|
||||||
|
case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break;
|
||||||
|
case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break;
|
||||||
|
case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break;
|
||||||
|
case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break;
|
||||||
|
case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break;
|
||||||
|
case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break;
|
||||||
|
case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break;
|
||||||
|
case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break;
|
||||||
|
case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break;
|
||||||
|
case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break;
|
||||||
|
case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break;
|
||||||
|
case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break;
|
||||||
|
case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break;
|
||||||
|
case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
C_LINKAGE_BEGIN
|
C_LINKAGE_BEGIN
|
||||||
C_LINKAGE_END
|
C_LINKAGE_END
|
||||||
|
|
||||||
|
|||||||
@@ -455,6 +455,7 @@ internal String8 cv_string_from_numeric_kind(CV_NumericKind v);
|
|||||||
internal String8 cv_string_from_arch(CV_Arch v);
|
internal String8 cv_string_from_arch(CV_Arch v);
|
||||||
internal String8 cv_string_from_sym_kind(CV_SymKind v);
|
internal String8 cv_string_from_sym_kind(CV_SymKind v);
|
||||||
internal String8 cv_string_from_leaf_kind(CV_LeafKind v);
|
internal String8 cv_string_from_leaf_kind(CV_LeafKind v);
|
||||||
|
internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);
|
||||||
C_LINKAGE_BEGIN
|
C_LINKAGE_BEGIN
|
||||||
C_LINKAGE_END
|
C_LINKAGE_END
|
||||||
|
|
||||||
|
|||||||
@@ -1940,47 +1940,52 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
|
|
||||||
// extract important values from parameters
|
|
||||||
String8 data = sym->data;
|
String8 data = sym->data;
|
||||||
U64 user_id_base = (((U64)sym_unique_id) << 32);
|
U64 user_id_base = (((U64)sym_unique_id) << 32);
|
||||||
U64 sym_unique_id_hash = raddbgi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id));
|
U64 sym_unique_id_hash = raddbgi_hash((U8*)&sym_unique_id, sizeof(sym_unique_id));
|
||||||
|
|
||||||
// PASS 1: map out data associations
|
//////////////////////////////
|
||||||
|
//- rjf: PASS 1: map out data associations
|
||||||
|
//
|
||||||
ProfScope("map out data associations")
|
ProfScope("map out data associations")
|
||||||
{
|
{
|
||||||
// state variables
|
|
||||||
RADDBGIC_Symbol *current_proc = 0;
|
RADDBGIC_Symbol *current_proc = 0;
|
||||||
|
CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges;
|
||||||
// loop
|
CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count;
|
||||||
CV_RecRange *rec_range = sym->sym_ranges.ranges;
|
for(CV_RecRange *rec_range = rec_ranges_first;
|
||||||
CV_RecRange *opl = rec_range + sym->sym_ranges.count;
|
rec_range < rec_ranges_opl;
|
||||||
for(;rec_range < opl; rec_range += 1)
|
rec_range += 1)
|
||||||
{
|
{
|
||||||
// symbol data range
|
//- rjf: rec range -> symbol info range
|
||||||
U64 opl_off_raw = rec_range->off + rec_range->hdr.size;
|
U64 sym_off_first = rec_range->off + 2;
|
||||||
U64 opl_off = ClampTop(opl_off_raw, data.size);
|
U64 sym_off_opl = rec_range->off + rec_range->hdr.size;
|
||||||
|
|
||||||
U64 off_raw = rec_range->off + 2;
|
//- rjf: skip invalid ranges
|
||||||
U64 off = ClampTop(off_raw, opl_off);
|
if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl)
|
||||||
|
{
|
||||||
U8 *first = data.str + off;
|
continue;
|
||||||
U64 cap = (opl_off - off);
|
}
|
||||||
|
|
||||||
|
//- rjf: unpack symbol info
|
||||||
CV_SymKind kind = rec_range->hdr.kind;
|
CV_SymKind kind = rec_range->hdr.kind;
|
||||||
|
U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);
|
||||||
|
void *sym_header_struct_base = data.str + sym_off_first;
|
||||||
|
|
||||||
|
//- rjf: skip bad sizes
|
||||||
|
if(sym_off_first + sym_header_struct_size > sym_off_opl)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: consume symbol based on kind
|
||||||
switch(kind)
|
switch(kind)
|
||||||
{
|
{
|
||||||
default:{}break;
|
default:{}break;
|
||||||
|
|
||||||
|
//- rjf: FRAMEPROC
|
||||||
case CV_SymKind_FRAMEPROC:
|
case CV_SymKind_FRAMEPROC:
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymFrameproc) > cap)
|
CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base;
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymFrameproc *frameproc = (CV_SymFrameproc*)first;
|
|
||||||
if(current_proc == 0)
|
if(current_proc == 0)
|
||||||
{
|
{
|
||||||
// TODO(allen): error
|
// TODO(allen): error
|
||||||
@@ -1992,13 +1997,13 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
data.flags = frameproc->flags;
|
data.flags = frameproc->flags;
|
||||||
pdbconv_symbol_frame_proc_write(ctx, current_proc, &data);
|
pdbconv_symbol_frame_proc_write(ctx, current_proc, &data);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: LPROC32/GPROC32
|
||||||
case CV_SymKind_LPROC32:
|
case CV_SymKind_LPROC32:
|
||||||
case CV_SymKind_GPROC32:
|
case CV_SymKind_GPROC32:
|
||||||
{
|
{
|
||||||
U64 symbol_id = user_id_base + off;
|
U64 symbol_id = user_id_base + sym_off_first;
|
||||||
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
||||||
current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
current_proc = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
||||||
}break;
|
}break;
|
||||||
@@ -2006,31 +2011,44 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PASS 2: main symbol construction pass
|
//////////////////////////////
|
||||||
|
//- rjf: PASS 2: main symbol construction pass
|
||||||
|
//
|
||||||
ProfScope("main symbol construction pass")
|
ProfScope("main symbol construction pass")
|
||||||
{
|
{
|
||||||
// state variables
|
|
||||||
RADDBGIC_LocationSet *defrange_target = 0;
|
RADDBGIC_LocationSet *defrange_target = 0;
|
||||||
B32 defrange_target_is_param = 0;
|
B32 defrange_target_is_param = 0;
|
||||||
|
|
||||||
// loop
|
|
||||||
CV_RecRange *rec_range = sym->sym_ranges.ranges;
|
|
||||||
CV_RecRange *opl = rec_range + sym->sym_ranges.count;
|
|
||||||
U64 local_num = 1;
|
U64 local_num = 1;
|
||||||
U64 scope_num = 1;
|
U64 scope_num = 1;
|
||||||
for(;rec_range < opl; rec_range += 1)
|
CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges;
|
||||||
|
CV_RecRange *rec_ranges_opl = rec_ranges_first + sym->sym_ranges.count;
|
||||||
|
for(CV_RecRange *rec_range = rec_ranges_first;
|
||||||
|
rec_range < rec_ranges_opl;
|
||||||
|
rec_range += 1)
|
||||||
{
|
{
|
||||||
// symbol data range
|
//- rjf: rec range -> symbol info range
|
||||||
U64 opl_off_raw = rec_range->off + rec_range->hdr.size;
|
U64 sym_off_first = rec_range->off + 2;
|
||||||
U64 opl_off = ClampTop(opl_off_raw, data.size);
|
U64 sym_off_opl = rec_range->off + rec_range->hdr.size;
|
||||||
|
|
||||||
U64 off_raw = rec_range->off + 2;
|
//- rjf: skip invalid ranges
|
||||||
U64 off = ClampTop(off_raw, opl_off);
|
if(sym_off_opl > data.size || sym_off_first > data.size || sym_off_first > sym_off_opl)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
U8 *first = data.str + off;
|
//- rjf: unpack symbol info
|
||||||
U64 cap = (opl_off - off);
|
CV_SymKind kind = rec_range->hdr.kind;
|
||||||
|
U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);
|
||||||
|
void *sym_header_struct_base = data.str + sym_off_first;
|
||||||
|
void *sym_data_opl = data.str + sym_off_opl;
|
||||||
|
|
||||||
// current state
|
//- rjf: skip bad sizes
|
||||||
|
if(sym_off_first + sym_header_struct_size > sym_off_opl)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- rjf: unpack current state
|
||||||
RADDBGIC_Scope *current_scope = pdbconv_symbol_current_scope(ctx);
|
RADDBGIC_Scope *current_scope = pdbconv_symbol_current_scope(ctx);
|
||||||
RADDBGIC_Symbol *current_procedure = 0;
|
RADDBGIC_Symbol *current_procedure = 0;
|
||||||
if(current_scope != 0)
|
if(current_scope != 0)
|
||||||
@@ -2038,48 +2056,28 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
current_procedure = current_scope->symbol;
|
current_procedure = current_scope->symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
CV_SymKind kind = rec_range->hdr.kind;
|
//- rjf: consume symbol based on kind
|
||||||
switch(kind)
|
switch(kind)
|
||||||
{
|
{
|
||||||
default:{}break;
|
default:{}break;
|
||||||
|
|
||||||
|
//- rjf: END
|
||||||
case CV_SymKind_END:
|
case CV_SymKind_END:
|
||||||
//ProfScope("CV_SymKind_END")
|
|
||||||
{
|
{
|
||||||
// pop scope stack
|
|
||||||
pdbconv_symbol_pop_scope(ctx);
|
pdbconv_symbol_pop_scope(ctx);
|
||||||
defrange_target = 0;
|
defrange_target = 0;
|
||||||
defrange_target_is_param = 0;
|
defrange_target_is_param = 0;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case CV_SymKind_FRAMEPROC:
|
//- rjf: BLOCK32
|
||||||
//ProfScope("CV_SymKind_FRAMEPROC")
|
|
||||||
{
|
|
||||||
if(sizeof(CV_SymFrameproc) > cap)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// do nothing (handled in 'association map' pass)
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case CV_SymKind_BLOCK32:
|
case CV_SymKind_BLOCK32:
|
||||||
//ProfScope("CV_SymKind_BLOCK32")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymBlock32) > cap)
|
CV_SymBlock32 *block32 = (CV_SymBlock32*)sym_header_struct_base;
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymBlock32 *block32 = (CV_SymBlock32*)first;
|
|
||||||
|
|
||||||
// scope
|
// scope
|
||||||
U64 scope_id = user_id_base + scope_num;
|
U64 scope_id = user_id_base + scope_num;
|
||||||
U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id);
|
|
||||||
scope_num += 1;
|
scope_num += 1;
|
||||||
|
U64 scope_hash = pdbconv_hash_from_scope_user_id(sym_unique_id_hash, scope_id);
|
||||||
RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash);
|
RADDBGIC_Scope *block_scope = raddbgic_scope_handle_from_user_id(ctx->root, scope_id, scope_hash);
|
||||||
raddbgic_scope_set_parent(ctx->root, block_scope, current_scope);
|
raddbgic_scope_set_parent(ctx->root, block_scope, current_scope);
|
||||||
pdbconv_symbol_push_scope(ctx, block_scope, current_procedure);
|
pdbconv_symbol_push_scope(ctx, block_scope, current_procedure);
|
||||||
@@ -2092,23 +2090,14 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
U64 voff_last = voff_first + block32->len;
|
U64 voff_last = voff_first + block32->len;
|
||||||
raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last);
|
raddbgic_scope_add_voff_range(ctx->root, block_scope, voff_first, voff_last);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: LDATA32/GDATA32
|
||||||
case CV_SymKind_LDATA32:
|
case CV_SymKind_LDATA32:
|
||||||
case CV_SymKind_GDATA32:
|
case CV_SymKind_GDATA32:
|
||||||
//ProfScope("CV_SymKind_LDATA32/CV_SymKind_GDATA32")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymData32) > cap)
|
CV_SymData32 *data32 = (CV_SymData32*)sym_header_struct_base;
|
||||||
{
|
String8 name = str8_cstring_capped(data32+1, sym_data_opl);
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymData32 *data32 = (CV_SymData32*)first;
|
|
||||||
|
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(data32 + 1), first + cap);
|
|
||||||
|
|
||||||
// determine voff
|
// determine voff
|
||||||
COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, data32->sec);
|
COFF_SectionHeader *section = pdbconv_sec_header_from_sec_num(ctx, data32->sec);
|
||||||
@@ -2145,7 +2134,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
B32 is_extern = (kind == CV_SymKind_GDATA32);
|
B32 is_extern = (kind == CV_SymKind_GDATA32);
|
||||||
|
|
||||||
// cons this symbol
|
// cons this symbol
|
||||||
U64 symbol_id = user_id_base + off;
|
U64 symbol_id = user_id_base + sym_off_first;
|
||||||
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
||||||
RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
||||||
|
|
||||||
@@ -2160,25 +2149,14 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
|
|
||||||
raddbgic_symbol_set_info(ctx->root, symbol, &info);
|
raddbgic_symbol_set_info(ctx->root, symbol, &info);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: LPROC32/GPROC32
|
||||||
case CV_SymKind_LPROC32:
|
case CV_SymKind_LPROC32:
|
||||||
case CV_SymKind_GPROC32:
|
case CV_SymKind_GPROC32:
|
||||||
//ProfScope("CV_SymKind_LPROC32/CV_SymKind_GPROC32")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymProc32) > cap)
|
CV_SymProc32 *proc32 = (CV_SymProc32*)sym_header_struct_base;
|
||||||
{
|
String8 name = str8_cstring_capped(proc32+1, sym_data_opl);
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymProc32 *proc32 = (CV_SymProc32*)first;
|
|
||||||
|
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(proc32 + 1), first + cap);
|
|
||||||
|
|
||||||
// type of procedure
|
|
||||||
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype);
|
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, proc32->itype);
|
||||||
|
|
||||||
// container type
|
// container type
|
||||||
@@ -2198,7 +2176,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get this symbol handle
|
// get this symbol handle
|
||||||
U64 symbol_id = user_id_base + off;
|
U64 symbol_id = user_id_base + sym_off_first;
|
||||||
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
||||||
RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
RADDBGIC_Symbol *proc_symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
||||||
|
|
||||||
@@ -2249,27 +2227,16 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
info.root_scope = root_scope;
|
info.root_scope = root_scope;
|
||||||
|
|
||||||
raddbgic_symbol_set_info(ctx->root, proc_symbol, &info);
|
raddbgic_symbol_set_info(ctx->root, proc_symbol, &info);
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: REGREL32
|
||||||
case CV_SymKind_REGREL32:
|
case CV_SymKind_REGREL32:
|
||||||
ProfScope("CV_SymKind_REGREL32")
|
|
||||||
{
|
|
||||||
if(sizeof(CV_SymRegrel32) > cap)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// TODO(allen): hide this when it's redundant with better information
|
// TODO(allen): hide this when it's redundant with better information
|
||||||
// from a CV_SymKind_LOCAL record.
|
// from a CV_SymKind_LOCAL record.
|
||||||
|
|
||||||
CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)first;
|
CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)sym_header_struct_base;
|
||||||
|
String8 name = str8_cstring_capped(regrel32+1, sym_data_opl);
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(regrel32 + 1), first + cap);
|
|
||||||
|
|
||||||
// type of variable
|
|
||||||
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype);
|
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, regrel32->itype);
|
||||||
|
|
||||||
// extract regrel's info
|
// extract regrel's info
|
||||||
@@ -2357,28 +2324,15 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var);
|
RADDBGIC_LocationSet *locset = raddbgic_location_set_from_local(ctx->root, local_var);
|
||||||
raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc);
|
raddbgic_location_set_add_case(ctx->root, locset, 0, max_U64, loc);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: LTHREAD32/GTHREAD32
|
||||||
case CV_SymKind_LTHREAD32:
|
case CV_SymKind_LTHREAD32:
|
||||||
case CV_SymKind_GTHREAD32:
|
case CV_SymKind_GTHREAD32:
|
||||||
//ProfScope("CV_SymKind_LTHREAD32/CV_SymKind_GTHREAD32")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymThread32) > cap)
|
CV_SymThread32 *thread32 = (CV_SymThread32*)sym_header_struct_base;
|
||||||
{
|
String8 name = str8_cstring_capped(thread32+1, sym_data_opl);
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymThread32 *thread32 = (CV_SymThread32*)first;
|
|
||||||
|
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(thread32 + 1), first + cap);
|
|
||||||
|
|
||||||
// determine tls off
|
|
||||||
U32 tls_off = thread32->tls_off;
|
U32 tls_off = thread32->tls_off;
|
||||||
|
|
||||||
// type of variable
|
|
||||||
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype);
|
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, thread32->itype);
|
||||||
|
|
||||||
// container type
|
// container type
|
||||||
@@ -2401,7 +2355,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
B32 is_extern = (kind == CV_SymKind_GTHREAD32);
|
B32 is_extern = (kind == CV_SymKind_GTHREAD32);
|
||||||
|
|
||||||
// setup symbol
|
// setup symbol
|
||||||
U64 symbol_id = user_id_base + off;
|
U64 symbol_id = user_id_base + sym_off_first;
|
||||||
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
U64 symbol_hash = pdbconv_hash_from_symbol_user_id(sym_unique_id_hash, symbol_id);
|
||||||
RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
RADDBGIC_Symbol *symbol = raddbgic_symbol_handle_from_user_id(ctx->root, symbol_id, symbol_hash);
|
||||||
|
|
||||||
@@ -2415,24 +2369,13 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
info.container_symbol = container_symbol;
|
info.container_symbol = container_symbol;
|
||||||
|
|
||||||
raddbgic_symbol_set_info(ctx->root, symbol, &info);
|
raddbgic_symbol_set_info(ctx->root, symbol, &info);
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: LOCAL
|
||||||
case CV_SymKind_LOCAL:
|
case CV_SymKind_LOCAL:
|
||||||
//ProfScope("CV_SymKind_LOCAL")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymLocal) > cap)
|
CV_SymLocal *slocal = (CV_SymLocal*)sym_header_struct_base;
|
||||||
{
|
String8 name = str8_cstring_capped(slocal+1, sym_data_opl);
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymLocal *slocal = (CV_SymLocal*)first;
|
|
||||||
|
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(slocal + 1), first + cap);
|
|
||||||
|
|
||||||
// type of variable
|
|
||||||
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype);
|
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, slocal->itype);
|
||||||
|
|
||||||
// determine how to handle
|
// determine how to handle
|
||||||
@@ -2480,25 +2423,13 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
defrange_target = raddbgic_location_set_from_local(ctx->root, local_var);
|
defrange_target = raddbgic_location_set_from_local(ctx->root, local_var);
|
||||||
defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter);
|
defrange_target_is_param = (local_kind == RADDBGI_LocalKind_Parameter);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: DEFRANGE_REGISTESR
|
||||||
case CV_SymKind_DEFRANGE_REGISTER:
|
case CV_SymKind_DEFRANGE_REGISTER:
|
||||||
//ProfScope("CV_SymKind_DEFRANGE_REGISTER")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymDefrangeRegister) > cap)
|
if(defrange_target == 0) { break; }
|
||||||
{
|
CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base;
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(defrange_target == 0)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first;
|
|
||||||
|
|
||||||
// TODO(allen): offset & size from cv_reg code
|
// TODO(allen): offset & size from cv_reg code
|
||||||
RADDBGI_Arch arch = ctx->arch;
|
RADDBGI_Arch arch = ctx->arch;
|
||||||
@@ -2511,31 +2442,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
// extract range info
|
// extract range info
|
||||||
CV_LvarAddrRange *range = &defrange_register->range;
|
CV_LvarAddrRange *range = &defrange_register->range;
|
||||||
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1);
|
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1);
|
||||||
U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps);
|
U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);
|
||||||
|
|
||||||
// emit locations
|
// emit locations
|
||||||
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
||||||
range, gaps, gap_count);
|
range, gaps, gap_count);
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: DEFRANGE_FRAMEPOINTER_REL
|
||||||
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:
|
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:
|
||||||
//ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymDefrangeFramepointerRel) > cap)
|
if(defrange_target == 0) { break; }
|
||||||
{
|
CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base;
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(defrange_target == 0)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)first;
|
|
||||||
|
|
||||||
// select frame pointer register
|
// select frame pointer register
|
||||||
CV_EncodedFramePtrReg encoded_fp_reg =
|
CV_EncodedFramePtrReg encoded_fp_reg =
|
||||||
@@ -2555,31 +2473,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
// extract range info
|
// extract range info
|
||||||
CV_LvarAddrRange *range = &defrange_fprel->range;
|
CV_LvarAddrRange *range = &defrange_fprel->range;
|
||||||
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1);
|
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1);
|
||||||
U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps);
|
U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);
|
||||||
|
|
||||||
// emit locations
|
// emit locations
|
||||||
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
||||||
range, gaps, gap_count);
|
range, gaps, gap_count);
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: DEFRANGE_SUBFIELD_REGISTER
|
||||||
case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:
|
case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:
|
||||||
//ProfScope("CV_SymKind_DEFRANGE_SUBFIELD_REGISTER")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymDefrangeSubfieldRegister) > cap)
|
if(defrange_target == 0) { break; }
|
||||||
{
|
CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base;
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(defrange_target == 0)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)first;
|
|
||||||
|
|
||||||
// TODO(allen): full "subfield" location system
|
// TODO(allen): full "subfield" location system
|
||||||
if(defrange_subfield_register->field_offset == 0)
|
if(defrange_subfield_register->field_offset == 0)
|
||||||
@@ -2596,33 +2501,20 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
// extract range info
|
// extract range info
|
||||||
CV_LvarAddrRange *range = &defrange_subfield_register->range;
|
CV_LvarAddrRange *range = &defrange_subfield_register->range;
|
||||||
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1);
|
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1);
|
||||||
U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps);
|
U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);
|
||||||
|
|
||||||
// emit locations
|
// emit locations
|
||||||
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
||||||
range, gaps, gap_count);
|
range, gaps, gap_count);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
|
||||||
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
|
case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
|
||||||
//ProfScope("CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE")
|
|
||||||
{
|
|
||||||
if(sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(defrange_target == 0)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
if(defrange_target == 0) { break; }
|
||||||
CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope =
|
CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope =
|
||||||
(CV_SymDefrangeFramepointerRelFullScope*)first;
|
(CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base;
|
||||||
|
|
||||||
// select frame pointer register
|
// select frame pointer register
|
||||||
CV_EncodedFramePtrReg encoded_fp_reg =
|
CV_EncodedFramePtrReg encoded_fp_reg =
|
||||||
@@ -2642,26 +2534,14 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
|
|
||||||
// emit location
|
// emit location
|
||||||
raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location);
|
raddbgic_location_set_add_case(ctx->root, defrange_target, 0, max_U64, location);
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: DEFRANGE_REGISTER_REL
|
||||||
case CV_SymKind_DEFRANGE_REGISTER_REL:
|
case CV_SymKind_DEFRANGE_REGISTER_REL:
|
||||||
//ProfScope("CV_SymKind_DEFRANGE_REGISTER_REL")
|
|
||||||
{
|
|
||||||
if(sizeof(CV_SymDefrangeRegisterRel) > cap)
|
|
||||||
{
|
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)first;
|
|
||||||
if(defrange_target == 0)
|
|
||||||
{
|
|
||||||
// TODO(rjf): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
if(defrange_target == 0) { break; }
|
||||||
|
CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base;
|
||||||
|
|
||||||
// TODO(allen): offset & size from cv_reg code
|
// TODO(allen): offset & size from cv_reg code
|
||||||
RADDBGI_Arch arch = ctx->arch;
|
RADDBGI_Arch arch = ctx->arch;
|
||||||
CV_Reg cv_reg = defrange_register_rel->reg;
|
CV_Reg cv_reg = defrange_register_rel->reg;
|
||||||
@@ -2680,31 +2560,18 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
// extract range info
|
// extract range info
|
||||||
CV_LvarAddrRange *range = &defrange_register_rel->range;
|
CV_LvarAddrRange *range = &defrange_register_rel->range;
|
||||||
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1);
|
CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1);
|
||||||
U64 gap_count = ((first + cap) - (U8*)gaps)/sizeof(*gaps);
|
U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);
|
||||||
|
|
||||||
|
|
||||||
// emit locations
|
// emit locations
|
||||||
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
pdbconv_location_over_lvar_addr_range(ctx, defrange_target, location,
|
||||||
range, gaps, gap_count);
|
range, gaps, gap_count);
|
||||||
}
|
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
//- rjf: FILESTATIC
|
||||||
case CV_SymKind_FILESTATIC:
|
case CV_SymKind_FILESTATIC:
|
||||||
//ProfScope("CV_SymKind_FILESTATIC")
|
|
||||||
{
|
{
|
||||||
if(sizeof(CV_SymFileStatic) > cap)
|
CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base;
|
||||||
{
|
String8 name = str8_cstring_capped(file_static+1, sym_data_opl);
|
||||||
// TODO(allen): error
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CV_SymFileStatic *file_static = (CV_SymFileStatic*)first;
|
|
||||||
|
|
||||||
// name
|
|
||||||
String8 name = str8_cstring_capped((char*)(file_static + 1), first + cap);
|
|
||||||
|
|
||||||
// type of variable
|
|
||||||
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype);
|
RADDBGIC_Type *type = pdbconv_type_resolve_itype(ctx, file_static->itype);
|
||||||
|
|
||||||
// TODO(allen): emit a global modifier symbol
|
// TODO(allen): emit a global modifier symbol
|
||||||
@@ -2712,12 +2579,11 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
// defrange records from this point attach to this location information
|
// defrange records from this point attach to this location information
|
||||||
defrange_target = 0;
|
defrange_target = 0;
|
||||||
defrange_target_is_param = 0;
|
defrange_target_is_param = 0;
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if scope stack isn't empty emit an error
|
//- rjf: non-empty scope stack? -> error
|
||||||
{
|
{
|
||||||
RADDBGIC_Scope *scope = pdbconv_symbol_current_scope(ctx);
|
RADDBGIC_Scope *scope = pdbconv_symbol_current_scope(ctx);
|
||||||
if(scope != 0)
|
if(scope != 0)
|
||||||
@@ -2726,7 +2592,7 @@ pdbconv_symbol_cons(PDBCONV_Ctx *ctx, CV_SymParsed *sym, U32 sym_unique_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear the scope stack
|
//- rjf: clear scope stack
|
||||||
pdbconv_symbol_clear_scope_stack(ctx);
|
pdbconv_symbol_clear_scope_stack(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user