aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/DebugInfo/PDB/Native
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/DebugInfo/PDB/Native')
-rw-r--r--include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h3
-rw-r--r--include/llvm/DebugInfo/PDB/Native/DbiStream.h2
-rw-r--r--include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h13
-rw-r--r--include/llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h1
-rw-r--r--include/llvm/DebugInfo/PDB/Native/GlobalsStream.h12
-rw-r--r--include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h11
-rw-r--r--include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h9
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h5
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h43
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h7
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h60
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeEnumTypes.h11
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h12
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h38
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeSession.h30
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h51
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeArray.h50
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h (renamed from include/llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h)21
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h75
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeFunctionSig.h74
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h61
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeTypedef.h42
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeUDT.h74
-rw-r--r--include/llvm/DebugInfo/PDB/Native/NativeTypeVTShape.h46
-rw-r--r--include/llvm/DebugInfo/PDB/Native/PDBFileBuilder.h4
-rw-r--r--include/llvm/DebugInfo/PDB/Native/RawError.h34
-rw-r--r--include/llvm/DebugInfo/PDB/Native/RawTypes.h1
-rw-r--r--include/llvm/DebugInfo/PDB/Native/SymbolCache.h148
-rw-r--r--include/llvm/DebugInfo/PDB/Native/TpiHashing.h48
-rw-r--r--include/llvm/DebugInfo/PDB/Native/TpiStream.h13
30 files changed, 847 insertions, 152 deletions
diff --git a/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h b/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
index ce4d07917755..ac7f741afefa 100644
--- a/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
+++ b/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
@@ -51,6 +51,7 @@ public:
void setObjFileName(StringRef Name);
void setFirstSectionContrib(const SectionContrib &SC);
void addSymbol(codeview::CVSymbol Symbol);
+ void addSymbolsInBulk(ArrayRef<uint8_t> BulkSymbols);
void
addDebugSubsection(std::shared_ptr<codeview::DebugSubsection> Subsection);
@@ -91,7 +92,7 @@ private:
std::string ModuleName;
std::string ObjFileName;
std::vector<std::string> SourceFiles;
- std::vector<codeview::CVSymbol> Symbols;
+ std::vector<ArrayRef<uint8_t>> Symbols;
std::vector<std::unique_ptr<codeview::DebugSubsectionRecordBuilder>>
C13Builders;
diff --git a/include/llvm/DebugInfo/PDB/Native/DbiStream.h b/include/llvm/DebugInfo/PDB/Native/DbiStream.h
index 280615bdb507..a3ca607efbef 100644
--- a/include/llvm/DebugInfo/PDB/Native/DbiStream.h
+++ b/include/llvm/DebugInfo/PDB/Native/DbiStream.h
@@ -78,7 +78,7 @@ public:
const DbiModuleList &modules() const;
- FixedStreamArray<object::coff_section> getSectionHeaders();
+ FixedStreamArray<object::coff_section> getSectionHeaders() const;
FixedStreamArray<object::FpoData> getFpoRecords();
diff --git a/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h b/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
index 51befcdac775..b538de576677 100644
--- a/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
+++ b/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
@@ -15,6 +15,7 @@
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/Support/Error.h"
+#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
#include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
@@ -24,11 +25,15 @@
#include "llvm/Support/Endian.h"
namespace llvm {
+namespace codeview {
+struct FrameData;
+}
namespace msf {
class MSFBuilder;
}
namespace object {
struct coff_section;
+struct FpoData;
}
namespace pdb {
class DbiStream;
@@ -65,6 +70,8 @@ public:
void setGlobalsStreamIndex(uint32_t Index);
void setPublicsStreamIndex(uint32_t Index);
void setSymbolRecordStreamIndex(uint32_t Index);
+ void addNewFpoData(const codeview::FrameData &FD);
+ void addOldFpoData(const object::FpoData &Fpo);
Expected<DbiModuleDescriptorBuilder &> addModuleInfo(StringRef ModuleName);
Error addModuleSourceFile(DbiModuleDescriptorBuilder &Module, StringRef File);
@@ -84,7 +91,8 @@ public:
private:
struct DebugStream {
- ArrayRef<uint8_t> Data;
+ std::function<Error(BinaryStreamWriter &)> WriteFn;
+ uint32_t Size = 0;
uint16_t StreamNumber = kInvalidStreamIndex;
};
@@ -117,6 +125,9 @@ private:
std::vector<std::unique_ptr<DbiModuleDescriptorBuilder>> ModiList;
+ Optional<codeview::DebugFrameDataSubsection> NewFpoData;
+ std::vector<object::FpoData> OldFpoData;
+
StringMap<uint32_t> SourceFileNames;
PDBStringTableBuilder ECNamesBuilder;
diff --git a/include/llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h b/include/llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h
index 1a4f89d607df..4c39ca762b5b 100644
--- a/include/llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h
+++ b/include/llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h
@@ -61,7 +61,6 @@ public:
void addGlobalSymbol(const codeview::ProcRefSym &Sym);
void addGlobalSymbol(const codeview::DataSym &Sym);
void addGlobalSymbol(const codeview::ConstantSym &Sym);
- void addGlobalSymbol(const codeview::UDTSym &Sym);
void addGlobalSymbol(const codeview::CVSymbol &Sym);
private:
diff --git a/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h b/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h
index fdc58dc60f7e..7f84564ee988 100644
--- a/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h
+++ b/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h
@@ -10,18 +10,20 @@
#ifndef LLVM_DEBUGINFO_PDB_RAW_GLOBALS_STREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_GLOBALS_STREAM_H
+#include "llvm/ADT/iterator.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
#include "llvm/Support/BinaryStreamArray.h"
#include "llvm/Support/Error.h"
-#include "llvm/ADT/iterator.h"
namespace llvm {
namespace pdb {
class DbiStream;
class PDBFile;
+class SymbolStream;
/// Iterator over hash records producing symbol record offsets. Abstracts away
/// the fact that symbol record offsets on disk are off-by-one.
@@ -30,8 +32,6 @@ class GSIHashIterator
GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>,
std::random_access_iterator_tag, const uint32_t> {
public:
- GSIHashIterator() = default;
-
template <typename T>
GSIHashIterator(T &&v)
: GSIHashIterator::iterator_adaptor_base(std::forward<T &&>(v)) {}
@@ -52,8 +52,9 @@ class GSIHashTable {
public:
const GSIHashHeader *HashHdr;
FixedStreamArray<PSHashRecord> HashRecords;
- ArrayRef<uint8_t> HashBitmap;
+ FixedStreamArray<support::ulittle32_t> HashBitmap;
FixedStreamArray<support::ulittle32_t> HashBuckets;
+ std::array<int32_t, IPHR_HASH + 1> BucketMap;
Error read(BinaryStreamReader &Reader);
@@ -74,6 +75,9 @@ public:
const GSIHashTable &getGlobalsTable() const { return GlobalsTable; }
Error reload();
+ std::vector<std::pair<uint32_t, codeview::CVSymbol>>
+ findRecordsByName(StringRef Name, const SymbolStream &Symbols) const;
+
private:
GSIHashTable GlobalsTable;
std::unique_ptr<msf::MappedBlockStream> Stream;
diff --git a/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h b/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h
index 419e8ada06f7..101127a355f5 100644
--- a/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h
+++ b/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h
@@ -35,11 +35,18 @@ public:
InfoStreamBuilder &operator=(const InfoStreamBuilder &) = delete;
void setVersion(PdbRaw_ImplVer V);
+ void addFeature(PdbRaw_FeatureSig Sig);
+
+ // If this is true, the PDB contents are hashed and this hash is used as
+ // PDB GUID and as Signature. The age is always 1.
+ void setHashPDBContentsToGUID(bool B);
+
+ // These only have an effect if hashPDBContentsToGUID() is false.
void setSignature(uint32_t S);
void setAge(uint32_t A);
void setGuid(codeview::GUID G);
- void addFeature(PdbRaw_FeatureSig Sig);
+ bool hashPDBContentsToGUID() const { return HashPDBContentsToGUID; }
uint32_t getAge() const { return Age; }
codeview::GUID getGuid() const { return Guid; }
Optional<uint32_t> getSignature() const { return Signature; }
@@ -60,6 +67,8 @@ private:
Optional<uint32_t> Signature;
codeview::GUID Guid;
+ bool HashPDBContentsToGUID = false;
+
NamedStreamMap &NamedStreams;
};
}
diff --git a/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h b/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
index 6602264d1b74..8d590df288f3 100644
--- a/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
+++ b/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
@@ -15,6 +15,7 @@
#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
+#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
#include "llvm/Support/BinaryStreamRef.h"
#include "llvm/Support/Error.h"
#include <cstdint>
@@ -43,13 +44,17 @@ public:
symbols(bool *HadError) const;
const codeview::CVSymbolArray &getSymbolArray() const { return SymbolArray; }
+ const codeview::CVSymbolArray
+ getSymbolArrayForScope(uint32_t ScopeBegin) const;
BinarySubstreamRef getSymbolsSubstream() const;
BinarySubstreamRef getC11LinesSubstream() const;
BinarySubstreamRef getC13LinesSubstream() const;
BinarySubstreamRef getGlobalRefsSubstream() const;
- ModuleDebugStreamRef &operator=(ModuleDebugStreamRef &&Other) = default;
+ ModuleDebugStreamRef &operator=(ModuleDebugStreamRef &&Other) = delete;
+
+ codeview::CVSymbol readSymbolAtOffset(uint32_t Offset) const;
iterator_range<DebugSubsectionIterator> subsections() const;
codeview::DebugSubsectionArray getSubsectionsArray() const {
@@ -64,7 +69,7 @@ public:
findChecksumsSubsection() const;
private:
- const DbiModuleDescriptor &Mod;
+ DbiModuleDescriptor Mod;
uint32_t Signature;
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h b/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h
index bd5c09e5ff76..3cd465503044 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h
@@ -21,11 +21,12 @@ public:
NativeCompilandSymbol(NativeSession &Session, SymIndexId SymbolId,
DbiModuleDescriptor MI);
- std::unique_ptr<NativeRawSymbol> clone() const override;
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
PDB_SymType getSymTag() const override;
bool isEditAndContinueEnabled() const override;
- uint32_t getLexicalParentId() const override;
+ SymIndexId getLexicalParentId() const override;
std::string getLibraryName() const override;
std::string getName() const override;
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h b/include/llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h
new file mode 100644
index 000000000000..4442a1ec41fb
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeEnumGlobals.h
@@ -0,0 +1,43 @@
+//==- NativeEnumGlobals.h - Native Global Enumerator impl --------*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMGLOBALS_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMGLOBALS_H
+
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
+#include "llvm/DebugInfo/PDB/PDBSymbol.h"
+
+#include <vector>
+
+namespace llvm {
+namespace pdb {
+
+class NativeSession;
+
+class NativeEnumGlobals : public IPDBEnumChildren<PDBSymbol> {
+public:
+ NativeEnumGlobals(NativeSession &Session,
+ std::vector<codeview::SymbolKind> Kinds);
+
+ uint32_t getChildCount() const override;
+ std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override;
+ std::unique_ptr<PDBSymbol> getNext() override;
+ void reset() override;
+
+private:
+ std::vector<uint32_t> MatchOffsets;
+ uint32_t Index;
+ NativeSession &Session;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h b/include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h
index 6aa1460dbb4e..c268641a1008 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h
@@ -11,28 +11,23 @@
#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMMODULES_H
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
#include "llvm/DebugInfo/PDB/PDBSymbol.h"
namespace llvm {
namespace pdb {
-class DbiModuleList;
class NativeSession;
class NativeEnumModules : public IPDBEnumChildren<PDBSymbol> {
public:
- NativeEnumModules(NativeSession &Session, const DbiModuleList &Modules,
- uint32_t Index = 0);
+ NativeEnumModules(NativeSession &Session, uint32_t Index = 0);
uint32_t getChildCount() const override;
std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override;
std::unique_ptr<PDBSymbol> getNext() override;
void reset() override;
- NativeEnumModules *clone() const override;
private:
NativeSession &Session;
- const DbiModuleList &Modules;
uint32_t Index;
};
}
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h b/include/llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h
deleted file mode 100644
index 41b7b78b8d80..000000000000
--- a/include/llvm/DebugInfo/PDB/Native/NativeEnumSymbol.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//===- NativeEnumSymbol.h - info about enum type ----------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMSYMBOL_H
-#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMSYMBOL_H
-
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
-#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
-#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
-
-namespace llvm {
-namespace pdb {
-
-class NativeEnumSymbol : public NativeRawSymbol,
- public codeview::TypeVisitorCallbacks {
-public:
- NativeEnumSymbol(NativeSession &Session, SymIndexId Id,
- const codeview::CVType &CV);
- ~NativeEnumSymbol() override;
-
- std::unique_ptr<NativeRawSymbol> clone() const override;
-
- std::unique_ptr<IPDBEnumSymbols>
- findChildren(PDB_SymType Type) const override;
-
- Error visitKnownRecord(codeview::CVType &CVR,
- codeview::EnumRecord &Record) override;
- Error visitKnownMember(codeview::CVMemberRecord &CVM,
- codeview::EnumeratorRecord &Record) override;
-
- PDB_SymType getSymTag() const override;
- uint32_t getClassParentId() const override;
- uint32_t getUnmodifiedTypeId() const override;
- bool hasConstructor() const override;
- bool hasAssignmentOperator() const override;
- bool hasCastOperator() const override;
- uint64_t getLength() const override;
- std::string getName() const override;
- bool isNested() const override;
- bool hasOverloadedOperator() const override;
- bool isPacked() const override;
- bool isScoped() const override;
- uint32_t getTypeId() const override;
-
-protected:
- codeview::CVType CV;
- codeview::EnumRecord Record;
-};
-
-} // namespace pdb
-} // namespace llvm
-
-#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVEENUMSYMBOL_H
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeEnumTypes.h b/include/llvm/DebugInfo/PDB/Native/NativeEnumTypes.h
index e0a5c8d9ad81..f8ac1655dc61 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeEnumTypes.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeEnumTypes.h
@@ -26,23 +26,20 @@ class NativeEnumTypes : public IPDBEnumChildren<PDBSymbol> {
public:
NativeEnumTypes(NativeSession &Session,
codeview::LazyRandomTypeCollection &TypeCollection,
- codeview::TypeLeafKind Kind);
+ std::vector<codeview::TypeLeafKind> Kinds);
+
+ NativeEnumTypes(NativeSession &Session,
+ std::vector<codeview::TypeIndex> Indices);
uint32_t getChildCount() const override;
std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override;
std::unique_ptr<PDBSymbol> getNext() override;
void reset() override;
- NativeEnumTypes *clone() const override;
private:
- NativeEnumTypes(NativeSession &Session,
- const std::vector<codeview::TypeIndex> &Matches,
- codeview::TypeLeafKind Kind);
-
std::vector<codeview::TypeIndex> Matches;
uint32_t Index;
NativeSession &Session;
- codeview::TypeLeafKind Kind;
};
} // namespace pdb
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h b/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h
index 587c7ff2b092..f4030da1d026 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h
@@ -16,11 +16,14 @@
namespace llvm {
namespace pdb {
+class DbiStream;
+
class NativeExeSymbol : public NativeRawSymbol {
-public:
- NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId);
+ // EXE symbol is the authority on the various symbol types.
+ DbiStream *Dbi = nullptr;
- std::unique_ptr<NativeRawSymbol> clone() const override;
+public:
+ NativeExeSymbol(NativeSession &Session, SymIndexId Id);
std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const override;
@@ -30,9 +33,6 @@ public:
codeview::GUID getGuid() const override;
bool hasCTypes() const override;
bool hasPrivateSymbols() const override;
-
-private:
- PDBFile &File;
};
} // namespace pdb
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h b/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
index 5b70ecfa2056..6505a7d39573 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
@@ -19,15 +19,16 @@ namespace pdb {
class NativeSession;
-typedef uint32_t SymIndexId;
-
class NativeRawSymbol : public IPDBRawSymbol {
-public:
- NativeRawSymbol(NativeSession &PDBSession, SymIndexId SymbolId);
+ friend class SymbolCache;
+ virtual void initialize() {}
- virtual std::unique_ptr<NativeRawSymbol> clone() const = 0;
+public:
+ NativeRawSymbol(NativeSession &PDBSession, PDB_SymType Tag,
+ SymIndexId SymbolId);
- void dump(raw_ostream &OS, int Indent) const override;
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
std::unique_ptr<IPDBEnumSymbols>
findChildren(PDB_SymType Type) const override;
@@ -68,25 +69,25 @@ public:
uint32_t getAddressOffset() const override;
uint32_t getAddressSection() const override;
uint32_t getAge() const override;
- uint32_t getArrayIndexTypeId() const override;
+ SymIndexId getArrayIndexTypeId() const override;
uint32_t getBaseDataOffset() const override;
uint32_t getBaseDataSlot() const override;
- uint32_t getBaseSymbolId() const override;
+ SymIndexId getBaseSymbolId() const override;
PDB_BuiltinType getBuiltinType() const override;
uint32_t getBitPosition() const override;
PDB_CallingConv getCallingConvention() const override;
- uint32_t getClassParentId() const override;
+ SymIndexId getClassParentId() const override;
std::string getCompilerName() const override;
uint32_t getCount() const override;
uint32_t getCountLiveRanges() const override;
PDB_Lang getLanguage() const override;
- uint32_t getLexicalParentId() const override;
+ SymIndexId getLexicalParentId() const override;
std::string getLibraryName() const override;
uint32_t getLiveRangeStartAddressOffset() const override;
uint32_t getLiveRangeStartAddressSection() const override;
uint32_t getLiveRangeStartRelativeVirtualAddress() const override;
codeview::RegisterId getLocalBasePointerRegisterId() const override;
- uint32_t getLowerBoundId() const override;
+ SymIndexId getLowerBoundId() const override;
uint32_t getMemorySpaceKind() const override;
std::string getName() const override;
uint32_t getNumberOfAcceleratorPointerTags() const override;
@@ -96,7 +97,7 @@ public:
uint32_t getNumberOfRows() const override;
std::string getObjectFileName() const override;
uint32_t getOemId() const override;
- uint32_t getOemSymbolId() const override;
+ SymIndexId getOemSymbolId() const override;
uint32_t getOffsetInUdt() const override;
PDB_Cpu getPlatform() const override;
uint32_t getRank() const override;
@@ -110,9 +111,9 @@ public:
std::string getSourceFileName() const override;
std::unique_ptr<IPDBLineNumber> getSrcLineOnTypeDefn() const override;
uint32_t getStride() const override;
- uint32_t getSubTypeId() const override;
+ SymIndexId getSubTypeId() const override;
std::string getSymbolsFileName() const override;
- uint32_t getSymIndexId() const override;
+ SymIndexId getSymIndexId() const override;
uint32_t getTargetOffset() const override;
uint32_t getTargetRelativeVirtualAddress() const override;
uint64_t getTargetVirtualAddress() const override;
@@ -120,16 +121,16 @@ public:
uint32_t getTextureSlot() const override;
uint32_t getTimeStamp() const override;
uint32_t getToken() const override;
- uint32_t getTypeId() const override;
+ SymIndexId getTypeId() const override;
uint32_t getUavSlot() const override;
std::string getUndecoratedName() const override;
std::string getUndecoratedNameEx(PDB_UndnameFlags Flags) const override;
- uint32_t getUnmodifiedTypeId() const override;
- uint32_t getUpperBoundId() const override;
+ SymIndexId getUnmodifiedTypeId() const override;
+ SymIndexId getUpperBoundId() const override;
Variant getValue() const override;
uint32_t getVirtualBaseDispIndex() const override;
uint32_t getVirtualBaseOffset() const override;
- uint32_t getVirtualTableShapeId() const override;
+ SymIndexId getVirtualTableShapeId() const override;
std::unique_ptr<PDBSymbolTypeBuiltin>
getVirtualBaseTableType() const override;
PDB_DataKind getDataKind() const override;
@@ -230,6 +231,7 @@ public:
protected:
NativeSession &Session;
+ PDB_SymType Tag;
SymIndexId SymbolId;
};
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeSession.h b/include/llvm/DebugInfo/PDB/Native/NativeSession.h
index aff7ef2f8f21..4878e47d3121 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeSession.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeSession.h
@@ -15,9 +15,8 @@
#include "llvm/DebugInfo/CodeView/TypeIndex.h"
#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
-#include "llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h"
#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Error.h"
@@ -25,6 +24,7 @@ namespace llvm {
class MemoryBuffer;
namespace pdb {
class PDBFile;
+class NativeExeSymbol;
class NativeSession : public IPDBSession {
public:
@@ -37,21 +37,10 @@ public:
static Error createFromExe(StringRef Path,
std::unique_ptr<IPDBSession> &Session);
- std::unique_ptr<PDBSymbolCompiland>
- createCompilandSymbol(DbiModuleDescriptor MI);
-
- std::unique_ptr<PDBSymbolTypeEnum>
- createEnumSymbol(codeview::TypeIndex Index);
-
- std::unique_ptr<IPDBEnumSymbols>
- createTypeEnumerator(codeview::TypeLeafKind Kind);
-
- SymIndexId findSymbolByTypeIndex(codeview::TypeIndex TI);
-
uint64_t getLoadAddress() const override;
bool setLoadAddress(uint64_t Address) override;
std::unique_ptr<PDBSymbolExe> getGlobalScope() override;
- std::unique_ptr<PDBSymbol> getSymbolById(uint32_t SymbolId) const override;
+ std::unique_ptr<PDBSymbol> getSymbolById(SymIndexId SymbolId) const override;
bool addressForVA(uint64_t VA, uint32_t &Section,
uint32_t &Offset) const override;
@@ -104,14 +93,23 @@ public:
std::unique_ptr<IPDBEnumSectionContribs> getSectionContribs() const override;
+ std::unique_ptr<IPDBEnumFrameData> getFrameData() const override;
+
PDBFile &getPDBFile() { return *Pdb; }
const PDBFile &getPDBFile() const { return *Pdb; }
+ NativeExeSymbol &getNativeGlobalScope() const;
+ SymbolCache &getSymbolCache() { return Cache; }
+ const SymbolCache &getSymbolCache() const { return Cache; }
+
private:
+ void initializeExeSymbol();
+
std::unique_ptr<PDBFile> Pdb;
std::unique_ptr<BumpPtrAllocator> Allocator;
- std::vector<std::unique_ptr<NativeRawSymbol>> SymbolCache;
- DenseMap<codeview::TypeIndex, SymIndexId> TypeIndexToSymbolId;
+
+ SymbolCache Cache;
+ SymIndexId ExeSymbol = 0;
};
} // namespace pdb
} // namespace llvm
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h b/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h
new file mode 100644
index 000000000000..acc5eb8ff2c2
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h
@@ -0,0 +1,51 @@
+//===- NativeSymbolEnumerator.h - info about enumerator values --*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVESYMBOLENUMERATOR_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVESYMBOLENUMERATOR_H
+
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+class NativeTypeEnum;
+
+class NativeSymbolEnumerator : public NativeRawSymbol {
+public:
+ NativeSymbolEnumerator(NativeSession &Session, SymIndexId Id,
+ const NativeTypeEnum &Parent,
+ codeview::EnumeratorRecord Record);
+
+ ~NativeSymbolEnumerator() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ SymIndexId getClassParentId() const override;
+ SymIndexId getLexicalParentId() const override;
+ std::string getName() const override;
+ SymIndexId getTypeId() const override;
+ PDB_DataKind getDataKind() const override;
+ PDB_LocType getLocationType() const override;
+ bool isConstType() const override;
+ bool isVolatileType() const override;
+ bool isUnalignedType() const override;
+ Variant getValue() const override;
+
+protected:
+ const NativeTypeEnum &Parent;
+ codeview::EnumeratorRecord Record;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEENUM_H
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeArray.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeArray.h
new file mode 100644
index 000000000000..10e68e6df450
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeArray.h
@@ -0,0 +1,50 @@
+//===- NativeTypeArray.h ------------------------------------------ C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEARRAY_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEARRAY_H
+
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/PDBTypes.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeSession;
+
+class NativeTypeArray : public NativeRawSymbol {
+public:
+ NativeTypeArray(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI,
+ codeview::ArrayRecord Record);
+ ~NativeTypeArray() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ SymIndexId getArrayIndexTypeId() const override;
+
+ bool isConstType() const override;
+ bool isUnalignedType() const override;
+ bool isVolatileType() const override;
+
+ uint32_t getCount() const override;
+ SymIndexId getTypeId() const override;
+ uint64_t getLength() const override;
+
+protected:
+ codeview::ArrayRecord Record;
+ codeview::TypeIndex Index;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h
index 4f532c6e3829..725dfb89222f 100644
--- a/include/llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h
@@ -1,4 +1,4 @@
-//===- NativeBuiltinSymbol.h -------------------------------------- C++ -*-===//
+//===- NativeTypeBuiltin.h ---------------------------------------- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVEBUILTINSYMBOL_H
-#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVEBUILTINSYMBOL_H
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEBUILTIN_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEBUILTIN_H
#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
@@ -19,15 +19,15 @@ namespace pdb {
class NativeSession;
-class NativeBuiltinSymbol : public NativeRawSymbol {
+class NativeTypeBuiltin : public NativeRawSymbol {
public:
- NativeBuiltinSymbol(NativeSession &PDBSession, SymIndexId Id,
- PDB_BuiltinType T, uint64_t L);
- ~NativeBuiltinSymbol() override;
+ NativeTypeBuiltin(NativeSession &PDBSession, SymIndexId Id,
+ codeview::ModifierOptions Mods, PDB_BuiltinType T,
+ uint64_t L);
+ ~NativeTypeBuiltin() override;
- virtual std::unique_ptr<NativeRawSymbol> clone() const override;
-
- void dump(raw_ostream &OS, int Indent) const override;
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
PDB_SymType getSymTag() const override;
@@ -39,6 +39,7 @@ public:
protected:
NativeSession &Session;
+ codeview::ModifierOptions Mods;
PDB_BuiltinType Type;
uint64_t Length;
};
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h
new file mode 100644
index 000000000000..a5cbefc18111
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h
@@ -0,0 +1,75 @@
+//===- NativeTypeEnum.h - info about enum type ------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEENUM_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEENUM_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypeBuiltin;
+
+class NativeTypeEnum : public NativeRawSymbol {
+public:
+ NativeTypeEnum(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI,
+ codeview::EnumRecord Record);
+
+ NativeTypeEnum(NativeSession &Session, SymIndexId Id,
+ NativeTypeEnum &UnmodifiedType,
+ codeview::ModifierRecord Modifier);
+ ~NativeTypeEnum() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ std::unique_ptr<IPDBEnumSymbols>
+ findChildren(PDB_SymType Type) const override;
+
+ PDB_BuiltinType getBuiltinType() const override;
+ PDB_SymType getSymTag() const override;
+ SymIndexId getUnmodifiedTypeId() const override;
+ bool hasConstructor() const override;
+ bool hasAssignmentOperator() const override;
+ bool hasCastOperator() const override;
+ uint64_t getLength() const override;
+ std::string getName() const override;
+ bool isConstType() const override;
+ bool isVolatileType() const override;
+ bool isUnalignedType() const override;
+ bool isNested() const override;
+ bool hasOverloadedOperator() const override;
+ bool hasNestedTypes() const override;
+ bool isIntrinsic() const override;
+ bool isPacked() const override;
+ bool isScoped() const override;
+ SymIndexId getTypeId() const override;
+ bool isRefUdt() const override;
+ bool isValueUdt() const override;
+ bool isInterfaceUdt() const override;
+
+ const NativeTypeBuiltin &getUnderlyingBuiltinType() const;
+ const codeview::EnumRecord &getEnumRecord() const { return *Record; }
+
+protected:
+ codeview::TypeIndex Index;
+ Optional<codeview::EnumRecord> Record;
+ NativeTypeEnum *UnmodifiedType = nullptr;
+ Optional<codeview::ModifierRecord> Modifiers;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEENUM_H
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeFunctionSig.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeFunctionSig.h
new file mode 100644
index 000000000000..1b1b87f6581f
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeFunctionSig.h
@@ -0,0 +1,74 @@
+//===- NativeTypeFunctionSig.h - info about function signature ---*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEFUNCTIONSIG_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEFUNCTIONSIG_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypeUDT;
+
+class NativeTypeFunctionSig : public NativeRawSymbol {
+protected:
+ void initialize() override;
+
+public:
+ NativeTypeFunctionSig(NativeSession &Session, SymIndexId Id,
+ codeview::TypeIndex TI, codeview::ProcedureRecord Proc);
+
+ NativeTypeFunctionSig(NativeSession &Session, SymIndexId Id,
+ codeview::TypeIndex TI,
+ codeview::MemberFunctionRecord MemberFunc);
+
+ ~NativeTypeFunctionSig() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ std::unique_ptr<IPDBEnumSymbols>
+ findChildren(PDB_SymType Type) const override;
+
+ SymIndexId getClassParentId() const override;
+ PDB_CallingConv getCallingConvention() const override;
+ uint32_t getCount() const override;
+ SymIndexId getTypeId() const override;
+ int32_t getThisAdjust() const override;
+ bool hasConstructor() const override;
+ bool isConstType() const override;
+ bool isConstructorVirtualBase() const override;
+ bool isCxxReturnUdt() const override;
+ bool isUnalignedType() const override;
+ bool isVolatileType() const override;
+
+private:
+ void initializeArgList(codeview::TypeIndex ArgListTI);
+
+ union {
+ codeview::MemberFunctionRecord MemberFunc;
+ codeview::ProcedureRecord Proc;
+ };
+
+ SymIndexId ClassParentId = 0;
+ codeview::TypeIndex Index;
+ codeview::ArgListRecord ArgList;
+ bool IsMemberFunction = false;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H \ No newline at end of file
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h b/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h
new file mode 100644
index 000000000000..bcb7431fecf1
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h
@@ -0,0 +1,61 @@
+//===- NativeTypePointer.h - info about pointer type -------------*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypePointer : public NativeRawSymbol {
+public:
+ // Create a pointer record for a simple type.
+ NativeTypePointer(NativeSession &Session, SymIndexId Id,
+ codeview::TypeIndex TI);
+
+ // Create a pointer record for a non-simple type.
+ NativeTypePointer(NativeSession &Session, SymIndexId Id,
+ codeview::TypeIndex TI, codeview::PointerRecord PR);
+ ~NativeTypePointer() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ SymIndexId getClassParentId() const override;
+ bool isConstType() const override;
+ uint64_t getLength() const override;
+ bool isReference() const override;
+ bool isRValueReference() const override;
+ bool isPointerToDataMember() const override;
+ bool isPointerToMemberFunction() const override;
+ SymIndexId getTypeId() const override;
+ bool isRestrictedType() const override;
+ bool isVolatileType() const override;
+ bool isUnalignedType() const override;
+
+ bool isSingleInheritance() const override;
+ bool isMultipleInheritance() const override;
+ bool isVirtualInheritance() const override;
+
+protected:
+ bool isMemberPointer() const;
+ codeview::TypeIndex TI;
+ Optional<codeview::PointerRecord> Record;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H \ No newline at end of file
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeTypedef.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeTypedef.h
new file mode 100644
index 000000000000..06eb6fcf3764
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeTypedef.h
@@ -0,0 +1,42 @@
+//===- NativeTypeTypedef.h - info about typedef ------------------*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPETYPEDEF_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPETYPEDEF_H
+
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypeTypedef : public NativeRawSymbol {
+public:
+ // Create a pointer record for a non-simple type.
+ NativeTypeTypedef(NativeSession &Session, SymIndexId Id,
+ codeview::UDTSym Typedef);
+
+ ~NativeTypeTypedef() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ std::string getName() const override;
+ SymIndexId getTypeId() const override;
+
+protected:
+ codeview::UDTSym Record;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H \ No newline at end of file
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeUDT.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeUDT.h
new file mode 100644
index 000000000000..84821d8731be
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeUDT.h
@@ -0,0 +1,74 @@
+//===- NativeTypeUDT.h - info about class/struct type ------------*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEUDT_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEUDT_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypeUDT : public NativeRawSymbol {
+public:
+ NativeTypeUDT(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI,
+ codeview::ClassRecord Class);
+
+ NativeTypeUDT(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI,
+ codeview::UnionRecord Union);
+
+ NativeTypeUDT(NativeSession &Session, SymIndexId Id,
+ NativeTypeUDT &UnmodifiedType,
+ codeview::ModifierRecord Modifier);
+
+ ~NativeTypeUDT() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ std::string getName() const override;
+ SymIndexId getLexicalParentId() const override;
+ SymIndexId getUnmodifiedTypeId() const override;
+ SymIndexId getVirtualTableShapeId() const override;
+ uint64_t getLength() const override;
+ PDB_UdtType getUdtKind() const override;
+ bool hasConstructor() const override;
+ bool isConstType() const override;
+ bool hasAssignmentOperator() const override;
+ bool hasCastOperator() const override;
+ bool hasNestedTypes() const override;
+ bool hasOverloadedOperator() const override;
+ bool isInterfaceUdt() const override;
+ bool isIntrinsic() const override;
+ bool isNested() const override;
+ bool isPacked() const override;
+ bool isRefUdt() const override;
+ bool isScoped() const override;
+ bool isValueUdt() const override;
+ bool isUnalignedType() const override;
+ bool isVolatileType() const override;
+
+protected:
+ codeview::TypeIndex Index;
+
+ Optional<codeview::ClassRecord> Class;
+ Optional<codeview::UnionRecord> Union;
+ NativeTypeUDT *UnmodifiedType = nullptr;
+ codeview::TagRecord *Tag = nullptr;
+ Optional<codeview::ModifierRecord> Modifiers;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEUDT_H \ No newline at end of file
diff --git a/include/llvm/DebugInfo/PDB/Native/NativeTypeVTShape.h b/include/llvm/DebugInfo/PDB/Native/NativeTypeVTShape.h
new file mode 100644
index 000000000000..a996f34ef859
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/NativeTypeVTShape.h
@@ -0,0 +1,46 @@
+//===- NativeTypeVTShape.h - info about virtual table shape ------*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEVTSHAPE_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEVTSHAPE_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
+
+namespace llvm {
+namespace pdb {
+
+class NativeTypeVTShape : public NativeRawSymbol {
+public:
+ // Create a pointer record for a non-simple type.
+ NativeTypeVTShape(NativeSession &Session, SymIndexId Id,
+ codeview::TypeIndex TI, codeview::VFTableShapeRecord SR);
+
+ ~NativeTypeVTShape() override;
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override;
+
+ bool isConstType() const override;
+ bool isVolatileType() const override;
+ bool isUnalignedType() const override;
+ uint32_t getCount() const override;
+
+protected:
+ codeview::TypeIndex TI;
+ codeview::VFTableShapeRecord Record;
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif // LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEVTSHAPE_H \ No newline at end of file
diff --git a/include/llvm/DebugInfo/PDB/Native/PDBFileBuilder.h b/include/llvm/DebugInfo/PDB/Native/PDBFileBuilder.h
index 7f9c4cf9fa83..37458749a8d8 100644
--- a/include/llvm/DebugInfo/PDB/Native/PDBFileBuilder.h
+++ b/include/llvm/DebugInfo/PDB/Native/PDBFileBuilder.h
@@ -53,7 +53,9 @@ public:
PDBStringTableBuilder &getStringTableBuilder();
GSIStreamBuilder &getGsiBuilder();
- Error commit(StringRef Filename);
+ // If HashPDBContentsToGUID is true on the InfoStreamBuilder, Guid is filled
+ // with the computed PDB GUID on return.
+ Error commit(StringRef Filename, codeview::GUID *Guid);
Expected<uint32_t> getNamedStreamIndex(StringRef Name) const;
Error addNamedStream(StringRef Name, StringRef Data);
diff --git a/include/llvm/DebugInfo/PDB/Native/RawError.h b/include/llvm/DebugInfo/PDB/Native/RawError.h
index 3624a7682e38..97d11b4f20d1 100644
--- a/include/llvm/DebugInfo/PDB/Native/RawError.h
+++ b/include/llvm/DebugInfo/PDB/Native/RawError.h
@@ -31,23 +31,29 @@ enum class raw_error_code {
stream_too_long,
invalid_tpi_hash,
};
+} // namespace pdb
+} // namespace llvm
+
+namespace std {
+template <>
+struct is_error_code_enum<llvm::pdb::raw_error_code> : std::true_type {};
+} // namespace std
+
+namespace llvm {
+namespace pdb {
+const std::error_category &RawErrCategory();
+
+inline std::error_code make_error_code(raw_error_code E) {
+ return std::error_code(static_cast<int>(E), RawErrCategory());
+}
/// Base class for errors originating when parsing raw PDB files
-class RawError : public ErrorInfo<RawError> {
+class RawError : public ErrorInfo<RawError, StringError> {
public:
+ using ErrorInfo<RawError, StringError>::ErrorInfo; // inherit constructors
+ RawError(const Twine &S) : ErrorInfo(S, raw_error_code::unspecified) {}
static char ID;
- RawError(raw_error_code C);
- RawError(const std::string &Context);
- RawError(raw_error_code C, const std::string &Context);
-
- void log(raw_ostream &OS) const override;
- const std::string &getErrorMessage() const;
- std::error_code convertToErrorCode() const override;
-
-private:
- std::string ErrMsg;
- raw_error_code Code;
};
-}
-}
+} // namespace pdb
+} // namespace llvm
#endif
diff --git a/include/llvm/DebugInfo/PDB/Native/RawTypes.h b/include/llvm/DebugInfo/PDB/Native/RawTypes.h
index 19f592d562e4..8f6d6611c032 100644
--- a/include/llvm/DebugInfo/PDB/Native/RawTypes.h
+++ b/include/llvm/DebugInfo/PDB/Native/RawTypes.h
@@ -343,7 +343,6 @@ struct SrcHeaderBlockEntry {
char Reserved[8];
};
-constexpr int I = sizeof(SrcHeaderBlockEntry);
static_assert(sizeof(SrcHeaderBlockEntry) == 40, "Incorrect struct size!");
} // namespace pdb
diff --git a/include/llvm/DebugInfo/PDB/Native/SymbolCache.h b/include/llvm/DebugInfo/PDB/Native/SymbolCache.h
new file mode 100644
index 000000000000..08e1d41e6ee9
--- /dev/null
+++ b/include/llvm/DebugInfo/PDB/Native/SymbolCache.h
@@ -0,0 +1,148 @@
+//==- SymbolCache.h - Cache of native symbols and ids ------------*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_NATIVE_SYMBOLCACHE_H
+#define LLVM_DEBUGINFO_PDB_NATIVE_SYMBOLCACHE_H
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h"
+#include "llvm/Support/Allocator.h"
+
+#include <memory>
+#include <vector>
+
+namespace llvm {
+namespace pdb {
+class DbiStream;
+class PDBFile;
+
+class SymbolCache {
+ NativeSession &Session;
+ DbiStream *Dbi = nullptr;
+
+ /// Cache of all stable symbols, indexed by SymIndexId. Just because a
+ /// symbol has been parsed does not imply that it will be stable and have
+ /// an Id. Id allocation is an implementation, with the only guarantee
+ /// being that once an Id is allocated, the symbol can be assumed to be
+ /// cached.
+ std::vector<std::unique_ptr<NativeRawSymbol>> Cache;
+
+ /// For type records from the TPI stream which have been paresd and cached,
+ /// stores a mapping to SymIndexId of the cached symbol.
+ DenseMap<codeview::TypeIndex, SymIndexId> TypeIndexToSymbolId;
+
+ /// For field list members which have been parsed and cached, stores a mapping
+ /// from (IndexOfClass, MemberIndex) to the corresponding SymIndexId of the
+ /// cached symbol.
+ DenseMap<std::pair<codeview::TypeIndex, uint32_t>, SymIndexId>
+ FieldListMembersToSymbolId;
+
+ /// List of SymIndexIds for each compiland, indexed by compiland index as they
+ /// appear in the PDB file.
+ std::vector<SymIndexId> Compilands;
+
+ /// Map from global symbol offset to SymIndexId.
+ DenseMap<uint32_t, SymIndexId> GlobalOffsetToSymbolId;
+
+ SymIndexId createSymbolPlaceholder() {
+ SymIndexId Id = Cache.size();
+ Cache.push_back(nullptr);
+ return Id;
+ }
+
+ template <typename ConcreteSymbolT, typename CVRecordT, typename... Args>
+ SymIndexId createSymbolForType(codeview::TypeIndex TI, codeview::CVType CVT,
+ Args &&... ConstructorArgs) {
+ CVRecordT Record;
+ if (auto EC =
+ codeview::TypeDeserializer::deserializeAs<CVRecordT>(CVT, Record)) {
+ consumeError(std::move(EC));
+ return 0;
+ }
+
+ return createSymbol<ConcreteSymbolT>(
+ TI, std::move(Record), std::forward<Args>(ConstructorArgs)...);
+ }
+
+ SymIndexId createSymbolForModifiedType(codeview::TypeIndex ModifierTI,
+ codeview::CVType CVT);
+
+ SymIndexId createSimpleType(codeview::TypeIndex TI,
+ codeview::ModifierOptions Mods);
+
+public:
+ SymbolCache(NativeSession &Session, DbiStream *Dbi);
+
+ template <typename ConcreteSymbolT, typename... Args>
+ SymIndexId createSymbol(Args &&... ConstructorArgs) {
+ SymIndexId Id = Cache.size();
+
+ // Initial construction must not access the cache, since it must be done
+ // atomically.
+ auto Result = llvm::make_unique<ConcreteSymbolT>(
+ Session, Id, std::forward<Args>(ConstructorArgs)...);
+ Result->SymbolId = Id;
+
+ NativeRawSymbol *NRS = static_cast<NativeRawSymbol *>(Result.get());
+ Cache.push_back(std::move(Result));
+
+ // After the item is in the cache, we can do further initialization which
+ // is then allowed to access the cache.
+ NRS->initialize();
+ return Id;
+ }
+
+ std::unique_ptr<IPDBEnumSymbols>
+ createTypeEnumerator(codeview::TypeLeafKind Kind);
+
+ std::unique_ptr<IPDBEnumSymbols>
+ createTypeEnumerator(std::vector<codeview::TypeLeafKind> Kinds);
+
+ std::unique_ptr<IPDBEnumSymbols>
+ createGlobalsEnumerator(codeview::SymbolKind Kind);
+
+ SymIndexId findSymbolByTypeIndex(codeview::TypeIndex TI);
+
+ template <typename ConcreteSymbolT, typename... Args>
+ SymIndexId getOrCreateFieldListMember(codeview::TypeIndex FieldListTI,
+ uint32_t Index,
+ Args &&... ConstructorArgs) {
+ SymIndexId SymId = Cache.size();
+ std::pair<codeview::TypeIndex, uint32_t> Key{FieldListTI, Index};
+ auto Result = FieldListMembersToSymbolId.try_emplace(Key, SymId);
+ if (Result.second)
+ SymId =
+ createSymbol<ConcreteSymbolT>(std::forward<Args>(ConstructorArgs)...);
+ else
+ SymId = Result.first->second;
+ return SymId;
+ }
+
+ SymIndexId getOrCreateGlobalSymbolByOffset(uint32_t Offset);
+
+ std::unique_ptr<PDBSymbolCompiland> getOrCreateCompiland(uint32_t Index);
+ uint32_t getNumCompilands() const;
+
+ std::unique_ptr<PDBSymbol> getSymbolById(SymIndexId SymbolId) const;
+
+ NativeRawSymbol &getNativeSymbolById(SymIndexId SymbolId) const;
+
+ template <typename ConcreteT>
+ ConcreteT &getNativeSymbolById(SymIndexId SymbolId) const {
+ return static_cast<ConcreteT &>(getNativeSymbolById(SymbolId));
+ }
+};
+
+} // namespace pdb
+} // namespace llvm
+
+#endif
diff --git a/include/llvm/DebugInfo/PDB/Native/TpiHashing.h b/include/llvm/DebugInfo/PDB/Native/TpiHashing.h
index c1edec7a26fe..c2996ccf1825 100644
--- a/include/llvm/DebugInfo/PDB/Native/TpiHashing.h
+++ b/include/llvm/DebugInfo/PDB/Native/TpiHashing.h
@@ -18,6 +18,54 @@ namespace pdb {
Expected<uint32_t> hashTypeRecord(const llvm::codeview::CVType &Type);
+struct TagRecordHash {
+ explicit TagRecordHash(codeview::ClassRecord CR, uint32_t Full,
+ uint32_t Forward)
+ : FullRecordHash(Full), ForwardDeclHash(Forward), Class(std::move(CR)) {
+ State = 0;
+ }
+
+ explicit TagRecordHash(codeview::EnumRecord ER, uint32_t Full,
+ uint32_t Forward)
+ : FullRecordHash(Full), ForwardDeclHash(Forward), Enum(std::move(ER)) {
+ State = 1;
+ }
+
+ explicit TagRecordHash(codeview::UnionRecord UR, uint32_t Full,
+ uint32_t Forward)
+ : FullRecordHash(Full), ForwardDeclHash(Forward), Union(std::move(UR)) {
+ State = 2;
+ }
+
+ uint32_t FullRecordHash;
+ uint32_t ForwardDeclHash;
+
+ codeview::TagRecord &getRecord() {
+ switch (State) {
+ case 0:
+ return Class;
+ case 1:
+ return Enum;
+ case 2:
+ return Union;
+ }
+ llvm_unreachable("unreachable!");
+ }
+
+private:
+ union {
+ codeview::ClassRecord Class;
+ codeview::EnumRecord Enum;
+ codeview::UnionRecord Union;
+ };
+
+ uint8_t State = 0;
+};
+
+/// Given a CVType referring to a class, structure, union, or enum, compute
+/// the hash of its forward decl and full decl.
+Expected<TagRecordHash> hashTagRecord(const codeview::CVType &Type);
+
} // end namespace pdb
} // end namespace llvm
diff --git a/include/llvm/DebugInfo/PDB/Native/TpiStream.h b/include/llvm/DebugInfo/PDB/Native/TpiStream.h
index b77939929ecf..b76576a7a263 100644
--- a/include/llvm/DebugInfo/PDB/Native/TpiStream.h
+++ b/include/llvm/DebugInfo/PDB/Native/TpiStream.h
@@ -58,10 +58,21 @@ public:
codeview::LazyRandomTypeCollection &typeCollection() { return *Types; }
+ Expected<codeview::TypeIndex>
+ findFullDeclForForwardRef(codeview::TypeIndex ForwardRefTI) const;
+
+ std::vector<codeview::TypeIndex> findRecordsByName(StringRef Name) const;
+
+ codeview::CVType getType(codeview::TypeIndex Index);
+
BinarySubstreamRef getTypeRecordsSubstream() const;
Error commit();
+ void buildHashMap();
+
+ bool supportsTypeLookup() const;
+
private:
PDBFile &Pdb;
std::unique_ptr<msf::MappedBlockStream> Stream;
@@ -77,6 +88,8 @@ private:
FixedStreamArray<codeview::TypeIndexOffset> TypeIndexOffsets;
HashTable<support::ulittle32_t> HashAdjusters;
+ std::vector<std::vector<codeview::TypeIndex>> HashMap;
+
const TpiStreamHeader *Header;
};
}