LLVM  15.0.0git
PDBSymbol.h
Go to the documentation of this file.
1 //===- PDBSymbol.h - base class for user-facing symbol types -----*- 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 #ifndef LLVM_DEBUGINFO_PDB_PDBSYMBOL_H
10 #define LLVM_DEBUGINFO_PDB_PDBSYMBOL_H
11 
12 #include "IPDBRawSymbol.h"
13 #include "PDBExtras.h"
14 #include "PDBTypes.h"
15 #include "llvm/Support/Casting.h"
16 
17 #define FORWARD_SYMBOL_METHOD(MethodName) \
18  decltype(auto) MethodName() const { return RawSymbol->MethodName(); }
19 
20 #define FORWARD_CONCRETE_SYMBOL_ID_METHOD_WITH_NAME(ConcreteType, PrivateName, \
21  PublicName) \
22  decltype(auto) PublicName##Id() const { \
23  return RawSymbol->PrivateName##Id(); \
24  } \
25  std::unique_ptr<ConcreteType> PublicName() const { \
26  uint32_t Id = PublicName##Id(); \
27  return getConcreteSymbolByIdHelper<ConcreteType>(Id); \
28  }
29 
30 #define FORWARD_SYMBOL_ID_METHOD_WITH_NAME(PrivateName, PublicName) \
31  FORWARD_CONCRETE_SYMBOL_ID_METHOD_WITH_NAME(PDBSymbol, PrivateName, \
32  PublicName)
33 
34 #define FORWARD_SYMBOL_ID_METHOD(MethodName) \
35  FORWARD_SYMBOL_ID_METHOD_WITH_NAME(MethodName, MethodName)
36 
37 namespace llvm {
38 
39 class StringRef;
40 class raw_ostream;
41 
42 namespace pdb {
43 class IPDBSession;
44 class PDBSymDumper;
45 class PDBSymbol;
46 template <typename ChildType> class ConcreteSymbolEnumerator;
47 
48 #define DECLARE_PDB_SYMBOL_CONCRETE_TYPE(TagValue) \
49 private: \
50  using PDBSymbol::PDBSymbol; \
51  friend class PDBSymbol; \
52  \
53 public: \
54  static const PDB_SymType Tag = TagValue; \
55  static bool classof(const PDBSymbol *S) { return S->getSymTag() == Tag; }
56 
57 #define DECLARE_PDB_SYMBOL_CUSTOM_TYPE(Condition) \
58 private: \
59  using PDBSymbol::PDBSymbol; \
60  friend class PDBSymbol; \
61  \
62 public: \
63  static bool classof(const PDBSymbol *S) { return Condition; }
64 
65 /// PDBSymbol defines the base of the inheritance hierarchy for concrete symbol
66 /// types (e.g. functions, executables, vtables, etc). All concrete symbol
67 /// types inherit from PDBSymbol and expose the exact set of methods that are
68 /// valid for that particular symbol type, as described in the Microsoft
69 /// reference "Lexical and Class Hierarchy of Symbol Types":
70 /// https://msdn.microsoft.com/en-us/library/370hs6k4.aspx
71 class PDBSymbol {
72  static std::unique_ptr<PDBSymbol> createSymbol(const IPDBSession &PDBSession,
74 
75 protected:
76  explicit PDBSymbol(const IPDBSession &PDBSession);
78 
79 public:
80  static std::unique_ptr<PDBSymbol>
81  create(const IPDBSession &PDBSession,
82  std::unique_ptr<IPDBRawSymbol> RawSymbol);
83  static std::unique_ptr<PDBSymbol> create(const IPDBSession &PDBSession,
85 
86  template <typename ConcreteT>
87  static std::unique_ptr<ConcreteT>
88  createAs(const IPDBSession &PDBSession,
89  std::unique_ptr<IPDBRawSymbol> RawSymbol) {
90  std::unique_ptr<PDBSymbol> S = create(PDBSession, std::move(RawSymbol));
91  return unique_dyn_cast_or_null<ConcreteT>(std::move(S));
92  }
93  template <typename ConcreteT>
94  static std::unique_ptr<ConcreteT> createAs(const IPDBSession &PDBSession,
96  std::unique_ptr<PDBSymbol> S = create(PDBSession, RawSymbol);
97  return unique_dyn_cast_or_null<ConcreteT>(std::move(S));
98  }
99 
100  virtual ~PDBSymbol();
101 
102  /// Dumps the contents of a symbol a raw_ostream. By default this will just
103  /// call dump() on the underlying RawSymbol, which allows us to discover
104  /// unknown properties, but individual implementations of PDBSymbol may
105  /// override the behavior to only dump known fields.
106  virtual void dump(PDBSymDumper &Dumper) const = 0;
107 
108  /// For certain PDBSymbolTypes, dumps additional information for the type that
109  /// normally goes on the right side of the symbol.
110  virtual void dumpRight(PDBSymDumper &Dumper) const {}
111 
112  void defaultDump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowFlags,
113  PdbSymbolIdField RecurseFlags) const;
114  void dumpProperties() const;
115  void dumpChildStats() const;
116 
117  PDB_SymType getSymTag() const;
118  uint32_t getSymIndexId() const;
119 
120  template <typename T> std::unique_ptr<T> findOneChild() const {
121  auto Enumerator(findAllChildren<T>());
122  if (!Enumerator)
123  return nullptr;
124  return Enumerator->getNext();
125  }
126 
127  template <typename T>
128  std::unique_ptr<ConcreteSymbolEnumerator<T>> findAllChildren() const {
129  auto BaseIter = RawSymbol->findChildren(T::Tag);
130  if (!BaseIter)
131  return nullptr;
132  return std::make_unique<ConcreteSymbolEnumerator<T>>(std::move(BaseIter));
133  }
134  std::unique_ptr<IPDBEnumSymbols> findAllChildren(PDB_SymType Type) const;
135  std::unique_ptr<IPDBEnumSymbols> findAllChildren() const;
136 
137  std::unique_ptr<IPDBEnumSymbols>
139  PDB_NameSearchFlags Flags) const;
140  std::unique_ptr<IPDBEnumSymbols> findChildrenByRVA(PDB_SymType Type,
141  StringRef Name,
142  PDB_NameSearchFlags Flags,
143  uint32_t RVA) const;
144  std::unique_ptr<IPDBEnumSymbols> findInlineFramesByVA(uint64_t VA) const;
145  std::unique_ptr<IPDBEnumSymbols> findInlineFramesByRVA(uint32_t RVA) const;
146  std::unique_ptr<IPDBEnumLineNumbers>
147  findInlineeLinesByVA(uint64_t VA, uint32_t Length) const;
148  std::unique_ptr<IPDBEnumLineNumbers>
149  findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const;
150 
151  std::string getName() const;
152 
153  const IPDBRawSymbol &getRawSymbol() const { return *RawSymbol; }
155 
156  const IPDBSession &getSession() const { return Session; }
157 
158  std::unique_ptr<IPDBEnumSymbols> getChildStats(TagStats &Stats) const;
159 
160 protected:
161  std::unique_ptr<PDBSymbol> getSymbolByIdHelper(uint32_t Id) const;
162 
163  template <typename ConcreteType>
164  std::unique_ptr<ConcreteType> getConcreteSymbolByIdHelper(uint32_t Id) const {
165  return unique_dyn_cast_or_null<ConcreteType>(getSymbolByIdHelper(Id));
166  }
167 
169  std::unique_ptr<IPDBRawSymbol> OwnedRawSymbol;
171 };
172 
173 } // namespace llvm
174 }
175 
176 #endif
llvm::pdb::PDBSymbol::createAs
static std::unique_ptr< ConcreteT > createAs(const IPDBSession &PDBSession, IPDBRawSymbol &RawSymbol)
Definition: PDBSymbol.h:94
llvm::pdb::IPDBSession
IPDBSession defines an interface used to provide a context for querying debug information from a debu...
Definition: IPDBSession.h:25
llvm::pdb::PDBSymbol::getName
std::string getName() const
Definition: PDBSymbol.cpp:183
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:17
llvm::pdb::PDBSymbol::dumpChildStats
void dumpChildStats() const
Definition: PDBSymbol.cpp:129
llvm::pdb::PDBSymbol::OwnedRawSymbol
std::unique_ptr< IPDBRawSymbol > OwnedRawSymbol
Definition: PDBSymbol.h:169
IPDBRawSymbol.h
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
llvm::pdb::PDBSymbol::defaultDump
void defaultDump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowFlags, PdbSymbolIdField RecurseFlags) const
Definition: PDBSymbol.cpp:117
llvm::dwarf::Tag
Tag
Definition: Dwarf.h:105
llvm::pdb::PDB_SymType
PDB_SymType
These values correspond to the SymTagEnum enumeration, and are documented here: https://msdn....
Definition: PDBTypes.h:243
llvm::pdb::PDBSymbol::create
static std::unique_ptr< PDBSymbol > create(const IPDBSession &PDBSession, std::unique_ptr< IPDBRawSymbol > RawSymbol)
Definition: PDBSymbol.cpp:102
llvm::pdb::PDBSymbol::dump
virtual void dump(PDBSymDumper &Dumper) const =0
Dumps the contents of a symbol a raw_ostream.
llvm::pdb::IPDBRawSymbol::findChildren
virtual std::unique_ptr< IPDBEnumSymbols > findChildren(PDB_SymType Type) const =0
llvm::pdb::PDBSymbol::findInlineeLinesByRVA
std::unique_ptr< IPDBEnumLineNumbers > findInlineeLinesByRVA(uint32_t RVA, uint32_t Length) const
Definition: PDBSymbol.cpp:179
llvm::HighlightColor::Enumerator
@ Enumerator
llvm::pdb::PDBSymbol::PDBSymbol
PDBSymbol(const IPDBSession &PDBSession)
Definition: PDBSymbol.cpp:52
llvm::pdb::PDBSymbol::createAs
static std::unique_ptr< ConcreteT > createAs(const IPDBSession &PDBSession, std::unique_ptr< IPDBRawSymbol > RawSymbol)
Definition: PDBSymbol.h:88
llvm::pdb::PDBSymbol
PDBSymbol defines the base of the inheritance hierarchy for concrete symbol types (e....
Definition: PDBSymbol.h:71
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:54
llvm::pdb::PDBSymbol::~PDBSymbol
virtual ~PDBSymbol()
llvm::pdb::PDB_NameSearchFlags
PDB_NameSearchFlags
Defines flags used for enumerating child symbols.
Definition: PDBTypes.h:102
llvm::pdb::PDBSymbol::getSymbolByIdHelper
std::unique_ptr< PDBSymbol > getSymbolByIdHelper(uint32_t Id) const
Definition: PDBSymbol.cpp:198
PDBTypes.h
llvm::pdb::PDBSymbol::getSymIndexId
uint32_t getSymIndexId() const
Definition: PDBSymbol.cpp:140
llvm::pdb::PDBSymbol::getConcreteSymbolByIdHelper
std::unique_ptr< ConcreteType > getConcreteSymbolByIdHelper(uint32_t Id) const
Definition: PDBSymbol.h:164
llvm::pdb::PDBSymbol::getChildStats
std::unique_ptr< IPDBEnumSymbols > getChildStats(TagStats &Stats) const
Definition: PDBSymbol.cpp:186
llvm::pdb::PDBSymbol::findChildrenByRVA
std::unique_ptr< IPDBEnumSymbols > findChildrenByRVA(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags, uint32_t RVA) const
Definition: PDBSymbol.cpp:158
llvm::pdb::PDBSymbol::getRawSymbol
const IPDBRawSymbol & getRawSymbol() const
Definition: PDBSymbol.h:153
uint64_t
move
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
Definition: README.txt:546
llvm::pdb::PDBSymbol::findInlineeLinesByVA
std::unique_ptr< IPDBEnumLineNumbers > findInlineeLinesByVA(uint64_t VA, uint32_t Length) const
Definition: PDBSymbol.cpp:174
llvm::pdb::PDBSymbol::findOneChild
std::unique_ptr< T > findOneChild() const
Definition: PDBSymbol.h:120
llvm::pdb::PDBSymDumper
Definition: PDBSymDumper.h:19
llvm::pdb::PDBSymbol::Session
const IPDBSession & Session
Definition: PDBSymbol.h:168
llvm::pdb::PDBSymbol::getRawSymbol
IPDBRawSymbol & getRawSymbol()
Definition: PDBSymbol.h:154
llvm::pdb::PDBSymbol::findChildren
std::unique_ptr< IPDBEnumSymbols > findChildren(PDB_SymType Type, StringRef Name, PDB_NameSearchFlags Flags) const
Definition: PDBSymbol.cpp:152
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::pdb::PDBSymbol::RawSymbol
IPDBRawSymbol * RawSymbol
Definition: PDBSymbol.h:170
uint32_t
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::pdb::TagStats
std::unordered_map< PDB_SymType, int > TagStats
Definition: PDBExtras.h:23
llvm::GraphProgram::Name
Name
Definition: GraphWriter.h:50
Stats
block placement Basic Block Placement Stats
Definition: MachineBlockPlacement.cpp:3656
Casting.h
llvm::pdb::PDBSymbol::getSession
const IPDBSession & getSession() const
Definition: PDBSymbol.h:156
llvm::pdb::PDBSymbol::dumpRight
virtual void dumpRight(PDBSymDumper &Dumper) const
For certain PDBSymbolTypes, dumps additional information for the type that normally goes on the right...
Definition: PDBSymbol.h:110
llvm::pdb::PDBSymbol::getSymTag
PDB_SymType getSymTag() const
Definition: PDBSymbol.cpp:139
llvm::pdb::PdbSymbolIdField
PdbSymbolIdField
Definition: IPDBRawSymbol.h:24
llvm::pdb::PDBSymbol::findAllChildren
std::unique_ptr< ConcreteSymbolEnumerator< T > > findAllChildren() const
Definition: PDBSymbol.h:128
PDBExtras.h
llvm::pdb::IPDBRawSymbol
IPDBRawSymbol defines an interface used to represent an arbitrary symbol.
Definition: IPDBRawSymbol.h:45
llvm::AMDGPU::VGPRIndexMode::Id
Id
Definition: SIDefines.h:241
llvm::pdb::PDBSymbol::findInlineFramesByRVA
std::unique_ptr< IPDBEnumSymbols > findInlineFramesByRVA(uint32_t RVA) const
Definition: PDBSymbol.cpp:169
Other
Optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1237
llvm::pdb::PDBSymbol::dumpProperties
void dumpProperties() const
Definition: PDBSymbol.cpp:123
llvm::pdb::PDBSymbol::findInlineFramesByVA
std::unique_ptr< IPDBEnumSymbols > findInlineFramesByVA(uint64_t VA) const
Definition: PDBSymbol.cpp:164