1 //===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"
10
11 #include "llvm/DebugInfo/CodeView/CodeView.h"
12 #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
13 #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
14 #include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h"
15 #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
16 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
17 #include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
18
19 using namespace llvm;
20 using namespace llvm::pdb;
21
getDbiStreamPtr(NativeSession & Session)22 static DbiStream *getDbiStreamPtr(NativeSession &Session) {
23 Expected<DbiStream &> DbiS = Session.getPDBFile().getPDBDbiStream();
24 if (DbiS)
25 return &DbiS.get();
26
27 consumeError(DbiS.takeError());
28 return nullptr;
29 }
30
NativeExeSymbol(NativeSession & Session,SymIndexId SymbolId)31 NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)
32 : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId),
33 Dbi(getDbiStreamPtr(Session)) {}
34
35 std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const36 NativeExeSymbol::findChildren(PDB_SymType Type) const {
37 switch (Type) {
38 case PDB_SymType::Compiland: {
39 return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session));
40 break;
41 }
42 case PDB_SymType::ArrayType:
43 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ARRAY);
44 case PDB_SymType::Enum:
45 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM);
46 case PDB_SymType::PointerType:
47 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER);
48 case PDB_SymType::UDT:
49 return Session.getSymbolCache().createTypeEnumerator(
50 {codeview::LF_STRUCTURE, codeview::LF_CLASS, codeview::LF_UNION,
51 codeview::LF_INTERFACE});
52 case PDB_SymType::VTableShape:
53 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_VTSHAPE);
54 case PDB_SymType::FunctionSig:
55 return Session.getSymbolCache().createTypeEnumerator(
56 {codeview::LF_PROCEDURE, codeview::LF_MFUNCTION});
57 case PDB_SymType::Typedef:
58 return Session.getSymbolCache().createGlobalsEnumerator(codeview::S_UDT);
59
60 default:
61 break;
62 }
63 return nullptr;
64 }
65
getAge() const66 uint32_t NativeExeSymbol::getAge() const {
67 auto IS = Session.getPDBFile().getPDBInfoStream();
68 if (IS)
69 return IS->getAge();
70 consumeError(IS.takeError());
71 return 0;
72 }
73
getSymbolsFileName() const74 std::string NativeExeSymbol::getSymbolsFileName() const {
75 return std::string(Session.getPDBFile().getFilePath());
76 }
77
getGuid() const78 codeview::GUID NativeExeSymbol::getGuid() const {
79 auto IS = Session.getPDBFile().getPDBInfoStream();
80 if (IS)
81 return IS->getGuid();
82 consumeError(IS.takeError());
83 return codeview::GUID{{0}};
84 }
85
hasCTypes() const86 bool NativeExeSymbol::hasCTypes() const {
87 auto Dbi = Session.getPDBFile().getPDBDbiStream();
88 if (Dbi)
89 return Dbi->hasCTypes();
90 consumeError(Dbi.takeError());
91 return false;
92 }
93
hasPrivateSymbols() const94 bool NativeExeSymbol::hasPrivateSymbols() const {
95 auto Dbi = Session.getPDBFile().getPDBDbiStream();
96 if (Dbi)
97 return !Dbi->isStripped();
98 consumeError(Dbi.takeError());
99 return false;
100 }
101