Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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,
73
                                                 PDB_SymType Tag);
74
 
75
protected:
76
  explicit PDBSymbol(const IPDBSession &PDBSession);
77
  PDBSymbol(PDBSymbol &&Other);
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,
84
                                           IPDBRawSymbol &RawSymbol);
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,
95
                                             IPDBRawSymbol &RawSymbol) {
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>
138
  findChildren(PDB_SymType Type, StringRef Name,
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; }
154
  IPDBRawSymbol &getRawSymbol() { 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
 
168
  const IPDBSession &Session;
169
  std::unique_ptr<IPDBRawSymbol> OwnedRawSymbol;
170
  IPDBRawSymbol *RawSymbol = nullptr;
171
};
172
 
173
} // namespace llvm
174
}
175
 
176
#endif