21 #include <unordered_set>
32 FunctionArgEnumerator(
const IPDBSession &PDBSession,
34 : Session(PDBSession),
Func(PDBFunc) {
37 std::unordered_set<std::string> SeenNames;
39 while (
auto Child = DataChildren->getNext()) {
41 std::string
Name = Child->getName();
42 if (SeenNames.find(Name) != SeenNames.end())
44 Args.push_back(std::move(Child));
45 SeenNames.insert(Name);
51 uint32_t getChildCount()
const override {
return Args.size(); }
53 std::unique_ptr<PDBSymbolData>
54 getChildAtIndex(uint32_t Index)
const override {
55 if (Index >= Args.size())
59 Args[Index]->getSymIndexId());
62 std::unique_ptr<PDBSymbolData> getNext()
override {
63 if (CurIter == Args.end())
65 const auto &Result = **CurIter;
67 return Session.getConcreteSymbolById<
PDBSymbolData>(Result.getSymIndexId());
70 void reset()
override { CurIter = Args.empty() ? Args.end() : Args.begin(); }
72 FunctionArgEnumerator *clone()
const override {
73 return new FunctionArgEnumerator(Session,
Func);
77 typedef std::vector<std::unique_ptr<PDBSymbolData>> ArgListType;
81 ArgListType::const_iterator CurIter;
86 std::unique_ptr<IPDBRawSymbol>
Symbol)
87 :
PDBSymbol(PDBSession, std::move(Symbol)) {}
93 std::unique_ptr<IPDBEnumChildren<PDBSymbolData>>
95 return llvm::make_unique<FunctionArgEnumerator>(
Session, *
this);
std::unique_ptr< PDBSymbolTypeUDT > getClassParent() const
PDBSymbolFunc(const IPDBSession &PDBSession, std::unique_ptr< IPDBRawSymbol > FuncSymbol)
virtual void dump(const PDBSymbolAnnotation &Symbol)
PDBSymbol defines the base of the inheritance hierarchy for concrete symbol types (e...
std::unique_ptr< PDBSymbolTypeFunctionSig > getSignature() const
std::unique_ptr< IPDBEnumChildren< PDBSymbolData > > getArguments() const
void dump(PDBSymDumper &Dumper) const override
Dumps the contents of a symbol a raw_ostream.
const IPDBSession & Session
IPDBSession defines an interface used to provide a context for querying debug information from a debu...
std::unique_ptr< T > getConcreteSymbolById(uint32_t SymbolId) const