annotate lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp @ 148:63bd29f05246

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