brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.5 KiB · eb3b696 Raw
510 lines · cpp
1//===- llvm/unittest/DebugInfo/PDB/PDBApiTest.cpp -------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include <unordered_map>10 11#include "llvm/ADT/STLExtras.h"12#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"13#include "llvm/DebugInfo/PDB/IPDBInjectedSource.h"14#include "llvm/DebugInfo/PDB/IPDBLineNumber.h"15#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"16#include "llvm/DebugInfo/PDB/IPDBSectionContrib.h"17#include "llvm/DebugInfo/PDB/IPDBSession.h"18#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"19#include "llvm/DebugInfo/PDB/IPDBTable.h"20 21#include "llvm/DebugInfo/PDB/PDBSymbol.h"22#include "llvm/DebugInfo/PDB/PDBSymbolAnnotation.h"23#include "llvm/DebugInfo/PDB/PDBSymbolBlock.h"24#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"25#include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h"26#include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h"27#include "llvm/DebugInfo/PDB/PDBSymbolCustom.h"28#include "llvm/DebugInfo/PDB/PDBSymbolData.h"29#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"30#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"31#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"32#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"33#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"34#include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"35#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"36#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"37#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"38#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"39#include "llvm/DebugInfo/PDB/PDBSymbolTypeCustom.h"40#include "llvm/DebugInfo/PDB/PDBSymbolTypeDimension.h"41#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"42#include "llvm/DebugInfo/PDB/PDBSymbolTypeFriend.h"43#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"44#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"45#include "llvm/DebugInfo/PDB/PDBSymbolTypeManaged.h"46#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"47#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"48#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"49#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h"50#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h"51#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"52#include "llvm/DebugInfo/PDB/PDBSymbolUsingNamespace.h"53#include "llvm/DebugInfo/PDB/PDBTypes.h"54#include "gtest/gtest.h"55using namespace llvm;56using namespace llvm::pdb;57 58namespace {59 60#define MOCK_SYMBOL_ACCESSOR(Func)                                             \61  decltype(std::declval<IPDBRawSymbol>().Func()) Func() const override {       \62    typedef decltype(IPDBRawSymbol::Func()) ReturnType;                        \63    return ReturnType();                                                       \64  }65 66class MockSession : public IPDBSession {67  uint64_t getLoadAddress() const override { return 0; }68  bool setLoadAddress(uint64_t Address) override { return false; }69  std::unique_ptr<PDBSymbolExe> getGlobalScope() override { return nullptr; }70  std::unique_ptr<PDBSymbol> getSymbolById(SymIndexId SymbolId) const override {71    return nullptr;72  }73  std::unique_ptr<IPDBSourceFile>74  getSourceFileById(uint32_t SymbolId) const override {75    return nullptr;76  }77  bool addressForVA(uint64_t VA, uint32_t &Section,78                    uint32_t &Offset) const override {79    return false;80  }81  bool addressForRVA(uint32_t RVA, uint32_t &Section,82                     uint32_t &Offset) const override {83    return false;84  }85  std::unique_ptr<PDBSymbol> findSymbolByAddress(uint64_t Address,86                                                 PDB_SymType Type) override {87    return nullptr;88  }89  std::unique_ptr<PDBSymbol> findSymbolByRVA(uint32_t RVA,90                                             PDB_SymType Type) override {91    return nullptr;92  }93  std::unique_ptr<PDBSymbol> findSymbolBySectOffset(uint32_t Sect,94                                                    uint32_t Offset,95                                                    PDB_SymType Type) override {96    return nullptr;97  }98  std::unique_ptr<IPDBEnumLineNumbers>99  findLineNumbers(const PDBSymbolCompiland &Compiland,100                  const IPDBSourceFile &File) const override {101    return nullptr;102  }103  std::unique_ptr<IPDBEnumLineNumbers>104  findLineNumbersByAddress(uint64_t Address, uint32_t Length) const override {105    return nullptr;106  }107  std::unique_ptr<IPDBEnumLineNumbers>108  findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const override {109    return nullptr;110  }111  std::unique_ptr<IPDBEnumLineNumbers>112  findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset,113                              uint32_t Length) const override {114    return nullptr;115  }116  std::unique_ptr<IPDBEnumSourceFiles>117  findSourceFiles(const PDBSymbolCompiland *Compiland, llvm::StringRef Pattern,118                  PDB_NameSearchFlags Flags) const override {119    return nullptr;120  }121  std::unique_ptr<IPDBSourceFile>122  findOneSourceFile(const PDBSymbolCompiland *Compiland,123                    llvm::StringRef Pattern,124                    PDB_NameSearchFlags Flags) const override {125    return nullptr;126  }127  std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>128  findCompilandsForSourceFile(llvm::StringRef Pattern,129                              PDB_NameSearchFlags Flags) const override {130    return nullptr;131  }132  std::unique_ptr<PDBSymbolCompiland>133  findOneCompilandForSourceFile(llvm::StringRef Pattern,134                                PDB_NameSearchFlags Flags) const override {135    return nullptr;136  }137 138  std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const override {139    return nullptr;140  }141  std::unique_ptr<IPDBEnumSourceFiles> getSourceFilesForCompiland(142      const PDBSymbolCompiland &Compiland) const override {143    return nullptr;144  }145 146  std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const override {147    return nullptr;148  }149 150  std::unique_ptr<IPDBEnumTables> getEnumTables() const override {151    return nullptr;152  }153 154  std::unique_ptr<IPDBEnumInjectedSources> getInjectedSources() const override {155    return nullptr;156  }157 158  std::unique_ptr<IPDBEnumSectionContribs> getSectionContribs() const override {159    return nullptr;160  }161 162  std::unique_ptr<IPDBEnumFrameData> getFrameData() const override {163    return nullptr;164  }165};166 167class MockRawSymbol : public IPDBRawSymbol {168public:169  MockRawSymbol(PDB_SymType SymType)170      : Type(SymType) {}171 172  void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,173    PdbSymbolIdField RecurseIdFields) const override {}174 175  std::unique_ptr<IPDBEnumSymbols>176  findChildren(PDB_SymType Type) const override {177    return nullptr;178  }179  std::unique_ptr<IPDBEnumSymbols>180  findChildren(PDB_SymType Type, StringRef Name,181               PDB_NameSearchFlags Flags) const override {182    return nullptr;183  }184  std::unique_ptr<IPDBEnumSymbols>185  findChildrenByAddr(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,186                     uint32_t Section, uint32_t Offset) const override {187    return nullptr;188  }189  std::unique_ptr<IPDBEnumSymbols>190  findChildrenByVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,191                   uint64_t VA) const override {192    return nullptr;193  }194  std::unique_ptr<IPDBEnumSymbols>195  findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags,196                    uint32_t RVA) const override {197    return nullptr;198  }199  std::unique_ptr<IPDBEnumSymbols>200  findInlineFramesByAddr(uint32_t Section, uint32_t Offset) const override {201    return nullptr;202  }203  std::unique_ptr<IPDBEnumSymbols>204  findInlineFramesByRVA(uint32_t RVA) const override {205    return nullptr;206  }207  std::unique_ptr<IPDBEnumSymbols>208  findInlineFramesByVA(uint64_t VA) const override {209    return nullptr;210  }211  std::unique_ptr<IPDBEnumLineNumbers> findInlineeLines() const override {212    return nullptr;213  }214  std::unique_ptr<IPDBEnumLineNumbers>215  findInlineeLinesByAddr(uint32_t Section, uint32_t Offset,216                         uint32_t Length) const override {217    return nullptr;218  }219  std::unique_ptr<IPDBEnumLineNumbers>220  findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const override {221    return nullptr;222  }223  std::unique_ptr<IPDBEnumLineNumbers>224  findInlineeLinesByVA(uint64_t VA, uint32_t Length) const override {225    return nullptr;226  }227 228  void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) const override {}229  void getFrontEndVersion(VersionInfo &Version) const override {}230  void getBackEndVersion(VersionInfo &Version) const override {}231 232  PDB_SymType getSymTag() const override { return Type; }233 234  std::string getUndecoratedNameEx(PDB_UndnameFlags Flags) const override {235    return {};236  }237 238  std::unique_ptr<IPDBLineNumber> getSrcLineOnTypeDefn() const override {239    return nullptr;240  }241 242  MOCK_SYMBOL_ACCESSOR(getAccess)243  MOCK_SYMBOL_ACCESSOR(getAddressOffset)244  MOCK_SYMBOL_ACCESSOR(getAddressSection)245  MOCK_SYMBOL_ACCESSOR(getAge)246  MOCK_SYMBOL_ACCESSOR(getArrayIndexTypeId)247  MOCK_SYMBOL_ACCESSOR(getBaseDataOffset)248  MOCK_SYMBOL_ACCESSOR(getBaseDataSlot)249  MOCK_SYMBOL_ACCESSOR(getBaseSymbolId)250  MOCK_SYMBOL_ACCESSOR(getBuiltinType)251  MOCK_SYMBOL_ACCESSOR(getBitPosition)252  MOCK_SYMBOL_ACCESSOR(getCallingConvention)253  MOCK_SYMBOL_ACCESSOR(getClassParentId)254  MOCK_SYMBOL_ACCESSOR(getCompilerName)255  MOCK_SYMBOL_ACCESSOR(getCount)256  MOCK_SYMBOL_ACCESSOR(getCountLiveRanges)257  MOCK_SYMBOL_ACCESSOR(getLanguage)258  MOCK_SYMBOL_ACCESSOR(getLexicalParentId)259  MOCK_SYMBOL_ACCESSOR(getLibraryName)260  MOCK_SYMBOL_ACCESSOR(getLiveRangeStartAddressOffset)261  MOCK_SYMBOL_ACCESSOR(getLiveRangeStartAddressSection)262  MOCK_SYMBOL_ACCESSOR(getLiveRangeStartRelativeVirtualAddress)263  MOCK_SYMBOL_ACCESSOR(getLocalBasePointerRegisterId)264  MOCK_SYMBOL_ACCESSOR(getLowerBoundId)265  MOCK_SYMBOL_ACCESSOR(getMemorySpaceKind)266  MOCK_SYMBOL_ACCESSOR(getName)267  MOCK_SYMBOL_ACCESSOR(getNumberOfAcceleratorPointerTags)268  MOCK_SYMBOL_ACCESSOR(getNumberOfColumns)269  MOCK_SYMBOL_ACCESSOR(getNumberOfModifiers)270  MOCK_SYMBOL_ACCESSOR(getNumberOfRegisterIndices)271  MOCK_SYMBOL_ACCESSOR(getNumberOfRows)272  MOCK_SYMBOL_ACCESSOR(getObjectFileName)273  MOCK_SYMBOL_ACCESSOR(getOemId)274  MOCK_SYMBOL_ACCESSOR(getOemSymbolId)275  MOCK_SYMBOL_ACCESSOR(getOffsetInUdt)276  MOCK_SYMBOL_ACCESSOR(getPlatform)277  MOCK_SYMBOL_ACCESSOR(getRank)278  MOCK_SYMBOL_ACCESSOR(getRegisterId)279  MOCK_SYMBOL_ACCESSOR(getRegisterType)280  MOCK_SYMBOL_ACCESSOR(getRelativeVirtualAddress)281  MOCK_SYMBOL_ACCESSOR(getSamplerSlot)282  MOCK_SYMBOL_ACCESSOR(getSignature)283  MOCK_SYMBOL_ACCESSOR(getSizeInUdt)284  MOCK_SYMBOL_ACCESSOR(getSlot)285  MOCK_SYMBOL_ACCESSOR(getSourceFileName)286  MOCK_SYMBOL_ACCESSOR(getStride)287  MOCK_SYMBOL_ACCESSOR(getSubTypeId)288  MOCK_SYMBOL_ACCESSOR(getSymbolsFileName)289  MOCK_SYMBOL_ACCESSOR(getSymIndexId)290  MOCK_SYMBOL_ACCESSOR(getTargetOffset)291  MOCK_SYMBOL_ACCESSOR(getTargetRelativeVirtualAddress)292  MOCK_SYMBOL_ACCESSOR(getTargetVirtualAddress)293  MOCK_SYMBOL_ACCESSOR(getTargetSection)294  MOCK_SYMBOL_ACCESSOR(getTextureSlot)295  MOCK_SYMBOL_ACCESSOR(getTimeStamp)296  MOCK_SYMBOL_ACCESSOR(getToken)297  MOCK_SYMBOL_ACCESSOR(getTypeId)298  MOCK_SYMBOL_ACCESSOR(getUavSlot)299  MOCK_SYMBOL_ACCESSOR(getUndecoratedName)300  MOCK_SYMBOL_ACCESSOR(getUnmodifiedTypeId)301  MOCK_SYMBOL_ACCESSOR(getUpperBoundId)302  MOCK_SYMBOL_ACCESSOR(getVirtualBaseDispIndex)303  MOCK_SYMBOL_ACCESSOR(getVirtualBaseOffset)304  MOCK_SYMBOL_ACCESSOR(getVirtualTableShapeId)305  MOCK_SYMBOL_ACCESSOR(getDataKind)306  MOCK_SYMBOL_ACCESSOR(getGuid)307  MOCK_SYMBOL_ACCESSOR(getOffset)308  MOCK_SYMBOL_ACCESSOR(getThisAdjust)309  MOCK_SYMBOL_ACCESSOR(getVirtualBasePointerOffset)310  MOCK_SYMBOL_ACCESSOR(getLocationType)311  MOCK_SYMBOL_ACCESSOR(getMachineType)312  MOCK_SYMBOL_ACCESSOR(getThunkOrdinal)313  MOCK_SYMBOL_ACCESSOR(getLength)314  MOCK_SYMBOL_ACCESSOR(getVirtualBaseTableType)315  MOCK_SYMBOL_ACCESSOR(getLiveRangeLength)316  MOCK_SYMBOL_ACCESSOR(getVirtualAddress)317  MOCK_SYMBOL_ACCESSOR(getUdtKind)318  MOCK_SYMBOL_ACCESSOR(hasConstructor)319  MOCK_SYMBOL_ACCESSOR(hasCustomCallingConvention)320  MOCK_SYMBOL_ACCESSOR(hasFarReturn)321  MOCK_SYMBOL_ACCESSOR(isCode)322  MOCK_SYMBOL_ACCESSOR(isCompilerGenerated)323  MOCK_SYMBOL_ACCESSOR(isConstType)324  MOCK_SYMBOL_ACCESSOR(isEditAndContinueEnabled)325  MOCK_SYMBOL_ACCESSOR(isFunction)326  MOCK_SYMBOL_ACCESSOR(getAddressTaken)327  MOCK_SYMBOL_ACCESSOR(getNoStackOrdering)328  MOCK_SYMBOL_ACCESSOR(hasAlloca)329  MOCK_SYMBOL_ACCESSOR(hasAssignmentOperator)330  MOCK_SYMBOL_ACCESSOR(hasCTypes)331  MOCK_SYMBOL_ACCESSOR(hasCastOperator)332  MOCK_SYMBOL_ACCESSOR(hasDebugInfo)333  MOCK_SYMBOL_ACCESSOR(hasEH)334  MOCK_SYMBOL_ACCESSOR(hasEHa)335  MOCK_SYMBOL_ACCESSOR(hasFramePointer)336  MOCK_SYMBOL_ACCESSOR(hasInlAsm)337  MOCK_SYMBOL_ACCESSOR(hasInlineAttribute)338  MOCK_SYMBOL_ACCESSOR(hasInterruptReturn)339  MOCK_SYMBOL_ACCESSOR(hasLongJump)340  MOCK_SYMBOL_ACCESSOR(hasManagedCode)341  MOCK_SYMBOL_ACCESSOR(hasNestedTypes)342  MOCK_SYMBOL_ACCESSOR(hasNoInlineAttribute)343  MOCK_SYMBOL_ACCESSOR(hasNoReturnAttribute)344  MOCK_SYMBOL_ACCESSOR(hasOptimizedCodeDebugInfo)345  MOCK_SYMBOL_ACCESSOR(hasOverloadedOperator)346  MOCK_SYMBOL_ACCESSOR(hasSEH)347  MOCK_SYMBOL_ACCESSOR(hasSecurityChecks)348  MOCK_SYMBOL_ACCESSOR(hasSetJump)349  MOCK_SYMBOL_ACCESSOR(hasStrictGSCheck)350  MOCK_SYMBOL_ACCESSOR(isAcceleratorGroupSharedLocal)351  MOCK_SYMBOL_ACCESSOR(isAcceleratorPointerTagLiveRange)352  MOCK_SYMBOL_ACCESSOR(isAcceleratorStubFunction)353  MOCK_SYMBOL_ACCESSOR(isAggregated)354  MOCK_SYMBOL_ACCESSOR(isIntroVirtualFunction)355  MOCK_SYMBOL_ACCESSOR(isCVTCIL)356  MOCK_SYMBOL_ACCESSOR(isConstructorVirtualBase)357  MOCK_SYMBOL_ACCESSOR(isCxxReturnUdt)358  MOCK_SYMBOL_ACCESSOR(isDataAligned)359  MOCK_SYMBOL_ACCESSOR(isHLSLData)360  MOCK_SYMBOL_ACCESSOR(isHotpatchable)361  MOCK_SYMBOL_ACCESSOR(isIndirectVirtualBaseClass)362  MOCK_SYMBOL_ACCESSOR(isInterfaceUdt)363  MOCK_SYMBOL_ACCESSOR(isIntrinsic)364  MOCK_SYMBOL_ACCESSOR(isLTCG)365  MOCK_SYMBOL_ACCESSOR(isLocationControlFlowDependent)366  MOCK_SYMBOL_ACCESSOR(isMSILNetmodule)367  MOCK_SYMBOL_ACCESSOR(isMatrixRowMajor)368  MOCK_SYMBOL_ACCESSOR(isManagedCode)369  MOCK_SYMBOL_ACCESSOR(isMSILCode)370  MOCK_SYMBOL_ACCESSOR(isMultipleInheritance)371  MOCK_SYMBOL_ACCESSOR(isNaked)372  MOCK_SYMBOL_ACCESSOR(isNested)373  MOCK_SYMBOL_ACCESSOR(isOptimizedAway)374  MOCK_SYMBOL_ACCESSOR(isPacked)375  MOCK_SYMBOL_ACCESSOR(isPointerBasedOnSymbolValue)376  MOCK_SYMBOL_ACCESSOR(isPointerToDataMember)377  MOCK_SYMBOL_ACCESSOR(isPointerToMemberFunction)378  MOCK_SYMBOL_ACCESSOR(isPureVirtual)379  MOCK_SYMBOL_ACCESSOR(isRValueReference)380  MOCK_SYMBOL_ACCESSOR(isRefUdt)381  MOCK_SYMBOL_ACCESSOR(isReference)382  MOCK_SYMBOL_ACCESSOR(isRestrictedType)383  MOCK_SYMBOL_ACCESSOR(isReturnValue)384  MOCK_SYMBOL_ACCESSOR(isSafeBuffers)385  MOCK_SYMBOL_ACCESSOR(isScoped)386  MOCK_SYMBOL_ACCESSOR(isSdl)387  MOCK_SYMBOL_ACCESSOR(isSingleInheritance)388  MOCK_SYMBOL_ACCESSOR(isSplitted)389  MOCK_SYMBOL_ACCESSOR(isStatic)390  MOCK_SYMBOL_ACCESSOR(hasPrivateSymbols)391  MOCK_SYMBOL_ACCESSOR(isUnalignedType)392  MOCK_SYMBOL_ACCESSOR(isUnreached)393  MOCK_SYMBOL_ACCESSOR(isValueUdt)394  MOCK_SYMBOL_ACCESSOR(isVirtual)395  MOCK_SYMBOL_ACCESSOR(isVirtualBaseClass)396  MOCK_SYMBOL_ACCESSOR(isVirtualInheritance)397  MOCK_SYMBOL_ACCESSOR(isVolatileType)398  MOCK_SYMBOL_ACCESSOR(getValue)399  MOCK_SYMBOL_ACCESSOR(wasInlined)400  MOCK_SYMBOL_ACCESSOR(getUnused)401 402private:403  PDB_SymType Type;404};405 406class PDBApiTest : public testing::Test {407public:408  std::unordered_map<PDB_SymType, std::unique_ptr<PDBSymbol>> SymbolMap;409 410  void SetUp() override {411    Session.reset(new MockSession());412 413    InsertItemWithTag(PDB_SymType::None);414    InsertItemWithTag(PDB_SymType::Exe);415    InsertItemWithTag(PDB_SymType::Compiland);416    InsertItemWithTag(PDB_SymType::CompilandDetails);417    InsertItemWithTag(PDB_SymType::CompilandEnv);418    InsertItemWithTag(PDB_SymType::Function);419    InsertItemWithTag(PDB_SymType::Block);420    InsertItemWithTag(PDB_SymType::Data);421    InsertItemWithTag(PDB_SymType::Annotation);422    InsertItemWithTag(PDB_SymType::Label);423    InsertItemWithTag(PDB_SymType::PublicSymbol);424    InsertItemWithTag(PDB_SymType::UDT);425    InsertItemWithTag(PDB_SymType::Enum);426    InsertItemWithTag(PDB_SymType::FunctionSig);427    InsertItemWithTag(PDB_SymType::PointerType);428    InsertItemWithTag(PDB_SymType::ArrayType);429    InsertItemWithTag(PDB_SymType::BuiltinType);430    InsertItemWithTag(PDB_SymType::Typedef);431    InsertItemWithTag(PDB_SymType::BaseClass);432    InsertItemWithTag(PDB_SymType::Friend);433    InsertItemWithTag(PDB_SymType::FunctionArg);434    InsertItemWithTag(PDB_SymType::FuncDebugStart);435    InsertItemWithTag(PDB_SymType::FuncDebugEnd);436    InsertItemWithTag(PDB_SymType::UsingNamespace);437    InsertItemWithTag(PDB_SymType::VTableShape);438    InsertItemWithTag(PDB_SymType::VTable);439    InsertItemWithTag(PDB_SymType::Custom);440    InsertItemWithTag(PDB_SymType::Thunk);441    InsertItemWithTag(PDB_SymType::CustomType);442    InsertItemWithTag(PDB_SymType::ManagedType);443    InsertItemWithTag(PDB_SymType::Dimension);444    InsertItemWithTag(PDB_SymType::Max);445  }446 447  template <class ExpectedType> void VerifyDyncast(PDB_SymType Tag) {448    for (auto item = SymbolMap.begin(); item != SymbolMap.end(); ++item) {449      EXPECT_EQ(item->first == Tag, llvm::isa<ExpectedType>(*item->second));450    }451  }452 453  void VerifyUnknownDyncasts() {454    for (auto item = SymbolMap.begin(); item != SymbolMap.end(); ++item) {455      bool should_match = false;456      if (item->first == PDB_SymType::None || item->first >= PDB_SymType::Max)457        should_match = true;458 459      EXPECT_EQ(should_match, llvm::isa<PDBSymbolUnknown>(*item->second));460    }461  }462 463private:464  std::unique_ptr<IPDBSession> Session;465 466  void InsertItemWithTag(PDB_SymType Tag) {467    auto RawSymbol = std::make_unique<MockRawSymbol>(Tag);468    auto Symbol = PDBSymbol::create(*Session, std::move(RawSymbol));469    SymbolMap.insert(std::make_pair(Tag, std::move(Symbol)));470  }471};472 473TEST_F(PDBApiTest, Dyncast) {474 475  // Most of the types have a one-to-one mapping between Tag and concrete type.476  VerifyDyncast<PDBSymbolExe>(PDB_SymType::Exe);477  VerifyDyncast<PDBSymbolCompiland>(PDB_SymType::Compiland);478  VerifyDyncast<PDBSymbolCompilandDetails>(PDB_SymType::CompilandDetails);479  VerifyDyncast<PDBSymbolCompilandEnv>(PDB_SymType::CompilandEnv);480  VerifyDyncast<PDBSymbolFunc>(PDB_SymType::Function);481  VerifyDyncast<PDBSymbolBlock>(PDB_SymType::Block);482  VerifyDyncast<PDBSymbolData>(PDB_SymType::Data);483  VerifyDyncast<PDBSymbolAnnotation>(PDB_SymType::Annotation);484  VerifyDyncast<PDBSymbolLabel>(PDB_SymType::Label);485  VerifyDyncast<PDBSymbolPublicSymbol>(PDB_SymType::PublicSymbol);486  VerifyDyncast<PDBSymbolTypeUDT>(PDB_SymType::UDT);487  VerifyDyncast<PDBSymbolTypeEnum>(PDB_SymType::Enum);488  VerifyDyncast<PDBSymbolTypeFunctionSig>(PDB_SymType::FunctionSig);489  VerifyDyncast<PDBSymbolTypePointer>(PDB_SymType::PointerType);490  VerifyDyncast<PDBSymbolTypeArray>(PDB_SymType::ArrayType);491  VerifyDyncast<PDBSymbolTypeBuiltin>(PDB_SymType::BuiltinType);492  VerifyDyncast<PDBSymbolTypeTypedef>(PDB_SymType::Typedef);493  VerifyDyncast<PDBSymbolTypeBaseClass>(PDB_SymType::BaseClass);494  VerifyDyncast<PDBSymbolTypeFriend>(PDB_SymType::Friend);495  VerifyDyncast<PDBSymbolTypeFunctionArg>(PDB_SymType::FunctionArg);496  VerifyDyncast<PDBSymbolFuncDebugStart>(PDB_SymType::FuncDebugStart);497  VerifyDyncast<PDBSymbolFuncDebugEnd>(PDB_SymType::FuncDebugEnd);498  VerifyDyncast<PDBSymbolUsingNamespace>(PDB_SymType::UsingNamespace);499  VerifyDyncast<PDBSymbolTypeVTableShape>(PDB_SymType::VTableShape);500  VerifyDyncast<PDBSymbolTypeVTable>(PDB_SymType::VTable);501  VerifyDyncast<PDBSymbolCustom>(PDB_SymType::Custom);502  VerifyDyncast<PDBSymbolThunk>(PDB_SymType::Thunk);503  VerifyDyncast<PDBSymbolTypeCustom>(PDB_SymType::CustomType);504  VerifyDyncast<PDBSymbolTypeManaged>(PDB_SymType::ManagedType);505  VerifyDyncast<PDBSymbolTypeDimension>(PDB_SymType::Dimension);506 507  VerifyUnknownDyncasts();508}509} // end anonymous namespace510