1 //===- IPDBRawSymbol.h - base interface for PDB symbol types ----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_DEBUGINFO_PDB_IPDBRAWSYMBOL_H 10 #define LLVM_DEBUGINFO_PDB_IPDBRAWSYMBOL_H 11 12 #include "PDBTypes.h" 13 #include "llvm/ADT/BitmaskEnum.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "llvm/ADT/StringRef.h" 16 #include "llvm/DebugInfo/CodeView/CodeView.h" 17 #include <memory> 18 19 namespace llvm { 20 class raw_ostream; 21 22 namespace pdb { 23 24 class IPDBSession; 25 class PDBSymbolTypeVTable; 26 class PDBSymbolTypeVTableShape; 27 28 enum class PdbSymbolIdField : uint32_t { 29 None = 0, 30 SymIndexId = 1 << 0, 31 LexicalParent = 1 << 1, 32 ClassParent = 1 << 2, 33 Type = 1 << 3, 34 UnmodifiedType = 1 << 4, 35 All = 0xFFFFFFFF, 36 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All) 37 }; 38 39 void dumpSymbolIdField(raw_ostream &OS, StringRef Name, SymIndexId Value, 40 int Indent, const IPDBSession &Session, 41 PdbSymbolIdField FieldId, PdbSymbolIdField ShowFlags, 42 PdbSymbolIdField RecurseFlags); 43 44 /// IPDBRawSymbol defines an interface used to represent an arbitrary symbol. 45 /// It exposes a monolithic interface consisting of accessors for the union of 46 /// all properties that are valid for any symbol type. This interface is then 47 /// wrapped by a concrete class which exposes only those set of methods valid 48 /// for this particular symbol type. See PDBSymbol.h for more details. 49 class IPDBRawSymbol { 50 public: 51 virtual ~IPDBRawSymbol(); 52 53 virtual void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, 54 PdbSymbolIdField RecurseIdFields) const = 0; 55 56 virtual std::unique_ptr<IPDBEnumSymbols> 57 findChildren(PDB_SymType Type) const = 0; 58 59 virtual std::unique_ptr<IPDBEnumSymbols> 60 findChildren(PDB_SymType Type, StringRef Name, 61 PDB_NameSearchFlags Flags) const = 0; 62 virtual std::unique_ptr<IPDBEnumSymbols> 63 findChildrenByAddr(PDB_SymType Type, StringRef Name, 64 PDB_NameSearchFlags Flags, 65 uint32_t Section, uint32_t Offset) const = 0; 66 virtual std::unique_ptr<IPDBEnumSymbols> 67 findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags, 68 uint64_t VA) const = 0; 69 virtual std::unique_ptr<IPDBEnumSymbols> 70 findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags, 71 uint32_t RVA) const = 0; 72 73 virtual std::unique_ptr<IPDBEnumSymbols> 74 findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const = 0; 75 virtual std::unique_ptr<IPDBEnumSymbols> 76 findInlineFramesByRVA(uint32_t RVA) const = 0; 77 virtual std::unique_ptr<IPDBEnumSymbols> 78 findInlineFramesByVA(uint64_t VA) const = 0; 79 80 virtual std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const = 0; 81 virtual std::unique_ptr<IPDBEnumLineNumbers> 82 findInlineeLinesByAddr(uint32_t Section, uint32_t Offset, 83 uint32_t Length) const = 0; 84 virtual std::unique_ptr<IPDBEnumLineNumbers> 85 findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const = 0; 86 virtual std::unique_ptr<IPDBEnumLineNumbers> 87 findInlineeLinesByVA(uint64_t VA, uint32_t Length) const = 0; 88 89 virtual void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const = 0; 90 virtual void getBackEndVersion(VersionInfo &Version) const = 0; 91 virtual PDB_MemberAccess getAccess() const = 0; 92 virtual uint32_t getAddressOffset() const = 0; 93 virtual uint32_t getAddressSection() const = 0; 94 virtual uint32_t getAge() const = 0; 95 virtual SymIndexId getArrayIndexTypeId() const = 0; 96 virtual uint32_t getBaseDataOffset() const = 0; 97 virtual uint32_t getBaseDataSlot() const = 0; 98 virtual SymIndexId getBaseSymbolId() const = 0; 99 virtual PDB_BuiltinType getBuiltinType() const = 0; 100 virtual uint32_t getBitPosition() const = 0; 101 virtual PDB_CallingConv getCallingConvention() const = 0; 102 virtual SymIndexId getClassParentId() const = 0; 103 virtual std::string getCompilerName() const = 0; 104 virtual uint32_t getCount() const = 0; 105 virtual uint32_t getCountLiveRanges() const = 0; 106 virtual void getFrontEndVersion(VersionInfo &Version) const = 0; 107 virtual PDB_Lang getLanguage() const = 0; 108 virtual SymIndexId getLexicalParentId() const = 0; 109 virtual std::string getLibraryName() const = 0; 110 virtual uint32_t getLiveRangeStartAddressOffset() const = 0; 111 virtual uint32_t getLiveRangeStartAddressSection() const = 0; 112 virtual uint32_t getLiveRangeStartRelativeVirtualAddress() const = 0; 113 virtual codeview::RegisterId getLocalBasePointerRegisterId() const = 0; 114 virtual SymIndexId getLowerBoundId() const = 0; 115 virtual uint32_t getMemorySpaceKind() const = 0; 116 virtual std::string getName() const = 0; 117 virtual uint32_t getNumberOfAcceleratorPointerTags() const = 0; 118 virtual uint32_t getNumberOfColumns() const = 0; 119 virtual uint32_t getNumberOfModifiers() const = 0; 120 virtual uint32_t getNumberOfRegisterIndices() const = 0; 121 virtual uint32_t getNumberOfRows() const = 0; 122 virtual std::string getObjectFileName() const = 0; 123 virtual uint32_t getOemId() const = 0; 124 virtual SymIndexId getOemSymbolId() const = 0; 125 virtual uint32_t getOffsetInUdt() const = 0; 126 virtual PDB_Cpu getPlatform() const = 0; 127 virtual uint32_t getRank() const = 0; 128 virtual codeview::RegisterId getRegisterId() const = 0; 129 virtual uint32_t getRegisterType() const = 0; 130 virtual uint32_t getRelativeVirtualAddress() const = 0; 131 virtual uint32_t getSamplerSlot() const = 0; 132 virtual uint32_t getSignature() const = 0; 133 virtual uint32_t getSizeInUdt() const = 0; 134 virtual uint32_t getSlot() const = 0; 135 virtual std::string getSourceFileName() const = 0; 136 virtual std::unique_ptr<IPDBLineNumber> 137 getSrcLineOnTypeDefn() const = 0; 138 virtual uint32_t getStride() const = 0; 139 virtual SymIndexId getSubTypeId() const = 0; 140 virtual std::string getSymbolsFileName() const = 0; 141 virtual SymIndexId getSymIndexId() const = 0; 142 virtual uint32_t getTargetOffset() const = 0; 143 virtual uint32_t getTargetRelativeVirtualAddress() const = 0; 144 virtual uint64_t getTargetVirtualAddress() const = 0; 145 virtual uint32_t getTargetSection() const = 0; 146 virtual uint32_t getTextureSlot() const = 0; 147 virtual uint32_t getTimeStamp() const = 0; 148 virtual uint32_t getToken() const = 0; 149 virtual SymIndexId getTypeId() const = 0; 150 virtual uint32_t getUavSlot() const = 0; 151 virtual std::string getUndecoratedName() const = 0; 152 virtual std::string getUndecoratedNameEx(PDB_UndnameFlags Flags) const = 0; 153 virtual SymIndexId getUnmodifiedTypeId() const = 0; 154 virtual SymIndexId getUpperBoundId() const = 0; 155 virtual Variant getValue() const = 0; 156 virtual uint32_t getVirtualBaseDispIndex() const = 0; 157 virtual uint32_t getVirtualBaseOffset() const = 0; 158 virtual std::unique_ptr<PDBSymbolTypeBuiltin> 159 getVirtualBaseTableType() const = 0; 160 virtual SymIndexId getVirtualTableShapeId() const = 0; 161 virtual PDB_DataKind getDataKind() const = 0; 162 virtual PDB_SymType getSymTag() const = 0; 163 virtual codeview::GUID getGuid() const = 0; 164 virtual int32_t getOffset() const = 0; 165 virtual int32_t getThisAdjust() const = 0; 166 virtual int32_t getVirtualBasePointerOffset() const = 0; 167 virtual PDB_LocType getLocationType() const = 0; 168 virtual PDB_Machine getMachineType() const = 0; 169 virtual codeview::ThunkOrdinal getThunkOrdinal() const = 0; 170 virtual uint64_t getLength() const = 0; 171 virtual uint64_t getLiveRangeLength() const = 0; 172 virtual uint64_t getVirtualAddress() const = 0; 173 virtual PDB_UdtType getUdtKind() const = 0; 174 virtual bool hasConstructor() const = 0; 175 virtual bool hasCustomCallingConvention() const = 0; 176 virtual bool hasFarReturn() const = 0; 177 virtual bool isCode() const = 0; 178 virtual bool isCompilerGenerated() const = 0; 179 virtual bool isConstType() const = 0; 180 virtual bool isEditAndContinueEnabled() const = 0; 181 virtual bool isFunction() const = 0; 182 virtual bool getAddressTaken() const = 0; 183 virtual bool getNoStackOrdering() const = 0; 184 virtual bool hasAlloca() const = 0; 185 virtual bool hasAssignmentOperator() const = 0; 186 virtual bool hasCTypes() const = 0; 187 virtual bool hasCastOperator() const = 0; 188 virtual bool hasDebugInfo() const = 0; 189 virtual bool hasEH() const = 0; 190 virtual bool hasEHa() const = 0; 191 virtual bool hasFramePointer() const = 0; 192 virtual bool hasInlAsm() const = 0; 193 virtual bool hasInlineAttribute() const = 0; 194 virtual bool hasInterruptReturn() const = 0; 195 virtual bool hasLongJump() const = 0; 196 virtual bool hasManagedCode() const = 0; 197 virtual bool hasNestedTypes() const = 0; 198 virtual bool hasNoInlineAttribute() const = 0; 199 virtual bool hasNoReturnAttribute() const = 0; 200 virtual bool hasOptimizedCodeDebugInfo() const = 0; 201 virtual bool hasOverloadedOperator() const = 0; 202 virtual bool hasSEH() const = 0; 203 virtual bool hasSecurityChecks() const = 0; 204 virtual bool hasSetJump() const = 0; 205 virtual bool hasStrictGSCheck() const = 0; 206 virtual bool isAcceleratorGroupSharedLocal() const = 0; 207 virtual bool isAcceleratorPointerTagLiveRange() const = 0; 208 virtual bool isAcceleratorStubFunction() const = 0; 209 virtual bool isAggregated() const = 0; 210 virtual bool isIntroVirtualFunction() const = 0; 211 virtual bool isCVTCIL() const = 0; 212 virtual bool isConstructorVirtualBase() const = 0; 213 virtual bool isCxxReturnUdt() const = 0; 214 virtual bool isDataAligned() const = 0; 215 virtual bool isHLSLData() const = 0; 216 virtual bool isHotpatchable() const = 0; 217 virtual bool isIndirectVirtualBaseClass() const = 0; 218 virtual bool isInterfaceUdt() const = 0; 219 virtual bool isIntrinsic() const = 0; 220 virtual bool isLTCG() const = 0; 221 virtual bool isLocationControlFlowDependent() const = 0; 222 virtual bool isMSILNetmodule() const = 0; 223 virtual bool isMatrixRowMajor() const = 0; 224 virtual bool isManagedCode() const = 0; 225 virtual bool isMSILCode() const = 0; 226 virtual bool isMultipleInheritance() const = 0; 227 virtual bool isNaked() const = 0; 228 virtual bool isNested() const = 0; 229 virtual bool isOptimizedAway() const = 0; 230 virtual bool isPacked() const = 0; 231 virtual bool isPointerBasedOnSymbolValue() const = 0; 232 virtual bool isPointerToDataMember() const = 0; 233 virtual bool isPointerToMemberFunction() const = 0; 234 virtual bool isPureVirtual() const = 0; 235 virtual bool isRValueReference() const = 0; 236 virtual bool isRefUdt() const = 0; 237 virtual bool isReference() const = 0; 238 virtual bool isRestrictedType() const = 0; 239 virtual bool isReturnValue() const = 0; 240 virtual bool isSafeBuffers() const = 0; 241 virtual bool isScoped() const = 0; 242 virtual bool isSdl() const = 0; 243 virtual bool isSingleInheritance() const = 0; 244 virtual bool isSplitted() const = 0; 245 virtual bool isStatic() const = 0; 246 virtual bool hasPrivateSymbols() const = 0; 247 virtual bool isUnalignedType() const = 0; 248 virtual bool isUnreached() const = 0; 249 virtual bool isValueUdt() const = 0; 250 virtual bool isVirtual() const = 0; 251 virtual bool isVirtualBaseClass() const = 0; 252 virtual bool isVirtualInheritance() const = 0; 253 virtual bool isVolatileType() const = 0; 254 virtual bool wasInlined() const = 0; 255 virtual std::string getUnused() const = 0; 256 }; 257 258 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 259 260 } // namespace pdb 261 } // namespace llvm 262 263 #endif 264