30 Variant VariantFromVARIANT(
const VARIANT &V) {
34 Result.Value.Int8 = V.cVal;
38 Result.Value.Int16 = V.iVal;
42 Result.Value.Int32 = V.intVal;
46 Result.Value.Int64 = V.llVal;
50 Result.Value.UInt8 = V.bVal;
54 Result.Value.UInt16 = V.uiVal;
58 Result.Value.UInt32 = V.uintVal;
62 Result.Value.UInt64 = V.ullVal;
66 Result.Value.Bool = (V.boolVal == VARIANT_TRUE) ?
true :
false;
70 Result.Value.Single = V.fltVal;
74 Result.Value.Double = V.dblVal;
78 const char *SrcBytes =
reinterpret_cast<const char *
>(V.bstrVal);
82 Result.Value.String =
nullptr;
83 Result.Value.String =
new char[Result8.length() + 1];
84 ::strcpy(
Result.Value.String, Result8.c_str());
95 template <
typename ArgType>
97 HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) {
100 return static_cast<ArgType
>(
Value);
105 template <
typename ArgType,
typename RetType>
107 HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) {
110 return static_cast<RetType
>(
Value);
117 HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) {
123 HRESULT (__stdcall IDiaSymbol::*Method)(GUID *)) {
125 if (S_OK != (
Symbol->*Method)(&Result))
129 "GUID is the wrong size!");
131 ::memcpy(&IdResult, &Result,
sizeof(GUID));
135 template <
typename Pr
intType,
typename ArgType>
138 HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) {
146 HRESULT (__stdcall IDiaSymbol::*Method)(
DWORD *),
155 template <
typename ArgType>
158 HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) {
166 HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) {
170 const char *Bytes =
reinterpret_cast<const char *
>(
Value);
175 ::SysFreeString(
Value);
180 HRESULT (__stdcall IDiaSymbol::*Method)(VARIANT *)) {
193 StringRef GuidBytes(
reinterpret_cast<const char *
>(&
G),
sizeof(
G));
201 CComPtr<IDiaSymbol> DiaSymbol)
202 : Session(PDBSession),
Symbol(DiaSymbol) {}
204 #define RAW_ID_METHOD_DUMP(Stream, Method, Session, FieldId, ShowFlags, \
206 DumpDIAIdValue(Stream, Indent, StringRef{#Method}, Symbol, \
207 &IDiaSymbol::get_##Method, Session, FieldId, ShowFlags, \
210 #define RAW_METHOD_DUMP(Stream, Method) \
211 DumpDIAValue(Stream, Indent, StringRef{#Method}, Symbol, \
212 &IDiaSymbol::get_##Method);
214 #define RAW_METHOD_DUMP_AS(Stream, Method, Type) \
215 DumpDIAValueAs<Type>(Stream, Indent, StringRef{#Method}, Symbol, \
216 &IDiaSymbol::get_##Method);
222 ShowIdFields, RecurseIdFields);
241 ShowIdFields, RecurseIdFields);
397 std::unique_ptr<IPDBEnumSymbols>
399 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
401 CComPtr<IDiaEnumSymbols> DiaEnumerator;
403 Symbol->findChildrenEx(EnumVal,
nullptr, nsNone, &DiaEnumerator)) {
404 if (S_OK != Symbol->findChildren(EnumVal,
nullptr, nsNone, &DiaEnumerator))
408 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
411 std::unique_ptr<IPDBEnumSymbols>
417 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
418 DWORD CompareFlags =
static_cast<DWORD>(Flags);
419 wchar_t *Name16Str =
reinterpret_cast<wchar_t *
>(Name16.data());
421 CComPtr<IDiaEnumSymbols> DiaEnumerator;
423 Symbol->findChildrenEx(EnumVal, Name16Str, CompareFlags, &DiaEnumerator))
426 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
429 std::unique_ptr<IPDBEnumSymbols>
436 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
438 DWORD CompareFlags =
static_cast<DWORD>(Flags);
439 wchar_t *Name16Str =
reinterpret_cast<wchar_t *
>(Name16.data());
441 CComPtr<IDiaEnumSymbols> DiaEnumerator;
442 if (S_OK != Symbol->findChildrenExByAddr(EnumVal, Name16Str, CompareFlags,
443 Section, Offset, &DiaEnumerator))
446 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
449 std::unique_ptr<IPDBEnumSymbols>
455 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
457 DWORD CompareFlags =
static_cast<DWORD>(Flags);
458 wchar_t *Name16Str =
reinterpret_cast<wchar_t *
>(Name16.data());
460 CComPtr<IDiaEnumSymbols> DiaEnumerator;
461 if (S_OK != Symbol->findChildrenExByVA(EnumVal, Name16Str, CompareFlags, VA,
465 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
468 std::unique_ptr<IPDBEnumSymbols>
474 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
475 DWORD CompareFlags =
static_cast<DWORD>(Flags);
476 wchar_t *Name16Str =
reinterpret_cast<wchar_t *
>(Name16.data());
478 CComPtr<IDiaEnumSymbols> DiaEnumerator;
479 if (S_OK != Symbol->findChildrenExByRVA(EnumVal, Name16Str, CompareFlags, RVA,
483 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
486 std::unique_ptr<IPDBEnumSymbols>
488 CComPtr<IDiaEnumSymbols> DiaEnumerator;
489 if (S_OK != Symbol->findInlineFramesByAddr(Section, Offset, &DiaEnumerator))
492 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
495 std::unique_ptr<IPDBEnumSymbols>
497 CComPtr<IDiaEnumSymbols> DiaEnumerator;
498 if (S_OK != Symbol->findInlineFramesByRVA(RVA, &DiaEnumerator))
501 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
504 std::unique_ptr<IPDBEnumSymbols>
506 CComPtr<IDiaEnumSymbols> DiaEnumerator;
507 if (S_OK != Symbol->findInlineFramesByVA(VA, &DiaEnumerator))
510 return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
514 CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
515 if (S_OK != Symbol->findInlineeLines(&DiaEnumerator))
518 return std::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
521 std::unique_ptr<IPDBEnumLineNumbers>
524 CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
526 Symbol->findInlineeLinesByAddr(Section, Offset, Length, &DiaEnumerator))
529 return std::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
532 std::unique_ptr<IPDBEnumLineNumbers>
534 CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
535 if (S_OK != Symbol->findInlineeLinesByRVA(RVA, Length, &DiaEnumerator))
538 return std::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
541 std::unique_ptr<IPDBEnumLineNumbers>
543 CComPtr<IDiaEnumLineNumbers> DiaEnumerator;
544 if (S_OK != Symbol->findInlineeLinesByVA(VA, Length, &DiaEnumerator))
547 return std::make_unique<DIAEnumLineNumbers>(DiaEnumerator);
554 Symbol->get_dataBytes(0, &DataSize,
nullptr);
559 Symbol->get_dataBytes(DataSize, &DataSize, bytes.data());
564 if (S_OK != Symbol->get_undecoratedNameEx((
DWORD)Flags, &Result16))
565 return std::string();
567 const char *SrcBytes =
reinterpret_cast<const char *
>(Result16.m_str);
571 return std::string();
576 return PrivateGetDIAValue<DWORD, PDB_MemberAccess>(Symbol,
577 &IDiaSymbol::get_access);
616 return PrivateGetDIAValue<DWORD, PDB_BuiltinType>(Symbol,
617 &IDiaSymbol::get_baseType);
625 return PrivateGetDIAValue<DWORD, PDB_CallingConv>(
626 Symbol, &IDiaSymbol::get_callingConvention);
653 return PrivateGetDIAValue<DWORD, PDB_Lang>(Symbol, &IDiaSymbol::get_language);
666 &IDiaSymbol::get_liveRangeStartAddressOffset);
671 &IDiaSymbol::get_liveRangeStartAddressSection);
676 Symbol, &IDiaSymbol::get_liveRangeStartRelativeVirtualAddress);
680 return PrivateGetDIAValue<DWORD, codeview::RegisterId>(
681 Symbol, &IDiaSymbol::get_localBasePointerRegisterId);
698 &IDiaSymbol::get_numberOfAcceleratorPointerTags);
734 return PrivateGetDIAValue<DWORD, PDB_Cpu>(Symbol, &IDiaSymbol::get_platform);
742 return PrivateGetDIAValue<DWORD, codeview::RegisterId>(
743 Symbol, &IDiaSymbol::get_registerId);
775 CComPtr<IDiaLineNumber> LineNumber;
776 if (FAILED(Symbol->getSrcLineOnTypeDefn(&LineNumber)) || !LineNumber)
779 return std::make_unique<DIALineNumber>(LineNumber);
804 &IDiaSymbol::get_targetRelativeVirtualAddress);
850 if (S_OK != Symbol->get_value(&
Value))
853 return VariantFromVARIANT(
Value);
868 std::unique_ptr<PDBSymbolTypeBuiltin>
870 CComPtr<IDiaSymbol> TableType;
871 if (FAILED(Symbol->get_virtualBaseTableType(&TableType)) || !TableType)
874 auto RawVT = std::make_unique<DIARawSymbol>(Session, TableType);
876 PDBSymbol::createAs<PDBSymbolTypePointer>(Session,
std::move(RawVT));
877 return unique_dyn_cast<PDBSymbolTypeBuiltin>(Pointer->getPointeeType());
881 return PrivateGetDIAValue<DWORD, PDB_DataKind>(Symbol,
882 &IDiaSymbol::get_dataKind);
886 return PrivateGetDIAValue<DWORD, PDB_SymType>(Symbol,
887 &IDiaSymbol::get_symTag);
907 return PrivateGetDIAValue<DWORD, PDB_LocType>(Symbol,
908 &IDiaSymbol::get_locationType);
912 return PrivateGetDIAValue<DWORD, PDB_Machine>(Symbol,
913 &IDiaSymbol::get_machineType);
917 return PrivateGetDIAValue<DWORD, codeview::ThunkOrdinal>(
918 Symbol, &IDiaSymbol::get_thunkOrdinal);
934 return PrivateGetDIAValue<DWORD, PDB_UdtType>(Symbol,
935 &IDiaSymbol::get_udtKind);
1068 &IDiaSymbol::get_isAcceleratorGroupSharedLocal);
1073 &IDiaSymbol::get_isAcceleratorPointerTagLiveRange);
1130 &IDiaSymbol::get_isLocationControlFlowDependent);
1171 &IDiaSymbol::get_isPointerBasedOnSymbolValue);