PDBSymbolTypeFunctionSig.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //===- PDBSymbolTypeFunctionSig.cpp - --------------------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
  10. #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
  11. #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
  12. #include "llvm/DebugInfo/PDB/IPDBSession.h"
  13. #include "llvm/DebugInfo/PDB/PDBSymbol.h"
  14. #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
  15. #include "llvm/DebugInfo/PDB/PDBSymDumper.h"
  16. #include <utility>
  17. using namespace llvm;
  18. namespace {
  19. class FunctionArgEnumerator : public IPDBEnumSymbols {
  20. public:
  21. typedef ConcreteSymbolEnumerator<PDBSymbolTypeFunctionArg> ArgEnumeratorType;
  22. FunctionArgEnumerator(const IPDBSession &PDBSession,
  23. const PDBSymbolTypeFunctionSig &Sig)
  24. : Session(PDBSession),
  25. Enumerator(Sig.findAllChildren<PDBSymbolTypeFunctionArg>()) {}
  26. FunctionArgEnumerator(const IPDBSession &PDBSession,
  27. std::unique_ptr<ArgEnumeratorType> ArgEnumerator)
  28. : Session(PDBSession), Enumerator(std::move(ArgEnumerator)) {}
  29. uint32_t getChildCount() const override {
  30. return Enumerator->getChildCount();
  31. }
  32. std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override {
  33. auto FunctionArgSymbol = Enumerator->getChildAtIndex(Index);
  34. if (!FunctionArgSymbol)
  35. return nullptr;
  36. return Session.getSymbolById(FunctionArgSymbol->getTypeId());
  37. }
  38. std::unique_ptr<PDBSymbol> getNext() override {
  39. auto FunctionArgSymbol = Enumerator->getNext();
  40. if (!FunctionArgSymbol)
  41. return nullptr;
  42. return Session.getSymbolById(FunctionArgSymbol->getTypeId());
  43. }
  44. void reset() override { Enumerator->reset(); }
  45. MyType *clone() const override {
  46. std::unique_ptr<ArgEnumeratorType> Clone(Enumerator->clone());
  47. return new FunctionArgEnumerator(Session, std::move(Clone));
  48. }
  49. private:
  50. const IPDBSession &Session;
  51. std::unique_ptr<ArgEnumeratorType> Enumerator;
  52. };
  53. }
  54. PDBSymbolTypeFunctionSig::PDBSymbolTypeFunctionSig(
  55. const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
  56. : PDBSymbol(PDBSession, std::move(Symbol)) {}
  57. std::unique_ptr<PDBSymbol> PDBSymbolTypeFunctionSig::getReturnType() const {
  58. return Session.getSymbolById(getTypeId());
  59. }
  60. std::unique_ptr<IPDBEnumSymbols>
  61. PDBSymbolTypeFunctionSig::getArguments() const {
  62. return llvm::make_unique<FunctionArgEnumerator>(Session, *this);
  63. }
  64. std::unique_ptr<PDBSymbol> PDBSymbolTypeFunctionSig::getClassParent() const {
  65. uint32_t ClassId = getClassParentId();
  66. if (ClassId == 0)
  67. return nullptr;
  68. return Session.getSymbolById(ClassId);
  69. }
  70. void PDBSymbolTypeFunctionSig::dump(PDBSymDumper &Dumper) const {
  71. Dumper.dump(*this);
  72. }