DebugInfoPDB: Make the symbol base case hold an IPDBSession ref.

Dumping a symbol often requires access to data that isn't inside
the symbol hierarchy, but which is only accessible through the
top-level session.  This patch is a pure interface change to give
symbols a reference to the session.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228542 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zachary Turner
2015-02-08 20:58:09 +00:00
parent e755d452e0
commit 926749af90
65 changed files with 181 additions and 108 deletions

View File

@@ -36,11 +36,11 @@ class raw_ostream;
/// https://msdn.microsoft.com/en-us/library/370hs6k4.aspx /// https://msdn.microsoft.com/en-us/library/370hs6k4.aspx
class PDBSymbol { class PDBSymbol {
protected: protected:
PDBSymbol(std::unique_ptr<IPDBRawSymbol> Symbol); PDBSymbol(IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol);
public: public:
static std::unique_ptr<PDBSymbol> static std::unique_ptr<PDBSymbol>
create(std::unique_ptr<IPDBRawSymbol> Symbol); create(IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol);
virtual ~PDBSymbol(); virtual ~PDBSymbol();
@@ -62,6 +62,7 @@ public:
std::unique_ptr<IPDBEnumSymbols> findInlineFramesByRVA(uint32_t RVA) const; std::unique_ptr<IPDBEnumSymbols> findInlineFramesByRVA(uint32_t RVA) const;
protected: protected:
IPDBSession &Session;
const std::unique_ptr<IPDBRawSymbol> RawSymbol; const std::unique_ptr<IPDBRawSymbol> RawSymbol;
}; };

View File

