//===- PDBSymbolTypeFunctionSig.cpp - --------------------------*- 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/PDBSymbolTypeFunctionSig.h" #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h" #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" #include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/PDBSymbol.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h" #include "llvm/DebugInfo/PDB/PDBSymDumper.h" #include using namespace llvm; namespace { class FunctionArgEnumerator : public IPDBEnumSymbols { public: typedef ConcreteSymbolEnumerator ArgEnumeratorType; FunctionArgEnumerator(const IPDBSession &PDBSession, const PDBSymbolTypeFunctionSig &Sig) : Session(PDBSession), Enumerator(Sig.findAllChildren()) {} FunctionArgEnumerator(const IPDBSession &PDBSession, std::unique_ptr ArgEnumerator) : Session(PDBSession), Enumerator(std::move(ArgEnumerator)) {} uint32_t getChildCount() const override { return Enumerator->getChildCount(); } std::unique_ptr getChildAtIndex(uint32_t Index) const override { auto FunctionArgSymbol = Enumerator->getChildAtIndex(Index); if (!FunctionArgSymbol) return nullptr; return Session.getSymbolById(FunctionArgSymbol->getTypeId()); } std::unique_ptr getNext() override { auto FunctionArgSymbol = Enumerator->getNext(); if (!FunctionArgSymbol) return nullptr; return Session.getSymbolById(FunctionArgSymbol->getTypeId()); } void reset() override { Enumerator->reset(); } MyType *clone() const override { std::unique_ptr Clone(Enumerator->clone()); return new FunctionArgEnumerator(Session, std::move(Clone)); } private: const IPDBSession &Session; std::unique_ptr Enumerator; }; } PDBSymbolTypeFunctionSig::PDBSymbolTypeFunctionSig( const IPDBSession &PDBSession, std::unique_ptr Symbol) : PDBSymbol(PDBSession, std::move(Symbol)) {} std::unique_ptr PDBSymbolTypeFunctionSig::getReturnType() const { return Session.getSymbolById(getTypeId()); } std::unique_ptr PDBSymbolTypeFunctionSig::getArguments() const { return llvm::make_unique(Session, *this); } std::unique_ptr PDBSymbolTypeFunctionSig::getClassParent() const { uint32_t ClassId = getClassParentId(); if (ClassId == 0) return nullptr; return Session.getSymbolById(ClassId); } void PDBSymbolTypeFunctionSig::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); }