| //===- DIARawSymbol.cpp - DIA implementation of IPDBRawSymbol ---*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h" | |
| #include "llvm/ADT/ArrayRef.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include "llvm/DebugInfo/CodeView/Formatters.h" | |
| #include "llvm/DebugInfo/PDB/DIA/DIAEnumLineNumbers.h" | |
| #include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h" | |
| #include "llvm/DebugInfo/PDB/DIA/DIALineNumber.h" | |
| #include "llvm/DebugInfo/PDB/DIA/DIASession.h" | |
| #include "llvm/DebugInfo/PDB/PDBExtras.h" | |
| #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h" | |
| #include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h" | |
| #include "llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h" | |
| #include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h" | |
| #include "llvm/Support/ConvertUTF.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| using namespace llvm; | |
| using namespace llvm::pdb; | |
| namespace { | |
| Variant VariantFromVARIANT(const VARIANT &V) { | |
| Variant Result; | |
| switch (V.vt) { | |
| case VT_I1: | |
| Result.Value.Int8 = V.cVal; | |
| Result.Type = PDB_VariantType::Int8; | |
| break; | |
| case VT_I2: | |
| Result.Value.Int16 = V.iVal; | |
| Result.Type = PDB_VariantType::Int16; | |
| break; | |
| case VT_I4: | |
| Result.Value.Int32 = V.intVal; | |
| Result.Type = PDB_VariantType::Int32; | |
| break; | |
| case VT_I8: | |
| Result.Value.Int64 = V.llVal; | |
| Result.Type = PDB_VariantType::Int64; | |
| break; | |
| case VT_UI1: | |
| Result.Value.UInt8 = V.bVal; | |
| Result.Type = PDB_VariantType::UInt8; | |
| break; | |
| case VT_UI2: | |
| Result.Value.UInt16 = V.uiVal; | |
| Result.Type = PDB_VariantType::UInt16; | |
| break; | |
| case VT_UI4: | |
| Result.Value.UInt32 = V.uintVal; | |
| Result.Type = PDB_VariantType::UInt32; | |
| break; | |
| case VT_UI8: | |
| Result.Value.UInt64 = V.ullVal; | |
| Result.Type = PDB_VariantType::UInt64; | |
| break; | |
| case VT_BOOL: | |
| Result.Value.Bool = (V.boolVal == VARIANT_TRUE) ? true : false; | |
| Result.Type = PDB_VariantType::Bool; | |
| break; | |
| case VT_R4: | |
| Result.Value.Single = V.fltVal; | |
| Result.Type = PDB_VariantType::Single; | |
| break; | |
| case VT_R8: | |
| Result.Value.Double = V.dblVal; | |
| Result.Type = PDB_VariantType::Double; | |
| break; | |
| case VT_BSTR: { | |
| const char *SrcBytes = reinterpret_cast<const char *>(V.bstrVal); | |
| llvm::ArrayRef<char> SrcByteArray(SrcBytes, SysStringByteLen(V.bstrVal)); | |
| std::string Result8; | |
| if (!llvm::convertUTF16ToUTF8String(SrcByteArray, Result8)) | |
| Result.Value.String = nullptr; | |
| Result.Value.String = new char[Result8.length() + 1]; | |
| ::strcpy(Result.Value.String, Result8.c_str()); | |
| Result.Type = PDB_VariantType::String; | |
| break; | |
| } | |
| default: | |
| Result.Type = PDB_VariantType::Unknown; | |
| break; | |
| } | |
| return Result; | |
| } | |
| template <typename ArgType> | |
| ArgType PrivateGetDIAValue(IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) { | |
| ArgType Value; | |
| if (S_OK == (Symbol->*Method)(&Value)) | |
| return static_cast<ArgType>(Value); | |
| return ArgType(); | |
| } | |
| template <typename ArgType, typename RetType> | |
| RetType PrivateGetDIAValue(IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) { | |
| ArgType Value; | |
| if (S_OK == (Symbol->*Method)(&Value)) | |
| return static_cast<RetType>(Value); | |
| return RetType(); | |
| } | |
| std::string | |
| PrivateGetDIAValue(IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) { | |
| CComBSTR Result16; | |
| if (S_OK != (Symbol->*Method)(&Result16)) | |
| return std::string(); | |
| const char *SrcBytes = reinterpret_cast<const char *>(Result16.m_str); | |
| llvm::ArrayRef<char> SrcByteArray(SrcBytes, Result16.ByteLength()); | |
| std::string Result8; | |
| if (!llvm::convertUTF16ToUTF8String(SrcByteArray, Result8)) | |
| return std::string(); | |
| return Result8; | |
| } | |
| codeview::GUID | |
| PrivateGetDIAValue(IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(GUID *)) { | |
| GUID Result; | |
| if (S_OK != (Symbol->*Method)(&Result)) | |
| return codeview::GUID(); | |
| static_assert(sizeof(codeview::GUID) == sizeof(GUID), | |
| "GUID is the wrong size!"); | |
| codeview::GUID IdResult; | |
| ::memcpy(&IdResult, &Result, sizeof(GUID)); | |
| return IdResult; | |
| } | |
| template <typename ArgType> | |
| void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name, | |
| IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) { | |
| ArgType Value; | |
| if (S_OK == (Symbol->*Method)(&Value)) { | |
| OS << "\n"; | |
| OS.indent(Indent); | |
| OS << Name << ": " << Value; | |
| } | |
| } | |
| void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name, | |
| IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) { | |
| BSTR Value = nullptr; | |
| if (S_OK != (Symbol->*Method)(&Value)) | |
| return; | |
| const char *Bytes = reinterpret_cast<const char *>(Value); | |
| ArrayRef<char> ByteArray(Bytes, ::SysStringByteLen(Value)); | |
| std::string Result; | |
| if (llvm::convertUTF16ToUTF8String(ByteArray, Result)) { | |
| OS << "\n"; | |
| OS.indent(Indent); | |
| OS << Name << ": " << Result; | |
| } | |
| ::SysFreeString(Value); | |
| } | |
| void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name, | |
| IDiaSymbol *Symbol, | |
| HRESULT (__stdcall IDiaSymbol::*Method)(VARIANT *)) { | |
| VARIANT Value; | |
| Value.vt = VT_EMPTY; | |
| if (S_OK != (Symbol->*Method)(&Value)) | |
| return; | |
| OS << "\n"; | |
| OS.indent(Indent); | |
| Variant V = VariantFromVARIANT(Value); | |
| OS << Name << ": " << V; | |
| } | |
| } | |
| namespace llvm { | |
| llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const GUID &G) { | |
| StringRef GuidBytes(reinterpret_cast<const char *>(&G), sizeof(G)); | |
| codeview::detail::GuidAdapter A(GuidBytes); | |
| A.format(OS, ""); | |
| return OS; | |
| } | |
| } | |
| DIARawSymbol::DIARawSymbol(const DIASession &PDBSession, | |
| CComPtr<IDiaSymbol> DiaSymbol) | |
| : Session(PDBSession), Symbol(DiaSymbol) {} | |
| #define RAW_METHOD_DUMP(Stream, Method) \ | |
| DumpDIAValue(Stream, Indent, StringRef(#Method), Symbol, &IDiaSymbol::Method); | |
| void DIARawSymbol::dump(raw_ostream &OS, int Indent) const { | |
| RAW_METHOD_DUMP(OS, get_access) | |
| RAW_METHOD_DUMP(OS, get_addressOffset) | |
| RAW_METHOD_DUMP(OS, get_addressSection) | |
| RAW_METHOD_DUMP(OS, get_age) | |
| RAW_METHOD_DUMP(OS, get_arrayIndexTypeId) | |
| RAW_METHOD_DUMP(OS, get_backEndMajor) | |
| RAW_METHOD_DUMP(OS, get_backEndMinor) | |
| RAW_METHOD_DUMP(OS, get_backEndBuild) | |
| RAW_METHOD_DUMP(OS, get_backEndQFE) | |
| RAW_METHOD_DUMP(OS, get_baseDataOffset) | |
| RAW_METHOD_DUMP(OS, get_baseDataSlot) | |
| RAW_METHOD_DUMP(OS, get_baseSymbolId) | |
| RAW_METHOD_DUMP(OS, get_baseType) | |
| RAW_METHOD_DUMP(OS, get_bitPosition) | |
| RAW_METHOD_DUMP(OS, get_callingConvention) | |
| RAW_METHOD_DUMP(OS, get_classParentId) | |
| RAW_METHOD_DUMP(OS, get_compilerName) | |
| RAW_METHOD_DUMP(OS, get_count) | |
| RAW_METHOD_DUMP(OS, get_countLiveRanges) | |
| RAW_METHOD_DUMP(OS, get_frontEndMajor) | |
| RAW_METHOD_DUMP(OS, get_frontEndMinor) | |
| RAW_METHOD_DUMP(OS, get_frontEndBuild) | |
| RAW_METHOD_DUMP(OS, get_frontEndQFE) | |
| RAW_METHOD_DUMP(OS, get_lexicalParentId) | |
| RAW_METHOD_DUMP(OS, get_libraryName) | |
| RAW_METHOD_DUMP(OS, get_liveRangeStartAddressOffset) | |
| RAW_METHOD_DUMP(OS, get_liveRangeStartAddressSection) | |
| RAW_METHOD_DUMP(OS, get_liveRangeStartRelativeVirtualAddress) | |
| RAW_METHOD_DUMP(OS, get_localBasePointerRegisterId) | |
| RAW_METHOD_DUMP(OS, get_lowerBoundId) | |
| RAW_METHOD_DUMP(OS, get_memorySpaceKind) | |
| RAW_METHOD_DUMP(OS, get_name) | |
| RAW_METHOD_DUMP(OS, get_numberOfAcceleratorPointerTags) | |
| RAW_METHOD_DUMP(OS, get_numberOfColumns) | |
| RAW_METHOD_DUMP(OS, get_numberOfModifiers) | |
| RAW_METHOD_DUMP(OS, get_numberOfRegisterIndices) | |
| RAW_METHOD_DUMP(OS, get_numberOfRows) | |
| RAW_METHOD_DUMP(OS, get_objectFileName) | |
| RAW_METHOD_DUMP(OS, get_oemId) | |
| RAW_METHOD_DUMP(OS, get_oemSymbolId) | |
| RAW_METHOD_DUMP(OS, get_offsetInUdt) | |
| RAW_METHOD_DUMP(OS, get_platform) | |
| RAW_METHOD_DUMP(OS, get_rank) | |
| RAW_METHOD_DUMP(OS, get_registerId) | |
| RAW_METHOD_DUMP(OS, get_registerType) | |
| RAW_METHOD_DUMP(OS, get_relativeVirtualAddress) | |
| RAW_METHOD_DUMP(OS, get_samplerSlot) | |
| RAW_METHOD_DUMP(OS, get_signature) | |
| RAW_METHOD_DUMP(OS, get_sizeInUdt) | |
| RAW_METHOD_DUMP(OS, get_slot) | |
| RAW_METHOD_DUMP(OS, get_sourceFileName) | |
| RAW_METHOD_DUMP(OS, get_stride) | |
| RAW_METHOD_DUMP(OS, get_subTypeId) | |
| RAW_METHOD_DUMP(OS, get_symbolsFileName) | |
| RAW_METHOD_DUMP(OS, get_symIndexId) | |
| RAW_METHOD_DUMP(OS, get_targetOffset) | |
| RAW_METHOD_DUMP(OS, get_targetRelativeVirtualAddress) | |
| RAW_METHOD_DUMP(OS, get_targetVirtualAddress) | |
| RAW_METHOD_DUMP(OS, get_targetSection) | |
| RAW_METHOD_DUMP(OS, get_textureSlot) | |
| RAW_METHOD_DUMP(OS, get_timeStamp) | |
| RAW_METHOD_DUMP(OS, get_token) | |
| RAW_METHOD_DUMP(OS, get_typeId) | |
| RAW_METHOD_DUMP(OS, get_uavSlot) | |
| RAW_METHOD_DUMP(OS, get_undecoratedName) | |
| RAW_METHOD_DUMP(OS, get_unmodifiedTypeId) | |
| RAW_METHOD_DUMP(OS, get_upperBoundId) | |
| RAW_METHOD_DUMP(OS, get_virtualBaseDispIndex) | |
| RAW_METHOD_DUMP(OS, get_virtualBaseOffset) | |
| RAW_METHOD_DUMP(OS, get_virtualTableShapeId) | |
| RAW_METHOD_DUMP(OS, get_dataKind) | |
| RAW_METHOD_DUMP(OS, get_symTag) | |
| RAW_METHOD_DUMP(OS, get_guid) | |
| RAW_METHOD_DUMP(OS, get_offset) | |
| RAW_METHOD_DUMP(OS, get_thisAdjust) | |
| RAW_METHOD_DUMP(OS, get_virtualBasePointerOffset) | |
| RAW_METHOD_DUMP(OS, get_locationType) | |
| RAW_METHOD_DUMP(OS, get_machineType) | |
| RAW_METHOD_DUMP(OS, get_thunkOrdinal) | |
| RAW_METHOD_DUMP(OS, get_length) | |
| RAW_METHOD_DUMP(OS, get_liveRangeLength) | |
| RAW_METHOD_DUMP(OS, get_virtualAddress) | |
| RAW_METHOD_DUMP(OS, get_udtKind) | |
| RAW_METHOD_DUMP(OS, get_constructor) | |
| RAW_METHOD_DUMP(OS, get_customCallingConvention) | |
| RAW_METHOD_DUMP(OS, get_farReturn) | |
| RAW_METHOD_DUMP(OS, get_code) | |
| RAW_METHOD_DUMP(OS, get_compilerGenerated) | |
| RAW_METHOD_DUMP(OS, get_constType) | |
| RAW_METHOD_DUMP(OS, get_editAndContinueEnabled) | |
| RAW_METHOD_DUMP(OS, get_function) | |
| RAW_METHOD_DUMP(OS, get_stride) | |
| RAW_METHOD_DUMP(OS, get_noStackOrdering) | |
| RAW_METHOD_DUMP(OS, get_hasAlloca) | |
| RAW_METHOD_DUMP(OS, get_hasAssignmentOperator) | |
| RAW_METHOD_DUMP(OS, get_isCTypes) | |
| RAW_METHOD_DUMP(OS, get_hasCastOperator) | |
| RAW_METHOD_DUMP(OS, get_hasDebugInfo) | |
| RAW_METHOD_DUMP(OS, get_hasEH) | |
| RAW_METHOD_DUMP(OS, get_hasEHa) | |
| RAW_METHOD_DUMP(OS, get_hasInlAsm) | |
| RAW_METHOD_DUMP(OS, get_framePointerPresent) | |
| RAW_METHOD_DUMP(OS, get_inlSpec) | |
| RAW_METHOD_DUMP(OS, get_interruptReturn) | |
| RAW_METHOD_DUMP(OS, get_hasLongJump) | |
| RAW_METHOD_DUMP(OS, get_hasManagedCode) | |
| RAW_METHOD_DUMP(OS, get_hasNestedTypes) | |
| RAW_METHOD_DUMP(OS, get_noInline) | |
| RAW_METHOD_DUMP(OS, get_noReturn) | |
| RAW_METHOD_DUMP(OS, get_optimizedCodeDebugInfo) | |
| RAW_METHOD_DUMP(OS, get_overloadedOperator) | |
| RAW_METHOD_DUMP(OS, get_hasSEH) | |
| RAW_METHOD_DUMP(OS, get_hasSecurityChecks) | |
| RAW_METHOD_DUMP(OS, get_hasSetJump) | |
| RAW_METHOD_DUMP(OS, get_strictGSCheck) | |
| RAW_METHOD_DUMP(OS, get_isAcceleratorGroupSharedLocal) | |
| RAW_METHOD_DUMP(OS, get_isAcceleratorPointerTagLiveRange) | |
| RAW_METHOD_DUMP(OS, get_isAcceleratorStubFunction) | |
| RAW_METHOD_DUMP(OS, get_isAggregated) | |
| RAW_METHOD_DUMP(OS, get_intro) | |
| RAW_METHOD_DUMP(OS, get_isCVTCIL) | |
| RAW_METHOD_DUMP(OS, get_isConstructorVirtualBase) | |
| RAW_METHOD_DUMP(OS, get_isCxxReturnUdt) | |
| RAW_METHOD_DUMP(OS, get_isDataAligned) | |
| RAW_METHOD_DUMP(OS, get_isHLSLData) | |
| RAW_METHOD_DUMP(OS, get_isHotpatchable) | |
| RAW_METHOD_DUMP(OS, get_indirectVirtualBaseClass) | |
| RAW_METHOD_DUMP(OS, get_isInterfaceUdt) | |
| RAW_METHOD_DUMP(OS, get_intrinsic) | |
| RAW_METHOD_DUMP(OS, get_isLTCG) | |
| RAW_METHOD_DUMP(OS, get_isLocationControlFlowDependent) | |
| RAW_METHOD_DUMP(OS, get_isMSILNetmodule) | |
| RAW_METHOD_DUMP(OS, get_isMatrixRowMajor) | |
| RAW_METHOD_DUMP(OS, get_managed) | |
| RAW_METHOD_DUMP(OS, get_msil) | |
| RAW_METHOD_DUMP(OS, get_isMultipleInheritance) | |
| RAW_METHOD_DUMP(OS, get_isNaked) | |
| RAW_METHOD_DUMP(OS, get_nested) | |
| RAW_METHOD_DUMP(OS, get_isOptimizedAway) | |
| RAW_METHOD_DUMP(OS, get_packed) | |
| RAW_METHOD_DUMP(OS, get_isPointerBasedOnSymbolValue) | |
| RAW_METHOD_DUMP(OS, get_isPointerToDataMember) | |
| RAW_METHOD_DUMP(OS, get_isPointerToMemberFunction) | |
| RAW_METHOD_DUMP(OS, get_pure) | |
| RAW_METHOD_DUMP(OS, get_RValueReference) | |
| RAW_METHOD_DUMP(OS, get_isRefUdt) | |
| RAW_METHOD_DUMP(OS, get_reference) | |
| RAW_METHOD_DUMP(OS, get_restrictedType) | |
| RAW_METHOD_DUMP(OS, get_isReturnValue) | |
| RAW_METHOD_DUMP(OS, get_isSafeBuffers) | |
| RAW_METHOD_DUMP(OS, get_scoped) | |
| RAW_METHOD_DUMP(OS, get_isSdl) | |
| RAW_METHOD_DUMP(OS, get_isSingleInheritance) | |
| RAW_METHOD_DUMP(OS, get_isSplitted) | |
| RAW_METHOD_DUMP(OS, get_isStatic) | |
| RAW_METHOD_DUMP(OS, get_isStripped) | |
| RAW_METHOD_DUMP(OS, get_unalignedType) | |
| RAW_METHOD_DUMP(OS, get_notReached) | |
| RAW_METHOD_DUMP(OS, get_isValueUdt) | |
| RAW_METHOD_DUMP(OS, get_virtual) | |
| RAW_METHOD_DUMP(OS, get_virtualBaseClass) | |
| RAW_METHOD_DUMP(OS, get_isVirtualInheritance) | |
| RAW_METHOD_DUMP(OS, get_volatileType) | |
| RAW_METHOD_DUMP(OS, get_wasInlined) | |
| RAW_METHOD_DUMP(OS, get_unused) | |
| RAW_METHOD_DUMP(OS, get_value) | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findChildren(PDB_SymType Type) const { | |
| enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type); | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != | |
| Symbol->findChildrenEx(EnumVal, nullptr, nsNone, &DiaEnumerator)) { | |
| if (S_OK != Symbol->findChildren(EnumVal, nullptr, nsNone, &DiaEnumerator)) | |
| return nullptr; | |
| } | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findChildren(PDB_SymType Type, StringRef Name, | |
| PDB_NameSearchFlags Flags) const { | |
| llvm::SmallVector<UTF16, 32> Name16; | |
| llvm::convertUTF8ToUTF16String(Name, Name16); | |
| enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type); | |
| DWORD CompareFlags = static_cast<DWORD>(Flags); | |
| wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data()); | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != | |
| Symbol->findChildrenEx(EnumVal, Name16Str, CompareFlags, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findChildrenByAddr(PDB_SymType Type, StringRef Name, | |
| PDB_NameSearchFlags Flags, uint32_t Section, | |
| uint32_t Offset) const { | |
| llvm::SmallVector<UTF16, 32> Name16; | |
| llvm::convertUTF8ToUTF16String(Name, Name16); | |
| enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type); | |
| DWORD CompareFlags = static_cast<DWORD>(Flags); | |
| wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data()); | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != | |
| Symbol->findChildrenExByAddr(EnumVal, Name16Str, CompareFlags, Section, | |
| Offset, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findChildrenByVA(PDB_SymType Type, StringRef Name, | |
| PDB_NameSearchFlags Flags, uint64_t VA) const { | |
| llvm::SmallVector<UTF16, 32> Name16; | |
| llvm::convertUTF8ToUTF16String(Name, Name16); | |
| enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type); | |
| DWORD CompareFlags = static_cast<DWORD>(Flags); | |
| wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data()); | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != | |
| Symbol->findChildrenExByVA(EnumVal, Name16Str, CompareFlags, VA, | |
| &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findChildrenByRVA(PDB_SymType Type, StringRef Name, | |
| PDB_NameSearchFlags Flags, uint32_t RVA) const { | |
| llvm::SmallVector<UTF16, 32> Name16; | |
| llvm::convertUTF8ToUTF16String(Name, Name16); | |
| enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type); | |
| DWORD CompareFlags = static_cast<DWORD>(Flags); | |
| wchar_t *Name16Str = reinterpret_cast<wchar_t *>(Name16.data()); | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != | |
| Symbol->findChildrenExByRVA(EnumVal, Name16Str, CompareFlags, RVA, | |
| &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const { | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineFramesByAddr(Section, Offset, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findInlineFramesByRVA(uint32_t RVA) const { | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineFramesByRVA(RVA, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumSymbols> | |
| DIARawSymbol::findInlineFramesByVA(uint64_t VA) const { | |
| CComPtr<IDiaEnumSymbols> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineFramesByVA(VA, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumSymbols>(Session, DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumLineNumbers> DIARawSymbol::findInlineeLines() const { | |
| CComPtr<IDiaEnumLineNumbers> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineeLines(&DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumLineNumbers> | |
| DIARawSymbol::findInlineeLinesByAddr(uint32_t Section, uint32_t Offset, | |
| uint32_t Length) const { | |
| CComPtr<IDiaEnumLineNumbers> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineeLinesByAddr(Section, Offset, Length, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumLineNumbers> | |
| DIARawSymbol::findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const { | |
| CComPtr<IDiaEnumLineNumbers> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineeLinesByRVA(RVA, Length, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator); | |
| } | |
| std::unique_ptr<IPDBEnumLineNumbers> | |
| DIARawSymbol::findInlineeLinesByVA(uint64_t VA, uint32_t Length) const { | |
| CComPtr<IDiaEnumLineNumbers> DiaEnumerator; | |
| if (S_OK != Symbol->findInlineeLinesByVA(VA, Length, &DiaEnumerator)) | |
| return nullptr; | |
| return llvm::make_unique<DIAEnumLineNumbers>(DiaEnumerator); | |
| } | |
| void DIARawSymbol::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const { | |
| bytes.clear(); | |
| DWORD DataSize = 0; | |
| Symbol->get_dataBytes(0, &DataSize, nullptr); | |
| if (DataSize == 0) | |
| return; | |
| bytes.resize(DataSize); | |
| Symbol->get_dataBytes(DataSize, &DataSize, bytes.data()); | |
| } | |
| std::string | |
| DIARawSymbol::getUndecoratedNameEx(PDB_UndnameFlags Flags) const { | |
| CComBSTR Result16; | |
| if (S_OK != Symbol->get_undecoratedNameEx((DWORD)Flags, &Result16)) | |
| return std::string(); | |
| const char *SrcBytes = reinterpret_cast<const char *>(Result16.m_str); | |
| llvm::ArrayRef<char> SrcByteArray(SrcBytes, Result16.ByteLength()); | |
| std::string Result8; | |
| if (!llvm::convertUTF16ToUTF8String(SrcByteArray, Result8)) | |
| return std::string(); | |
| return Result8; | |
| } | |
| PDB_MemberAccess DIARawSymbol::getAccess() const { | |
| return PrivateGetDIAValue<DWORD, PDB_MemberAccess>(Symbol, | |
| &IDiaSymbol::get_access); | |
| } | |
| uint32_t DIARawSymbol::getAddressOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_addressOffset); | |
| } | |
| uint32_t DIARawSymbol::getAddressSection() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_addressSection); | |
| } | |
| uint32_t DIARawSymbol::getAge() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_age); | |
| } | |
| uint32_t DIARawSymbol::getArrayIndexTypeId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_arrayIndexTypeId); | |
| } | |
| void DIARawSymbol::getBackEndVersion(VersionInfo &Version) const { | |
| Version.Major = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_backEndMajor); | |
| Version.Minor = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_backEndMinor); | |
| Version.Build = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_backEndBuild); | |
| Version.QFE = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_backEndQFE); | |
| } | |
| uint32_t DIARawSymbol::getBaseDataOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_baseDataOffset); | |
| } | |
| uint32_t DIARawSymbol::getBaseDataSlot() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_baseDataSlot); | |
| } | |
| uint32_t DIARawSymbol::getBaseSymbolId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_baseSymbolId); | |
| } | |
| PDB_BuiltinType DIARawSymbol::getBuiltinType() const { | |
| return PrivateGetDIAValue<DWORD, PDB_BuiltinType>(Symbol, | |
| &IDiaSymbol::get_baseType); | |
| } | |
| uint32_t DIARawSymbol::getBitPosition() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_bitPosition); | |
| } | |
| PDB_CallingConv DIARawSymbol::getCallingConvention() const { | |
| return PrivateGetDIAValue<DWORD, PDB_CallingConv>( | |
| Symbol, &IDiaSymbol::get_callingConvention); | |
| } | |
| uint32_t DIARawSymbol::getClassParentId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_classParentId); | |
| } | |
| std::string DIARawSymbol::getCompilerName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_compilerName); | |
| } | |
| uint32_t DIARawSymbol::getCount() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_count); | |
| } | |
| uint32_t DIARawSymbol::getCountLiveRanges() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_countLiveRanges); | |
| } | |
| void DIARawSymbol::getFrontEndVersion(VersionInfo &Version) const { | |
| Version.Major = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_frontEndMajor); | |
| Version.Minor = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_frontEndMinor); | |
| Version.Build = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_frontEndBuild); | |
| Version.QFE = PrivateGetDIAValue(Symbol, &IDiaSymbol::get_frontEndQFE); | |
| } | |
| PDB_Lang DIARawSymbol::getLanguage() const { | |
| return PrivateGetDIAValue<DWORD, PDB_Lang>(Symbol, &IDiaSymbol::get_language); | |
| } | |
| uint32_t DIARawSymbol::getLexicalParentId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_lexicalParentId); | |
| } | |
| std::string DIARawSymbol::getLibraryName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_libraryName); | |
| } | |
| uint32_t DIARawSymbol::getLiveRangeStartAddressOffset() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_liveRangeStartAddressOffset); | |
| } | |
| uint32_t DIARawSymbol::getLiveRangeStartAddressSection() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_liveRangeStartAddressSection); | |
| } | |
| uint32_t DIARawSymbol::getLiveRangeStartRelativeVirtualAddress() const { | |
| return PrivateGetDIAValue( | |
| Symbol, &IDiaSymbol::get_liveRangeStartRelativeVirtualAddress); | |
| } | |
| codeview::RegisterId DIARawSymbol::getLocalBasePointerRegisterId() const { | |
| return PrivateGetDIAValue<DWORD, codeview::RegisterId>( | |
| Symbol, &IDiaSymbol::get_localBasePointerRegisterId); | |
| } | |
| uint32_t DIARawSymbol::getLowerBoundId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_lowerBoundId); | |
| } | |
| uint32_t DIARawSymbol::getMemorySpaceKind() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_memorySpaceKind); | |
| } | |
| std::string DIARawSymbol::getName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_name); | |
| } | |
| uint32_t DIARawSymbol::getNumberOfAcceleratorPointerTags() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_numberOfAcceleratorPointerTags); | |
| } | |
| uint32_t DIARawSymbol::getNumberOfColumns() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_numberOfColumns); | |
| } | |
| uint32_t DIARawSymbol::getNumberOfModifiers() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_numberOfModifiers); | |
| } | |
| uint32_t DIARawSymbol::getNumberOfRegisterIndices() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_numberOfRegisterIndices); | |
| } | |
| uint32_t DIARawSymbol::getNumberOfRows() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_numberOfRows); | |
| } | |
| std::string DIARawSymbol::getObjectFileName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_objectFileName); | |
| } | |
| uint32_t DIARawSymbol::getOemId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_oemId); | |
| } | |
| uint32_t DIARawSymbol::getOemSymbolId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_oemSymbolId); | |
| } | |
| uint32_t DIARawSymbol::getOffsetInUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_offsetInUdt); | |
| } | |
| PDB_Cpu DIARawSymbol::getPlatform() const { | |
| return PrivateGetDIAValue<DWORD, PDB_Cpu>(Symbol, &IDiaSymbol::get_platform); | |
| } | |
| uint32_t DIARawSymbol::getRank() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_rank); | |
| } | |
| codeview::RegisterId DIARawSymbol::getRegisterId() const { | |
| return PrivateGetDIAValue<DWORD, codeview::RegisterId>( | |
| Symbol, &IDiaSymbol::get_registerId); | |
| } | |
| uint32_t DIARawSymbol::getRegisterType() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_registerType); | |
| } | |
| uint32_t DIARawSymbol::getRelativeVirtualAddress() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_relativeVirtualAddress); | |
| } | |
| uint32_t DIARawSymbol::getSamplerSlot() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_samplerSlot); | |
| } | |
| uint32_t DIARawSymbol::getSignature() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_signature); | |
| } | |
| uint32_t DIARawSymbol::getSizeInUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_sizeInUdt); | |
| } | |
| uint32_t DIARawSymbol::getSlot() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_slot); | |
| } | |
| std::string DIARawSymbol::getSourceFileName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_sourceFileName); | |
| } | |
| std::unique_ptr<IPDBLineNumber> | |
| DIARawSymbol::getSrcLineOnTypeDefn() const { | |
| CComPtr<IDiaLineNumber> LineNumber; | |
| if (FAILED(Symbol->getSrcLineOnTypeDefn(&LineNumber)) || !LineNumber) | |
| return nullptr; | |
| return llvm::make_unique<DIALineNumber>(LineNumber); | |
| } | |
| uint32_t DIARawSymbol::getStride() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_stride); | |
| } | |
| uint32_t DIARawSymbol::getSubTypeId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_subTypeId); | |
| } | |
| std::string DIARawSymbol::getSymbolsFileName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_symbolsFileName); | |
| } | |
| uint32_t DIARawSymbol::getSymIndexId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_symIndexId); | |
| } | |
| uint32_t DIARawSymbol::getTargetOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_targetOffset); | |
| } | |
| uint32_t DIARawSymbol::getTargetRelativeVirtualAddress() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_targetRelativeVirtualAddress); | |
| } | |
| uint64_t DIARawSymbol::getTargetVirtualAddress() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_targetVirtualAddress); | |
| } | |
| uint32_t DIARawSymbol::getTargetSection() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_targetSection); | |
| } | |
| uint32_t DIARawSymbol::getTextureSlot() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_textureSlot); | |
| } | |
| uint32_t DIARawSymbol::getTimeStamp() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_timeStamp); | |
| } | |
| uint32_t DIARawSymbol::getToken() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_token); | |
| } | |
| uint32_t DIARawSymbol::getTypeId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_typeId); | |
| } | |
| uint32_t DIARawSymbol::getUavSlot() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_uavSlot); | |
| } | |
| std::string DIARawSymbol::getUndecoratedName() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_undecoratedName); | |
| } | |
| uint32_t DIARawSymbol::getUnmodifiedTypeId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_unmodifiedTypeId); | |
| } | |
| uint32_t DIARawSymbol::getUpperBoundId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_upperBoundId); | |
| } | |
| Variant DIARawSymbol::getValue() const { | |
| VARIANT Value; | |
| Value.vt = VT_EMPTY; | |
| if (S_OK != Symbol->get_value(&Value)) | |
| return Variant(); | |
| return VariantFromVARIANT(Value); | |
| } | |
| uint32_t DIARawSymbol::getVirtualBaseDispIndex() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualBaseDispIndex); | |
| } | |
| uint32_t DIARawSymbol::getVirtualBaseOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualBaseOffset); | |
| } | |
| uint32_t DIARawSymbol::getVirtualTableShapeId() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualTableShapeId); | |
| } | |
| std::unique_ptr<PDBSymbolTypeBuiltin> | |
| DIARawSymbol::getVirtualBaseTableType() const { | |
| CComPtr<IDiaSymbol> TableType; | |
| if (FAILED(Symbol->get_virtualBaseTableType(&TableType)) || !TableType) | |
| return nullptr; | |
| auto RawVT = llvm::make_unique<DIARawSymbol>(Session, TableType); | |
| auto Pointer = | |
| llvm::make_unique<PDBSymbolTypePointer>(Session, std::move(RawVT)); | |
| return unique_dyn_cast<PDBSymbolTypeBuiltin>(Pointer->getPointeeType()); | |
| } | |
| PDB_DataKind DIARawSymbol::getDataKind() const { | |
| return PrivateGetDIAValue<DWORD, PDB_DataKind>(Symbol, | |
| &IDiaSymbol::get_dataKind); | |
| } | |
| PDB_SymType DIARawSymbol::getSymTag() const { | |
| return PrivateGetDIAValue<DWORD, PDB_SymType>(Symbol, | |
| &IDiaSymbol::get_symTag); | |
| } | |
| codeview::GUID DIARawSymbol::getGuid() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_guid); | |
| } | |
| int32_t DIARawSymbol::getOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_offset); | |
| } | |
| int32_t DIARawSymbol::getThisAdjust() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_thisAdjust); | |
| } | |
| int32_t DIARawSymbol::getVirtualBasePointerOffset() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualBasePointerOffset); | |
| } | |
| PDB_LocType DIARawSymbol::getLocationType() const { | |
| return PrivateGetDIAValue<DWORD, PDB_LocType>(Symbol, | |
| &IDiaSymbol::get_locationType); | |
| } | |
| PDB_Machine DIARawSymbol::getMachineType() const { | |
| return PrivateGetDIAValue<DWORD, PDB_Machine>(Symbol, | |
| &IDiaSymbol::get_machineType); | |
| } | |
| codeview::ThunkOrdinal DIARawSymbol::getThunkOrdinal() const { | |
| return PrivateGetDIAValue<DWORD, codeview::ThunkOrdinal>( | |
| Symbol, &IDiaSymbol::get_thunkOrdinal); | |
| } | |
| uint64_t DIARawSymbol::getLength() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_length); | |
| } | |
| uint64_t DIARawSymbol::getLiveRangeLength() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_liveRangeLength); | |
| } | |
| uint64_t DIARawSymbol::getVirtualAddress() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualAddress); | |
| } | |
| PDB_UdtType DIARawSymbol::getUdtKind() const { | |
| return PrivateGetDIAValue<DWORD, PDB_UdtType>(Symbol, | |
| &IDiaSymbol::get_udtKind); | |
| } | |
| bool DIARawSymbol::hasConstructor() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_constructor); | |
| } | |
| bool DIARawSymbol::hasCustomCallingConvention() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_customCallingConvention); | |
| } | |
| bool DIARawSymbol::hasFarReturn() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_farReturn); | |
| } | |
| bool DIARawSymbol::isCode() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_code); | |
| } | |
| bool DIARawSymbol::isCompilerGenerated() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_compilerGenerated); | |
| } | |
| bool DIARawSymbol::isConstType() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_constType); | |
| } | |
| bool DIARawSymbol::isEditAndContinueEnabled() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_editAndContinueEnabled); | |
| } | |
| bool DIARawSymbol::isFunction() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_function); | |
| } | |
| bool DIARawSymbol::getAddressTaken() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_addressTaken); | |
| } | |
| bool DIARawSymbol::getNoStackOrdering() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_noStackOrdering); | |
| } | |
| bool DIARawSymbol::hasAlloca() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasAlloca); | |
| } | |
| bool DIARawSymbol::hasAssignmentOperator() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasAssignmentOperator); | |
| } | |
| bool DIARawSymbol::hasCTypes() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isCTypes); | |
| } | |
| bool DIARawSymbol::hasCastOperator() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasCastOperator); | |
| } | |
| bool DIARawSymbol::hasDebugInfo() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasDebugInfo); | |
| } | |
| bool DIARawSymbol::hasEH() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasEH); | |
| } | |
| bool DIARawSymbol::hasEHa() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasEHa); | |
| } | |
| bool DIARawSymbol::hasInlAsm() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasInlAsm); | |
| } | |
| bool DIARawSymbol::hasInlineAttribute() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_inlSpec); | |
| } | |
| bool DIARawSymbol::hasInterruptReturn() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_interruptReturn); | |
| } | |
| bool DIARawSymbol::hasFramePointer() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_framePointerPresent); | |
| } | |
| bool DIARawSymbol::hasLongJump() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasLongJump); | |
| } | |
| bool DIARawSymbol::hasManagedCode() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasManagedCode); | |
| } | |
| bool DIARawSymbol::hasNestedTypes() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasNestedTypes); | |
| } | |
| bool DIARawSymbol::hasNoInlineAttribute() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_noInline); | |
| } | |
| bool DIARawSymbol::hasNoReturnAttribute() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_noReturn); | |
| } | |
| bool DIARawSymbol::hasOptimizedCodeDebugInfo() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_optimizedCodeDebugInfo); | |
| } | |
| bool DIARawSymbol::hasOverloadedOperator() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_overloadedOperator); | |
| } | |
| bool DIARawSymbol::hasSEH() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasSEH); | |
| } | |
| bool DIARawSymbol::hasSecurityChecks() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasSecurityChecks); | |
| } | |
| bool DIARawSymbol::hasSetJump() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasSetJump); | |
| } | |
| bool DIARawSymbol::hasStrictGSCheck() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_strictGSCheck); | |
| } | |
| bool DIARawSymbol::isAcceleratorGroupSharedLocal() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_isAcceleratorGroupSharedLocal); | |
| } | |
| bool DIARawSymbol::isAcceleratorPointerTagLiveRange() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_isAcceleratorPointerTagLiveRange); | |
| } | |
| bool DIARawSymbol::isAcceleratorStubFunction() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isAcceleratorStubFunction); | |
| } | |
| bool DIARawSymbol::isAggregated() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isAggregated); | |
| } | |
| bool DIARawSymbol::isIntroVirtualFunction() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_intro); | |
| } | |
| bool DIARawSymbol::isCVTCIL() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isCVTCIL); | |
| } | |
| bool DIARawSymbol::isConstructorVirtualBase() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isConstructorVirtualBase); | |
| } | |
| bool DIARawSymbol::isCxxReturnUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isCxxReturnUdt); | |
| } | |
| bool DIARawSymbol::isDataAligned() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isDataAligned); | |
| } | |
| bool DIARawSymbol::isHLSLData() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isHLSLData); | |
| } | |
| bool DIARawSymbol::isHotpatchable() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isHotpatchable); | |
| } | |
| bool DIARawSymbol::isIndirectVirtualBaseClass() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_indirectVirtualBaseClass); | |
| } | |
| bool DIARawSymbol::isInterfaceUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isInterfaceUdt); | |
| } | |
| bool DIARawSymbol::isIntrinsic() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_intrinsic); | |
| } | |
| bool DIARawSymbol::isLTCG() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isLTCG); | |
| } | |
| bool DIARawSymbol::isLocationControlFlowDependent() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_isLocationControlFlowDependent); | |
| } | |
| bool DIARawSymbol::isMSILNetmodule() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isMSILNetmodule); | |
| } | |
| bool DIARawSymbol::isMatrixRowMajor() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isMatrixRowMajor); | |
| } | |
| bool DIARawSymbol::isManagedCode() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_managed); | |
| } | |
| bool DIARawSymbol::isMSILCode() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_msil); | |
| } | |
| bool DIARawSymbol::isMultipleInheritance() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isMultipleInheritance); | |
| } | |
| bool DIARawSymbol::isNaked() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isNaked); | |
| } | |
| bool DIARawSymbol::isNested() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_nested); | |
| } | |
| bool DIARawSymbol::isOptimizedAway() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isOptimizedAway); | |
| } | |
| bool DIARawSymbol::isPacked() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_packed); | |
| } | |
| bool DIARawSymbol::isPointerBasedOnSymbolValue() const { | |
| return PrivateGetDIAValue(Symbol, | |
| &IDiaSymbol::get_isPointerBasedOnSymbolValue); | |
| } | |
| bool DIARawSymbol::isPointerToDataMember() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isPointerToDataMember); | |
| } | |
| bool DIARawSymbol::isPointerToMemberFunction() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isPointerToMemberFunction); | |
| } | |
| bool DIARawSymbol::isPureVirtual() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_pure); | |
| } | |
| bool DIARawSymbol::isRValueReference() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_RValueReference); | |
| } | |
| bool DIARawSymbol::isRefUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isRefUdt); | |
| } | |
| bool DIARawSymbol::isReference() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_reference); | |
| } | |
| bool DIARawSymbol::isRestrictedType() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_restrictedType); | |
| } | |
| bool DIARawSymbol::isReturnValue() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isReturnValue); | |
| } | |
| bool DIARawSymbol::isSafeBuffers() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isSafeBuffers); | |
| } | |
| bool DIARawSymbol::isScoped() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_scoped); | |
| } | |
| bool DIARawSymbol::isSdl() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isSdl); | |
| } | |
| bool DIARawSymbol::isSingleInheritance() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isSingleInheritance); | |
| } | |
| bool DIARawSymbol::isSplitted() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isSplitted); | |
| } | |
| bool DIARawSymbol::isStatic() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isStatic); | |
| } | |
| bool DIARawSymbol::hasPrivateSymbols() const { | |
| // hasPrivateSymbols is the opposite of isStripped, but we expose | |
| // hasPrivateSymbols as a more intuitive interface. | |
| return !PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isStripped); | |
| } | |
| bool DIARawSymbol::isUnalignedType() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_unalignedType); | |
| } | |
| bool DIARawSymbol::isUnreached() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_notReached); | |
| } | |
| bool DIARawSymbol::isValueUdt() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isValueUdt); | |
| } | |
| bool DIARawSymbol::isVirtual() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtual); | |
| } | |
| bool DIARawSymbol::isVirtualBaseClass() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_virtualBaseClass); | |
| } | |
| bool DIARawSymbol::isVirtualInheritance() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_isVirtualInheritance); | |
| } | |
| bool DIARawSymbol::isVolatileType() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_volatileType); | |
| } | |
| bool DIARawSymbol::wasInlined() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_wasInlined); | |
| } | |
| std::string DIARawSymbol::getUnused() const { | |
| return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_unused); | |
| } |