| //===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include "llvm/DebugInfo/PDB/Native/DbiStream.h" | |
| #include "llvm/DebugInfo/PDB/Native/InfoStream.h" | |
| #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h" | |
| #include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h" | |
| #include "llvm/DebugInfo/PDB/Native/PDBFile.h" | |
| #include "llvm/DebugInfo/PDB/Native/SymbolCache.h" | |
| #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" | |
| using namespace llvm; | |
| using namespace llvm::pdb; | |
| static DbiStream *getDbiStreamPtr(NativeSession &Session) { | |
| Expected<DbiStream &> DbiS = Session.getPDBFile().getPDBDbiStream(); | |
| if (DbiS) | |
| return &DbiS.get(); | |
| consumeError(DbiS.takeError()); | |
| return nullptr; | |
| } | |
| NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId) | |
| : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId), | |
| Dbi(getDbiStreamPtr(Session)) {} | |
| std::unique_ptr<IPDBEnumSymbols> | |
| NativeExeSymbol::findChildren(PDB_SymType Type) const { | |
| switch (Type) { | |
| case PDB_SymType::Compiland: { | |
| return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session)); | |
| break; | |
| } | |
| case PDB_SymType::ArrayType: | |
| return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ARRAY); | |
| case PDB_SymType::Enum: | |
| return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM); | |
| case PDB_SymType::PointerType: | |
| return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER); | |
| case PDB_SymType::UDT: | |
| return Session.getSymbolCache().createTypeEnumerator( | |
| {codeview::LF_STRUCTURE, codeview::LF_CLASS, codeview::LF_UNION, | |
| codeview::LF_INTERFACE}); | |
| case PDB_SymType::VTableShape: | |
| return Session.getSymbolCache().createTypeEnumerator(codeview::LF_VTSHAPE); | |
| case PDB_SymType::FunctionSig: | |
| return Session.getSymbolCache().createTypeEnumerator( | |
| {codeview::LF_PROCEDURE, codeview::LF_MFUNCTION}); | |
| case PDB_SymType::Typedef: | |
| return Session.getSymbolCache().createGlobalsEnumerator(codeview::S_UDT); | |
| default: | |
| break; | |
| } | |
| return nullptr; | |
| } | |
| uint32_t NativeExeSymbol::getAge() const { | |
| auto IS = Session.getPDBFile().getPDBInfoStream(); | |
| if (IS) | |
| return IS->getAge(); | |
| consumeError(IS.takeError()); | |
| return 0; | |
| } | |
| std::string NativeExeSymbol::getSymbolsFileName() const { | |
| return Session.getPDBFile().getFilePath(); | |
| } | |
| codeview::GUID NativeExeSymbol::getGuid() const { | |
| auto IS = Session.getPDBFile().getPDBInfoStream(); | |
| if (IS) | |
| return IS->getGuid(); | |
| consumeError(IS.takeError()); | |
| return codeview::GUID{{0}}; | |
| } | |
| bool NativeExeSymbol::hasCTypes() const { | |
| auto Dbi = Session.getPDBFile().getPDBDbiStream(); | |
| if (Dbi) | |
| return Dbi->hasCTypes(); | |
| consumeError(Dbi.takeError()); | |
| return false; | |
| } | |
| bool NativeExeSymbol::hasPrivateSymbols() const { | |
| auto Dbi = Session.getPDBFile().getPDBDbiStream(); | |
| if (Dbi) | |
| return !Dbi->isStripped(); | |
| consumeError(Dbi.takeError()); | |
| return false; | |
| } |