14d93d66dSAdrian McCarthy //===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- C++ -*-===//
24d93d66dSAdrian McCarthy //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64d93d66dSAdrian McCarthy //
74d93d66dSAdrian McCarthy //===----------------------------------------------------------------------===//
84d93d66dSAdrian McCarthy
94d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"
104d93d66dSAdrian McCarthy
11*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/CodeView/CodeView.h"
12*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
134d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
144d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
154d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h"
16*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
174d93d66dSAdrian McCarthy #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
188ab7dd60SZachary Turner #include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
194d93d66dSAdrian McCarthy
207999b4faSZachary Turner using namespace llvm;
217999b4faSZachary Turner using namespace llvm::pdb;
224d93d66dSAdrian McCarthy
getDbiStreamPtr(NativeSession & Session)238ab7dd60SZachary Turner static DbiStream *getDbiStreamPtr(NativeSession &Session) {
248ab7dd60SZachary Turner Expected<DbiStream &> DbiS = Session.getPDBFile().getPDBDbiStream();
258ab7dd60SZachary Turner if (DbiS)
268ab7dd60SZachary Turner return &DbiS.get();
278ab7dd60SZachary Turner
288ab7dd60SZachary Turner consumeError(DbiS.takeError());
298ab7dd60SZachary Turner return nullptr;
308ab7dd60SZachary Turner }
318ab7dd60SZachary Turner
NativeExeSymbol(NativeSession & Session,SymIndexId SymbolId)328d090fc5SAdrian McCarthy NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)
337999b4faSZachary Turner : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId),
348ab7dd60SZachary Turner Dbi(getDbiStreamPtr(Session)) {}
3531bcb6f6SAdrian McCarthy
364d93d66dSAdrian McCarthy std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const374d93d66dSAdrian McCarthy NativeExeSymbol::findChildren(PDB_SymType Type) const {
384d93d66dSAdrian McCarthy switch (Type) {
394d93d66dSAdrian McCarthy case PDB_SymType::Compiland: {
407999b4faSZachary Turner return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session));
414d93d66dSAdrian McCarthy break;
424d93d66dSAdrian McCarthy }
43518cb2d5SZachary Turner case PDB_SymType::ArrayType:
44518cb2d5SZachary Turner return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ARRAY);
45b41f03e7SAdrian McCarthy case PDB_SymType::Enum:
468ab7dd60SZachary Turner return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM);
47da4b63abSZachary Turner case PDB_SymType::PointerType:
48da4b63abSZachary Turner return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER);
49355ffb00SZachary Turner case PDB_SymType::UDT:
50355ffb00SZachary Turner return Session.getSymbolCache().createTypeEnumerator(
51355ffb00SZachary Turner {codeview::LF_STRUCTURE, codeview::LF_CLASS, codeview::LF_UNION,
52355ffb00SZachary Turner codeview::LF_INTERFACE});
535c1873b2SZachary Turner case PDB_SymType::VTableShape:
545c1873b2SZachary Turner return Session.getSymbolCache().createTypeEnumerator(codeview::LF_VTSHAPE);
556345e84dSZachary Turner case PDB_SymType::FunctionSig:
566345e84dSZachary Turner return Session.getSymbolCache().createTypeEnumerator(
576345e84dSZachary Turner {codeview::LF_PROCEDURE, codeview::LF_MFUNCTION});
58a5e3e026SZachary Turner case PDB_SymType::Typedef:
59a5e3e026SZachary Turner return Session.getSymbolCache().createGlobalsEnumerator(codeview::S_UDT);
606345e84dSZachary Turner
614d93d66dSAdrian McCarthy default:
624d93d66dSAdrian McCarthy break;
634d93d66dSAdrian McCarthy }
644d93d66dSAdrian McCarthy return nullptr;
654d93d66dSAdrian McCarthy }
664d93d66dSAdrian McCarthy
getAge() const674d93d66dSAdrian McCarthy uint32_t NativeExeSymbol::getAge() const {
688ab7dd60SZachary Turner auto IS = Session.getPDBFile().getPDBInfoStream();
694d93d66dSAdrian McCarthy if (IS)
704d93d66dSAdrian McCarthy return IS->getAge();
714d93d66dSAdrian McCarthy consumeError(IS.takeError());
724d93d66dSAdrian McCarthy return 0;
734d93d66dSAdrian McCarthy }
744d93d66dSAdrian McCarthy
getSymbolsFileName() const754d93d66dSAdrian McCarthy std::string NativeExeSymbol::getSymbolsFileName() const {
76adcd0268SBenjamin Kramer return std::string(Session.getPDBFile().getFilePath());
774d93d66dSAdrian McCarthy }
784d93d66dSAdrian McCarthy
getGuid() const7967653ee0SReid Kleckner codeview::GUID NativeExeSymbol::getGuid() const {
808ab7dd60SZachary Turner auto IS = Session.getPDBFile().getPDBInfoStream();
814d93d66dSAdrian McCarthy if (IS)
824d93d66dSAdrian McCarthy return IS->getGuid();
834d93d66dSAdrian McCarthy consumeError(IS.takeError());
8467653ee0SReid Kleckner return codeview::GUID{{0}};
854d93d66dSAdrian McCarthy }
864d93d66dSAdrian McCarthy
hasCTypes() const874d93d66dSAdrian McCarthy bool NativeExeSymbol::hasCTypes() const {
888ab7dd60SZachary Turner auto Dbi = Session.getPDBFile().getPDBDbiStream();
894d93d66dSAdrian McCarthy if (Dbi)
904d93d66dSAdrian McCarthy return Dbi->hasCTypes();
914d93d66dSAdrian McCarthy consumeError(Dbi.takeError());
924d93d66dSAdrian McCarthy return false;
934d93d66dSAdrian McCarthy }
944d93d66dSAdrian McCarthy
hasPrivateSymbols() const954d93d66dSAdrian McCarthy bool NativeExeSymbol::hasPrivateSymbols() const {
968ab7dd60SZachary Turner auto Dbi = Session.getPDBFile().getPDBDbiStream();
974d93d66dSAdrian McCarthy if (Dbi)
984d93d66dSAdrian McCarthy return !Dbi->isStripped();
994d93d66dSAdrian McCarthy consumeError(Dbi.takeError());
1004d93d66dSAdrian McCarthy return false;
1014d93d66dSAdrian McCarthy }
102