xref: /freebsd/contrib/llvm-project/llvm/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"
100b57cec5SDimitry Andric 
11*81ad6265SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h"
12*81ad6265SDimitry Andric #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
130b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
140b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
150b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h"
16*81ad6265SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
170b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
180b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric using namespace llvm;
210b57cec5SDimitry Andric using namespace llvm::pdb;
220b57cec5SDimitry Andric 
getDbiStreamPtr(NativeSession & Session)230b57cec5SDimitry Andric static DbiStream *getDbiStreamPtr(NativeSession &Session) {
240b57cec5SDimitry Andric   Expected<DbiStream &> DbiS = Session.getPDBFile().getPDBDbiStream();
250b57cec5SDimitry Andric   if (DbiS)
260b57cec5SDimitry Andric     return &DbiS.get();
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric   consumeError(DbiS.takeError());
290b57cec5SDimitry Andric   return nullptr;
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
NativeExeSymbol(NativeSession & Session,SymIndexId SymbolId)320b57cec5SDimitry Andric NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)
330b57cec5SDimitry Andric     : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId),
340b57cec5SDimitry Andric       Dbi(getDbiStreamPtr(Session)) {}
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const370b57cec5SDimitry Andric NativeExeSymbol::findChildren(PDB_SymType Type) const {
380b57cec5SDimitry Andric   switch (Type) {
390b57cec5SDimitry Andric   case PDB_SymType::Compiland: {
400b57cec5SDimitry Andric     return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session));
410b57cec5SDimitry Andric     break;
420b57cec5SDimitry Andric   }
430b57cec5SDimitry Andric   case PDB_SymType::ArrayType:
440b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ARRAY);
450b57cec5SDimitry Andric   case PDB_SymType::Enum:
460b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM);
470b57cec5SDimitry Andric   case PDB_SymType::PointerType:
480b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER);
490b57cec5SDimitry Andric   case PDB_SymType::UDT:
500b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(
510b57cec5SDimitry Andric         {codeview::LF_STRUCTURE, codeview::LF_CLASS, codeview::LF_UNION,
520b57cec5SDimitry Andric          codeview::LF_INTERFACE});
530b57cec5SDimitry Andric   case PDB_SymType::VTableShape:
540b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(codeview::LF_VTSHAPE);
550b57cec5SDimitry Andric   case PDB_SymType::FunctionSig:
560b57cec5SDimitry Andric     return Session.getSymbolCache().createTypeEnumerator(
570b57cec5SDimitry Andric         {codeview::LF_PROCEDURE, codeview::LF_MFUNCTION});
580b57cec5SDimitry Andric   case PDB_SymType::Typedef:
590b57cec5SDimitry Andric     return Session.getSymbolCache().createGlobalsEnumerator(codeview::S_UDT);
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric   default:
620b57cec5SDimitry Andric     break;
630b57cec5SDimitry Andric   }
640b57cec5SDimitry Andric   return nullptr;
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
getAge() const670b57cec5SDimitry Andric uint32_t NativeExeSymbol::getAge() const {
680b57cec5SDimitry Andric   auto IS = Session.getPDBFile().getPDBInfoStream();
690b57cec5SDimitry Andric   if (IS)
700b57cec5SDimitry Andric     return IS->getAge();
710b57cec5SDimitry Andric   consumeError(IS.takeError());
720b57cec5SDimitry Andric   return 0;
730b57cec5SDimitry Andric }
740b57cec5SDimitry Andric 
getSymbolsFileName() const750b57cec5SDimitry Andric std::string NativeExeSymbol::getSymbolsFileName() const {
765ffd83dbSDimitry Andric   return std::string(Session.getPDBFile().getFilePath());
770b57cec5SDimitry Andric }
780b57cec5SDimitry Andric 
getGuid() const790b57cec5SDimitry Andric codeview::GUID NativeExeSymbol::getGuid() const {
800b57cec5SDimitry Andric   auto IS = Session.getPDBFile().getPDBInfoStream();
810b57cec5SDimitry Andric   if (IS)
820b57cec5SDimitry Andric     return IS->getGuid();
830b57cec5SDimitry Andric   consumeError(IS.takeError());
840b57cec5SDimitry Andric   return codeview::GUID{{0}};
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
hasCTypes() const870b57cec5SDimitry Andric bool NativeExeSymbol::hasCTypes() const {
880b57cec5SDimitry Andric   auto Dbi = Session.getPDBFile().getPDBDbiStream();
890b57cec5SDimitry Andric   if (Dbi)
900b57cec5SDimitry Andric     return Dbi->hasCTypes();
910b57cec5SDimitry Andric   consumeError(Dbi.takeError());
920b57cec5SDimitry Andric   return false;
930b57cec5SDimitry Andric }
940b57cec5SDimitry Andric 
hasPrivateSymbols() const950b57cec5SDimitry Andric bool NativeExeSymbol::hasPrivateSymbols() const {
960b57cec5SDimitry Andric   auto Dbi = Session.getPDBFile().getPDBDbiStream();
970b57cec5SDimitry Andric   if (Dbi)
980b57cec5SDimitry Andric     return !Dbi->isStripped();
990b57cec5SDimitry Andric   consumeError(Dbi.takeError());
1000b57cec5SDimitry Andric   return false;
1010b57cec5SDimitry Andric }
102