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