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