class NativeTypeEnum : public NativeRawSymbol,
public codeview::TypeVisitorCallbacks {
public:
- NativeTypeEnum(NativeSession &Session, SymIndexId Id,
- const codeview::CVType &CV);
+ NativeTypeEnum(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI,
+ codeview::EnumRecord Record);
~NativeTypeEnum() override;
void dump(raw_ostream &OS, int Indent) const override;
bool isInterfaceUdt() const override;
protected:
- codeview::CVType CV;
+ codeview::TypeIndex Index;
codeview::EnumRecord Record;
};
class NativeTypePointer : public NativeRawSymbol {
public:
- NativeTypePointer(NativeSession &Session, SymIndexId Id, codeview::CVType CV);
NativeTypePointer(NativeSession &Session, SymIndexId Id,
- codeview::PointerRecord PR);
+ codeview::TypeIndex TI, codeview::PointerRecord PR);
~NativeTypePointer() override;
void dump(raw_ostream &OS, int Indent) const override;
bool isUnalignedType() const override;
protected:
+ codeview::TypeIndex TI;
codeview::PointerRecord Record;
};
return Id;
}
+ template <typename ConcreteSymbolT, typename CVRecordT, typename... Args>
+ SymIndexId createSymbolForType(codeview::TypeIndex TI, codeview::CVType CVT,
+ Args &&... ConstructorArgs) {
+ CVRecordT Record;
+ if (auto EC = TypeDeserializer::deserializeAs<CVRecordT>(CVT, Record)) {
+ consumeError(std::move(EC));
+ return 0;
+ }
+
+ return createSymbol<ConcreteSymbolT>(
+ TI, std::move(Record), std::forward<Args>(ConstructorArgs)...);
+ }
+
public:
SymbolCache(NativeSession &Session, DbiStream *Dbi);
template <typename ConcreteSymbolT, typename... Args>
SymIndexId createSymbol(Args &&... ConstructorArgs) {
SymIndexId Id = Cache.size();
- std::unique_ptr<ConcreteSymbolT> Symbol =
- llvm::make_unique<ConcreteSymbolT>(
- Session, Id, std::forward<Args>(ConstructorArgs)...);
- std::unique_ptr<NativeRawSymbol> NRS = std::move(Symbol);
- Cache.push_back(std::move(NRS));
+
+ auto Result = llvm::make_unique<ConcreteSymbolT>(
+ Session, Id, std::forward<Args>(ConstructorArgs)...);
+ Cache.push_back(std::move(Result));
return Id;
}
- std::unique_ptr<PDBSymbolTypeEnum>
- createEnumSymbol(codeview::TypeIndex Index);
-
std::unique_ptr<IPDBEnumSymbols>
createTypeEnumerator(codeview::TypeLeafKind Kind);
using namespace llvm::pdb;
NativeTypeEnum::NativeTypeEnum(NativeSession &Session, SymIndexId Id,
- const codeview::CVType &CVT)
- : NativeRawSymbol(Session, PDB_SymType::Enum, Id), CV(CVT),
- Record(codeview::TypeRecordKind::Enum) {
- assert(CV.kind() == codeview::TypeLeafKind::LF_ENUM);
- cantFail(visitTypeRecord(CV, *this));
-}
+ TypeIndex Index, EnumRecord Record)
+ : NativeRawSymbol(Session, PDB_SymType::Enum, Id), Index(Index),
+ Record(std::move(Record)) {}
NativeTypeEnum::~NativeTypeEnum() {}
using namespace llvm::pdb;
NativeTypePointer::NativeTypePointer(NativeSession &Session, SymIndexId Id,
- codeview::CVType CVT)
- : NativeRawSymbol(Session, PDB_SymType::PointerType, Id),
- Record(TypeRecordKind::Pointer) {
- assert(CVT.kind() == TypeLeafKind::LF_POINTER);
- cantFail(TypeDeserializer::deserializeAs<PointerRecord>(CVT, Record));
-}
-
-NativeTypePointer::NativeTypePointer(NativeSession &Session, SymIndexId Id,
- PointerRecord PR)
- : NativeRawSymbol(Session, PDB_SymType::PointerType, Id),
- Record(std::move(PR)) {}
+ codeview::TypeIndex TI,
+ codeview::PointerRecord Record)
+ : NativeRawSymbol(Session, PDB_SymType::PointerType, Id), TI(TI),
+ Record(std::move(Record)) {}
NativeTypePointer::~NativeTypePointer() {}
#include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
+#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
#include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h"
#include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
using namespace llvm;
+using namespace llvm::codeview;
using namespace llvm::pdb;
// Maps codeview::SimpleTypeKind of a built-in type to the parameters necessary
Compilands.resize(Dbi->modules().getModuleCount());
}
-std::unique_ptr<PDBSymbolTypeEnum>
-SymbolCache::createEnumSymbol(codeview::TypeIndex Index) {
- const auto Id = findSymbolByTypeIndex(Index);
- return PDBSymbol::createAs<PDBSymbolTypeEnum>(Session, *Cache[Id]);
-}
-
std::unique_ptr<IPDBEnumSymbols>
SymbolCache::createTypeEnumerator(codeview::TypeLeafKind Kind) {
auto Tpi = Session.getPDBFile().getPDBTpiStream();
return 0;
}
codeview::LazyRandomTypeCollection &Types = Tpi->typeCollection();
- const codeview::CVType &CVT = Types.getType(Index);
- // TODO(amccarth): Make this handle all types, not just LF_ENUMs.
+ codeview::CVType CVT = Types.getType(Index);
+ // TODO(amccarth): Make this handle all types.
SymIndexId Id = 0;
switch (CVT.kind()) {
case codeview::LF_ENUM:
- Id = createSymbol<NativeTypeEnum>(CVT);
+ Id = createSymbolForType<NativeTypeEnum, EnumRecord>(Index, std::move(CVT));
break;
case codeview::LF_POINTER:
- Id = createSymbol<NativeTypePointer>(CVT);
+ Id = createSymbolForType<NativeTypePointer, PointerRecord>(Index,
+ std::move(CVT));
break;
default:
Id = createSymbolPlaceholder();
break;
}
- TypeIndexToSymbolId[Index] = Id;
+ if (Id != 0)
+ TypeIndexToSymbolId[Index] = Id;
return Id;
}