@@ -20,7 +20,8 @@ class raw_ostream;
class PDBSymbolAnnotation : public PDBSymbol { class PDBSymbolAnnotation : public PDBSymbol {
public: public:
PDBSymbolAnnotation(std::unique_ptr<IPDBRawSymbol> AnnotationSymbol); PDBSymbolAnnotation(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -20,7 +20,8 @@ class raw_ostream;
class PDBSymbolBlock : public PDBSymbol { class PDBSymbolBlock : public PDBSymbol {
public: public:
PDBSymbolBlock(std::unique_ptr<IPDBRawSymbol> BlockSymbol); PDBSymbolBlock(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -20,7 +20,8 @@ class raw_ostream;
class PDBSymbolCompiland : public PDBSymbol { class PDBSymbolCompiland : public PDBSymbol {
public: public:
PDBSymbolCompiland(std::unique_ptr<IPDBRawSymbol> CompilandSymbol); PDBSymbolCompiland(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> CompilandSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolCompilandDetails : public PDBSymbol { class PDBSymbolCompilandDetails : public PDBSymbol {
public: public:
PDBSymbolCompilandDetails(std::unique_ptr<IPDBRawSymbol> DetailsSymbol); PDBSymbolCompilandDetails(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolCompilandEnv : public PDBSymbol { class PDBSymbolCompilandEnv : public PDBSymbol {
public: public:
PDBSymbolCompilandEnv(std::unique_ptr<IPDBRawSymbol> CompilandEnvSymbol); PDBSymbolCompilandEnv(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -24,7 +24,8 @@ class raw_ostream;
/// https://msdn.microsoft.com/en-us/library/d88sf09h.aspx /// https://msdn.microsoft.com/en-us/library/d88sf09h.aspx
class PDBSymbolCustom : public PDBSymbol { class PDBSymbolCustom : public PDBSymbol {
public: public:
PDBSymbolCustom(std::unique_ptr<IPDBRawSymbol> CustomSymbol); PDBSymbolCustom(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> CustomSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolData : public PDBSymbol { class PDBSymbolData : public PDBSymbol {
public: public:
PDBSymbolData(std::unique_ptr<IPDBRawSymbol> DataSymbol); PDBSymbolData(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> DataSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -23,7 +23,8 @@ class raw_ostream;
class PDBSymbolExe : public PDBSymbol { class PDBSymbolExe : public PDBSymbol {
public: public:
PDBSymbolExe(std::unique_ptr<IPDBRawSymbol> ExeSymbol); PDBSymbolExe(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> ExeSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolFunc : public PDBSymbol { class PDBSymbolFunc : public PDBSymbol {
public: public:
PDBSymbolFunc(std::unique_ptr<IPDBRawSymbol> FuncSymbol); PDBSymbolFunc(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> FuncSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolFuncDebugEnd : public PDBSymbol { class PDBSymbolFuncDebugEnd : public PDBSymbol {
public: public:
PDBSymbolFuncDebugEnd(std::unique_ptr<IPDBRawSymbol> FuncDebugEndSymbol); PDBSymbolFuncDebugEnd(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> FuncDebugEndSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolFuncDebugStart : public PDBSymbol { class PDBSymbolFuncDebugStart : public PDBSymbol {
public: public:
PDBSymbolFuncDebugStart(std::unique_ptr<IPDBRawSymbol> FuncDebugStartSymbol); PDBSymbolFuncDebugStart(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> FuncDebugStartSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolLabel : public PDBSymbol { class PDBSymbolLabel : public PDBSymbol {
public: public:
PDBSymbolLabel(std::unique_ptr<IPDBRawSymbol> LabelSymbol); PDBSymbolLabel(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> LabelSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolPublicSymbol : public PDBSymbol { class PDBSymbolPublicSymbol : public PDBSymbol {
public: public:
PDBSymbolPublicSymbol(std::unique_ptr<IPDBRawSymbol> PublicSymbol); PDBSymbolPublicSymbol(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> PublicSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -21,7 +21,8 @@ class raw_ostream;
class PDBSymbolThunk : public PDBSymbol { class PDBSymbolThunk : public PDBSymbol {
public: public:
PDBSymbolThunk(std::unique_ptr<IPDBRawSymbol> ThunkSymbol); PDBSymbolThunk(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> ThunkSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeArray : public PDBSymbol { class PDBSymbolTypeArray : public PDBSymbol {
public: public:
PDBSymbolTypeArray(std::unique_ptr<IPDBRawSymbol> ArrayTypeSymbol); PDBSymbolTypeArray(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> ArrayTypeSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeBaseClass : public PDBSymbol { class PDBSymbolTypeBaseClass : public PDBSymbol {
public: public:
PDBSymbolTypeBaseClass(std::unique_ptr<IPDBRawSymbol> BaseClassTypeSymbol); PDBSymbolTypeBaseClass(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeBuiltin : public PDBSymbol { class PDBSymbolTypeBuiltin : public PDBSymbol {
public: public:
PDBSymbolTypeBuiltin(std::unique_ptr<IPDBRawSymbol> BuiltinTypeSymbol); PDBSymbolTypeBuiltin(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeCustom : public PDBSymbol { class PDBSymbolTypeCustom : public PDBSymbol {
public: public:
PDBSymbolTypeCustom(std::unique_ptr<IPDBRawSymbol> CustomTypeSymbol); PDBSymbolTypeCustom(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeDimension : public PDBSymbol { class PDBSymbolTypeDimension : public PDBSymbol {
public: public:
PDBSymbolTypeDimension(std::unique_ptr<IPDBRawSymbol> DimensionTypeSymbol); PDBSymbolTypeDimension(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeEnum : public PDBSymbol { class PDBSymbolTypeEnum : public PDBSymbol {
public: public:
PDBSymbolTypeEnum(std::unique_ptr<IPDBRawSymbol> EnumTypeSymbol); PDBSymbolTypeEnum(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> EnumTypeSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeFriend : public PDBSymbol { class PDBSymbolTypeFriend : public PDBSymbol {
public: public:
PDBSymbolTypeFriend(std::unique_ptr<IPDBRawSymbol> FriendTypeSymbol); PDBSymbolTypeFriend(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeFunctionArg : public PDBSymbol { class PDBSymbolTypeFunctionArg : public PDBSymbol {
public: public:
PDBSymbolTypeFunctionArg(std::unique_ptr<IPDBRawSymbol> FuncArgTypeSymbol); PDBSymbolTypeFunctionArg(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeFunctionSig : public PDBSymbol { class PDBSymbolTypeFunctionSig : public PDBSymbol {
public: public:
PDBSymbolTypeFunctionSig(std::unique_ptr<IPDBRawSymbol> FuncSigTypeSymbol); PDBSymbolTypeFunctionSig(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeManaged : public PDBSymbol { class PDBSymbolTypeManaged : public PDBSymbol {
public: public:
PDBSymbolTypeManaged(std::unique_ptr<IPDBRawSymbol> ManagedTypeSymbol); PDBSymbolTypeManaged(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypePointer : public PDBSymbol { class PDBSymbolTypePointer : public PDBSymbol {
public: public:
PDBSymbolTypePointer(std::unique_ptr<IPDBRawSymbol> PointerTypeSymbol); PDBSymbolTypePointer(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeTypedef : public PDBSymbol { class PDBSymbolTypeTypedef : public PDBSymbol {
public: public:
PDBSymbolTypeTypedef(std::unique_ptr<IPDBRawSymbol> TypedefSymbol); PDBSymbolTypeTypedef(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeUDT : public PDBSymbol { class PDBSymbolTypeUDT : public PDBSymbol {
public: public:
PDBSymbolTypeUDT(std::unique_ptr<IPDBRawSymbol> UDTSymbol); PDBSymbolTypeUDT(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> UDTSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeVTable : public PDBSymbol { class PDBSymbolTypeVTable : public PDBSymbol {
public: public:
PDBSymbolTypeVTable(std::unique_ptr<IPDBRawSymbol> VtblSymbol); PDBSymbolTypeVTable(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> VtblSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolTypeVTableShape : public PDBSymbol { class PDBSymbolTypeVTableShape : public PDBSymbol {
public: public:
PDBSymbolTypeVTableShape(std::unique_ptr<IPDBRawSymbol> VtblShapeSymbol); PDBSymbolTypeVTableShape(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> VtblShapeSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolUnknown : public PDBSymbol { class PDBSymbolUnknown : public PDBSymbol {
public: public:
PDBSymbolUnknown(std::unique_ptr<IPDBRawSymbol> UnknownSymbol); PDBSymbolUnknown(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> UnknownSymbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -19,7 +19,8 @@ class raw_ostream;
class PDBSymbolUsingNamespace : public PDBSymbol { class PDBSymbolUsingNamespace : public PDBSymbol {
public: public:
PDBSymbolUsingNamespace(std::unique_ptr<IPDBRawSymbol> UsingSymbol); PDBSymbolUsingNamespace(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol);
void dump(llvm::raw_ostream &OS) const override; void dump(llvm::raw_ostream &OS) const override;

View File

@@ -48,17 +48,19 @@
using namespace llvm; using namespace llvm;
PDBSymbol::PDBSymbol(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbol::PDBSymbol(IPDBSession &PDBSession,
: RawSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: Session(PDBSession), RawSymbol(std::move(Symbol)) {}
PDBSymbol::~PDBSymbol() {} PDBSymbol::~PDBSymbol() {}
#define FACTORY_SYMTAG_CASE(Tag, Type) \ #define FACTORY_SYMTAG_CASE(Tag, Type) \
case PDB_SymType::Tag: \ case PDB_SymType::Tag: \
return std::unique_ptr<PDBSymbol>(new Type(std::move(Symbol))); return std::unique_ptr<PDBSymbol>(new Type(PDBSession, std::move(Symbol)));
std::unique_ptr<PDBSymbol> std::unique_ptr<PDBSymbol>
PDBSymbol::create(std::unique_ptr<IPDBRawSymbol> Symbol) { PDBSymbol::create(IPDBSession &PDBSession,
std::unique_ptr<IPDBRawSymbol> Symbol) {
switch (Symbol->getSymTag()) { switch (Symbol->getSymTag()) {
FACTORY_SYMTAG_CASE(Exe, PDBSymbolExe) FACTORY_SYMTAG_CASE(Exe, PDBSymbolExe)
FACTORY_SYMTAG_CASE(Compiland, PDBSymbolCompiland) FACTORY_SYMTAG_CASE(Compiland, PDBSymbolCompiland)
@@ -91,7 +93,8 @@ PDBSymbol::create(std::unique_ptr<IPDBRawSymbol> Symbol) {
FACTORY_SYMTAG_CASE(ManagedType, PDBSymbolTypeManaged) FACTORY_SYMTAG_CASE(ManagedType, PDBSymbolTypeManaged)
FACTORY_SYMTAG_CASE(Dimension, PDBSymbolTypeDimension) FACTORY_SYMTAG_CASE(Dimension, PDBSymbolTypeDimension)
default: default:
return std::unique_ptr<PDBSymbol>(new PDBSymbolUnknown(std::move(Symbol))); return std::unique_ptr<PDBSymbol>(
new PDBSymbolUnknown(PDBSession, std::move(Symbol)));
} }
} }

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolAnnotation::PDBSymbolAnnotation(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolAnnotation::PDBSymbolAnnotation(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolAnnotation::dump(llvm::raw_ostream &OS) const {} void PDBSymbolAnnotation::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolBlock::PDBSymbolBlock(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolBlock::PDBSymbolBlock(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolBlock::dump(llvm::raw_ostream &OS) const {} void PDBSymbolBlock::dump(llvm::raw_ostream &OS) const {}

View File

@@ -17,8 +17,9 @@
using namespace llvm; using namespace llvm;
PDBSymbolCompiland::PDBSymbolCompiland(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolCompiland::PDBSymbolCompiland(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolCompiland::dump(llvm::raw_ostream &OS) const { void PDBSymbolCompiland::dump(llvm::raw_ostream &OS) const {
} }

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolCompilandDetails::PDBSymbolCompilandDetails( PDBSymbolCompilandDetails::PDBSymbolCompilandDetails(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolCompilandDetails::dump(llvm::raw_ostream &OS) const {} void PDBSymbolCompilandDetails::dump(llvm::raw_ostream &OS) const {}

View File

@@ -16,8 +16,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolCompilandEnv::PDBSymbolCompilandEnv( PDBSymbolCompilandEnv::PDBSymbolCompilandEnv(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
std::string PDBSymbolCompilandEnv::getValue() const { std::string PDBSymbolCompilandEnv::getValue() const {
// call RawSymbol->getValue() and convert the result to an std::string. // call RawSymbol->getValue() and convert the result to an std::string.

View File

@@ -15,8 +15,9 @@
using namespace llvm; using namespace llvm;
PDBSymbolCustom::PDBSymbolCustom(std::unique_ptr<IPDBRawSymbol> CustomSymbol) PDBSymbolCustom::PDBSymbolCustom(IPDBSession &PDBSession,
: PDBSymbol(std::move(CustomSymbol)) {} std::unique_ptr<IPDBRawSymbol> CustomSymbol)
: PDBSymbol(PDBSession, std::move(CustomSymbol)) {}
void PDBSymbolCustom::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) { void PDBSymbolCustom::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) {
RawSymbol->getDataBytes(bytes); RawSymbol->getDataBytes(bytes);

View File

@@ -7,11 +7,13 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include <utility>
#include "llvm/DebugInfo/PDB/PDBSymbolData.h" #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
using namespace llvm; using namespace llvm;
PDBSymbolData::PDBSymbolData(std::unique_ptr<IPDBRawSymbol> DataSymbol) PDBSymbolData::PDBSymbolData(IPDBSession &PDBSession,
: PDBSymbol(std::move(DataSymbol)) {} std::unique_ptr<IPDBRawSymbol> DataSymbol)
: PDBSymbol(PDBSession, std::move(DataSymbol)) {}
void PDBSymbolData::dump(llvm::raw_ostream &OS) const {} void PDBSymbolData::dump(llvm::raw_ostream &OS) const {}

View File

@@ -17,8 +17,9 @@
using namespace llvm; using namespace llvm;
PDBSymbolExe::PDBSymbolExe(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolExe::PDBSymbolExe(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolExe::dump(llvm::raw_ostream &OS) const { void PDBSymbolExe::dump(llvm::raw_ostream &OS) const {
} }

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolFunc::PDBSymbolFunc(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolFunc::PDBSymbolFunc(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolFunc::dump(llvm::raw_ostream &OS) const {} void PDBSymbolFunc::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolFuncDebugEnd::PDBSymbolFuncDebugEnd( PDBSymbolFuncDebugEnd::PDBSymbolFuncDebugEnd(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolFuncDebugEnd::dump(llvm::raw_ostream &OS) const {} void PDBSymbolFuncDebugEnd::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolFuncDebugStart::PDBSymbolFuncDebugStart( PDBSymbolFuncDebugStart::PDBSymbolFuncDebugStart(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolFuncDebugStart::dump(llvm::raw_ostream &OS) const {} void PDBSymbolFuncDebugStart::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolLabel::PDBSymbolLabel(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolLabel::PDBSymbolLabel(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolLabel::dump(llvm::raw_ostream &OS) const {} void PDBSymbolLabel::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolPublicSymbol::PDBSymbolPublicSymbol( PDBSymbolPublicSymbol::PDBSymbolPublicSymbol(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolPublicSymbol::dump(llvm::raw_ostream &OS) const {} void PDBSymbolPublicSymbol::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolThunk::PDBSymbolThunk(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolThunk::PDBSymbolThunk(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolThunk::dump(llvm::raw_ostream &OS) const {} void PDBSymbolThunk::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeArray::PDBSymbolTypeArray(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeArray::PDBSymbolTypeArray(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeArray::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeArray::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeBaseClass::PDBSymbolTypeBaseClass( PDBSymbolTypeBaseClass::PDBSymbolTypeBaseClass(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(Session, std::move(Symbol)) {}
void PDBSymbolTypeBaseClass::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeBaseClass::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeBuiltin::PDBSymbolTypeBuiltin( PDBSymbolTypeBuiltin::PDBSymbolTypeBuiltin(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeBuiltin::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeBuiltin::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeCustom::PDBSymbolTypeCustom(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeCustom::PDBSymbolTypeCustom(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeCustom::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeCustom::dump(llvm::raw_ostream &OS) const {}

View File

@@ -16,7 +16,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeDimension::PDBSymbolTypeDimension( PDBSymbolTypeDimension::PDBSymbolTypeDimension(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeDimension::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeDimension::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeEnum::PDBSymbolTypeEnum(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeEnum::PDBSymbolTypeEnum(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeEnum::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeEnum::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeFriend::PDBSymbolTypeFriend(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeFriend::PDBSymbolTypeFriend(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeFriend::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeFriend::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeFunctionArg::PDBSymbolTypeFunctionArg( PDBSymbolTypeFunctionArg::PDBSymbolTypeFunctionArg(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeFunctionArg::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeFunctionArg::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeFunctionSig::PDBSymbolTypeFunctionSig( PDBSymbolTypeFunctionSig::PDBSymbolTypeFunctionSig(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeFunctionSig::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeFunctionSig::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeManaged::PDBSymbolTypeManaged( PDBSymbolTypeManaged::PDBSymbolTypeManaged(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeManaged::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeManaged::dump(llvm::raw_ostream &OS) const {}

View File

@@ -16,7 +16,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypePointer::PDBSymbolTypePointer( PDBSymbolTypePointer::PDBSymbolTypePointer(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypePointer::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypePointer::dump(llvm::raw_ostream &OS) const {}

View File

@@ -16,7 +16,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeTypedef::PDBSymbolTypeTypedef( PDBSymbolTypeTypedef::PDBSymbolTypeTypedef(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeTypedef::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeTypedef::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeUDT::PDBSymbolTypeUDT(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeUDT::PDBSymbolTypeUDT(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeUDT::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeUDT::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeVTable::PDBSymbolTypeVTable(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolTypeVTable::PDBSymbolTypeVTable(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeVTable::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeVTable::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolTypeVTableShape::PDBSymbolTypeVTableShape( PDBSymbolTypeVTableShape::PDBSymbolTypeVTableShape(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolTypeVTableShape::dump(llvm::raw_ostream &OS) const {} void PDBSymbolTypeVTableShape::dump(llvm::raw_ostream &OS) const {}

View File

@@ -14,7 +14,8 @@
using namespace llvm; using namespace llvm;
PDBSymbolUnknown::PDBSymbolUnknown(std::unique_ptr<IPDBRawSymbol> Symbol) PDBSymbolUnknown::PDBSymbolUnknown(IPDBSession &PDBSession,
: PDBSymbol(std::move(Symbol)) {} std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolUnknown::dump(llvm::raw_ostream &OS) const {} void PDBSymbolUnknown::dump(llvm::raw_ostream &OS) const {}

View File

@@ -15,7 +15,7 @@
using namespace llvm; using namespace llvm;
PDBSymbolUsingNamespace::PDBSymbolUsingNamespace( PDBSymbolUsingNamespace::PDBSymbolUsingNamespace(
std::unique_ptr<IPDBRawSymbol> Symbol) IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
: PDBSymbol(std::move(Symbol)) {} : PDBSymbol(PDBSession, std::move(Symbol)) {}
void PDBSymbolUsingNamespace::dump(llvm::raw_ostream &OS) const {} void PDBSymbolUsingNamespace::dump(llvm::raw_ostream &OS) const {}

View File

@@ -12,6 +12,9 @@
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h" #include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h" #include "llvm/DebugInfo/PDB/PDBSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolAnnotation.h" #include "llvm/DebugInfo/PDB/PDBSymbolAnnotation.h"
#include "llvm/DebugInfo/PDB/PDBSymbolBlock.h" #include "llvm/DebugInfo/PDB/PDBSymbolBlock.h"
@@ -66,6 +69,21 @@ namespace {
return ReturnType(); \ return ReturnType(); \
} }
class MockSession : public IPDBSession {
uint64_t getLoadAddress() const override { return 0; }
void setLoadAddress(uint64_t Address) override {}
std::unique_ptr<PDBSymbolExe> getGlobalScope() const override {
return nullptr;
}
std::unique_ptr<PDBSymbol> getSymbolById() const override { return nullptr; }
std::unique_ptr<IPDBSourceFile> getSourceFileById() const override {
return nullptr;
}
std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const override {
return nullptr;
}
};
class MockRawSymbol : public IPDBRawSymbol { class MockRawSymbol : public IPDBRawSymbol {
public: public:
MockRawSymbol(PDB_SymType SymType) : Type(SymType) {} MockRawSymbol(PDB_SymType SymType) : Type(SymType) {}
@@ -257,6 +275,8 @@ public:
std::unordered_map<PDB_SymType, std::unique_ptr<PDBSymbol>> SymbolMap; std::unordered_map<PDB_SymType, std::unique_ptr<PDBSymbol>> SymbolMap;
void SetUp() override { void SetUp() override {
Session.reset(new MockSession());
InsertItemWithTag(PDB_SymType::None); InsertItemWithTag(PDB_SymType::None);
InsertItemWithTag(PDB_SymType::Exe); InsertItemWithTag(PDB_SymType::Exe);
InsertItemWithTag(PDB_SymType::Compiland); InsertItemWithTag(PDB_SymType::Compiland);
@@ -291,14 +311,6 @@ public:
InsertItemWithTag(PDB_SymType::Max); InsertItemWithTag(PDB_SymType::Max);
} }
private:
void InsertItemWithTag(PDB_SymType Tag) {
auto RawSymbol = std::unique_ptr<IPDBRawSymbol>(new MockRawSymbol(Tag));
auto Symbol = PDBSymbol::create(std::move(RawSymbol));
SymbolMap.insert(std::make_pair(Tag, std::move(Symbol)));
}
public:
template <class ExpectedType> void VerifyDyncast(PDB_SymType Tag) { template <class ExpectedType> void VerifyDyncast(PDB_SymType Tag) {
for (auto item = SymbolMap.begin(); item != SymbolMap.end(); ++item) { for (auto item = SymbolMap.begin(); item != SymbolMap.end(); ++item) {
EXPECT_EQ(item->first == Tag, llvm::isa<ExpectedType>(*item->second)); EXPECT_EQ(item->first == Tag, llvm::isa<ExpectedType>(*item->second));
@@ -314,6 +326,15 @@ public:
EXPECT_EQ(should_match, llvm::isa<PDBSymbolUnknown>(*item->second)); EXPECT_EQ(should_match, llvm::isa<PDBSymbolUnknown>(*item->second));
} }
} }
private:
std::unique_ptr<IPDBSession> Session;
void InsertItemWithTag(PDB_SymType Tag) {
auto RawSymbol = std::unique_ptr<IPDBRawSymbol>(new MockRawSymbol(Tag));
auto Symbol = PDBSymbol::create(*Session, std::move(RawSymbol));
SymbolMap.insert(std::make_pair(Tag, std::move(Symbol)));
}
}; };
TEST_F(PDBApiTest, Dyncast) { TEST_F(PDBApiTest, Dyncast) {