diff options
Diffstat (limited to 'llvm/include')
8 files changed, 68 insertions, 59 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/StreamArray.h b/llvm/include/llvm/DebugInfo/CodeView/StreamArray.h index b6ecc75e439..0b9349aac75 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/StreamArray.h +++ b/llvm/include/llvm/DebugInfo/CodeView/StreamArray.h @@ -112,10 +112,14 @@ public: VarStreamArrayIterator(const ArrayType &Array, const Extractor &E, bool *HadError = nullptr) : IterRef(Array.Stream), Array(&Array), HadError(HadError), Extract(E) { - auto EC = Extract(IterRef, ThisLen, ThisValue); - if (EC) { - consumeError(std::move(EC)); - markError(); + if (IterRef.getLength() == 0) + moveToEnd(); + else { + auto EC = Extract(IterRef, ThisLen, ThisValue); + if (EC) { + consumeError(std::move(EC)); + markError(); + } } } VarStreamArrayIterator() {} diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h index ab4300858ce..2c7350f3c3e 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h @@ -24,7 +24,7 @@ class PDBFile; class DbiStreamBuilder { public: - DbiStreamBuilder(PDBFile &File); + DbiStreamBuilder(); DbiStreamBuilder(const DbiStreamBuilder &) = delete; DbiStreamBuilder &operator=(const DbiStreamBuilder &) = delete; @@ -37,10 +37,11 @@ public: void setFlags(uint16_t F); void setMachineType(PDB_Machine M); - Expected<std::unique_ptr<DbiStream>> build(); + uint32_t calculateSerializedLength() const; + + Expected<std::unique_ptr<DbiStream>> build(PDBFile &File); private: - PDBFile &File; Optional<PdbRaw_DbiVer> VerHeader; uint32_t Age; uint16_t BuildNumber; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStream.h index 9cca4877709..1980bec7153 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStream.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStream.h @@ -27,7 +27,7 @@ class PDBFile; class InfoStream { friend class InfoStreamBuilder; - struct Header { + struct HeaderInfo { support::ulittle32_t Version; support::ulittle32_t Signature; support::ulittle32_t Age; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h index e8ee572c1a0..872f300e7e4 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h @@ -14,18 +14,17 @@ #include "llvm/Support/Error.h" #include "llvm/DebugInfo/PDB/PDBTypes.h" -#include "llvm/DebugInfo/PDB/Raw/NameMap.h" +#include "llvm/DebugInfo/PDB/Raw/NameMapBuilder.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" namespace llvm { namespace pdb { -class NameMap; class PDBFile; class InfoStreamBuilder { public: - InfoStreamBuilder(IPDBFile &File); + InfoStreamBuilder(); InfoStreamBuilder(const InfoStreamBuilder &) = delete; InfoStreamBuilder &operator=(const InfoStreamBuilder &) = delete; @@ -34,15 +33,17 @@ public: void setAge(uint32_t A); void setGuid(PDB_UniqueId G); - Expected<std::unique_ptr<InfoStream>> build(); + uint32_t calculateSerializedLength() const; + + Expected<std::unique_ptr<InfoStream>> build(PDBFile &File); private: - IPDBFile &File; Optional<PdbRaw_ImplVer> Ver; Optional<uint32_t> Sig; Optional<uint32_t> Age; Optional<PDB_UniqueId> Guid; - Optional<NameMap> NamedStreams; + + NameMapBuilder NamedStreams; }; } } diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/MsfBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/MsfBuilder.h index b2b4c7ab496..707d3d84072 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/MsfBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/MsfBuilder.h @@ -63,6 +63,9 @@ public: /// Request the block map to be at a specific block address. This is useful /// when editing a PDB and you want the layout to be as stable as possible. Error setBlockMapAddr(uint32_t Addr); + Error setDirectoryBlocksHint(ArrayRef<uint32_t> DirBlocks); + void setUnknown0(uint32_t Unk0); + void setUnknown1(uint32_t Unk1); /// Add a stream to the MSF file with the given size, occupying the given /// list of blocks. This is useful when reading a PDB file and you want a @@ -123,6 +126,8 @@ private: BumpPtrAllocator &Allocator; bool IsGrowable; + uint32_t Unknown0; + uint32_t Unknown1; uint32_t BlockSize; uint32_t MininumBlocks; uint32_t BlockMapAddr; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h new file mode 100644 index 00000000000..698e767d9e6 --- /dev/null +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h @@ -0,0 +1,34 @@ +//===- NameMapBuilder.h - PDB Name Map Builder ------------------*- 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_RAW_PDBNAMEMAPBUILDER_H +#define LLVM_DEBUGINFO_PDB_RAW_PDBNAMEMAPBUILDER_H + +#include "llvm/Support/Error.h" + +#include <cstdint> +#include <memory> + +namespace llvm { +namespace pdb { +class NameMap; + +class NameMapBuilder { +public: + NameMapBuilder(); + + Expected<std::unique_ptr<NameMap>> build(); + + uint32_t calculateSerializedLength() const; +}; + +} // end namespace pdb +} // end namespace llvm + +#endif // LLVM_DEBUGINFO_PDB_RAW_PDBNAMEMAPBUILDER_H diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h index 71d7c6144c3..82551971dda 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h @@ -14,6 +14,7 @@ #include "llvm/DebugInfo/CodeView/StreamArray.h" #include "llvm/DebugInfo/CodeView/StreamInterface.h" #include "llvm/DebugInfo/PDB/Raw/IPDBFile.h" +#include "llvm/DebugInfo/PDB/Raw/MsfCommon.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" @@ -37,38 +38,10 @@ class PublicsStream; class SymbolStream; class TpiStream; -static const char MsfMagic[] = {'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', - 't', ' ', 'C', '/', 'C', '+', '+', ' ', - 'M', 'S', 'F', ' ', '7', '.', '0', '0', - '\r', '\n', '\x1a', 'D', 'S', '\0', '\0', '\0'}; - class PDBFile : public IPDBFile { friend PDBFileBuilder; public: - // The superblock is overlaid at the beginning of the file (offset 0). - // It starts with a magic header and is followed by information which - // describes the layout of the file system. - struct SuperBlock { - char MagicBytes[sizeof(MsfMagic)]; - // The file system is split into a variable number of fixed size elements. - // These elements are referred to as blocks. The size of a block may vary - // from system to system. - support::ulittle32_t BlockSize; - // This field's purpose is not yet known. - support::ulittle32_t Unknown0; - // This contains the number of blocks resident in the file system. In - // practice, NumBlocks * BlockSize is equivalent to the size of the PDB - // file. - support::ulittle32_t NumBlocks; - // This contains the number of bytes which make up the directory. - support::ulittle32_t NumDirectoryBytes; - // This field's purpose is not yet known. - support::ulittle32_t Unknown1; - // This contains the block # of the block map. - support::ulittle32_t BlockMapAddr; - }; - explicit PDBFile(std::unique_ptr<codeview::StreamInterface> PdbFileBuffer); ~PDBFile() override; @@ -103,14 +76,6 @@ public: Error parseFileHeaders(); Error parseStreamData(); - static uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize) { - return alignTo(NumBytes, BlockSize) / BlockSize; - } - - static uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize) { - return BlockNumber * BlockSize; - } - Expected<InfoStream &> getPDBInfoStream(); Expected<DbiStream &> getPDBDbiStream(); Expected<TpiStream &> getPDBTpiStream(); @@ -122,12 +87,12 @@ public: Error commit(); private: - Error setSuperBlock(const SuperBlock *Block); + Error setSuperBlock(const msf::SuperBlock *Block); BumpPtrAllocator Allocator; std::unique_ptr<codeview::StreamInterface> Buffer; - const PDBFile::SuperBlock *SB; + const msf::SuperBlock *SB; ArrayRef<support::ulittle32_t> StreamSizes; ArrayRef<support::ulittle32_t> DirectoryBlocks; std::vector<ArrayRef<support::ulittle32_t>> StreamMap; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h index ba7ca935e5f..47c755b4326 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h @@ -11,10 +11,12 @@ #define LLVM_DEBUGINFO_PDB_RAW_PDBFILEBUILDER_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/BitVector.h" #include "llvm/ADT/Optional.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" +#include "llvm/DebugInfo/PDB/Raw/MsfBuilder.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include <memory> @@ -32,27 +34,24 @@ class PDBFile; class PDBFileBuilder { public: explicit PDBFileBuilder( - std::unique_ptr<codeview::StreamInterface> PdbFileBuffer); + std::unique_ptr<codeview::StreamInterface> FileBuffer); PDBFileBuilder(const PDBFileBuilder &) = delete; PDBFileBuilder &operator=(const PDBFileBuilder &) = delete; - Error setSuperBlock(const PDBFile::SuperBlock &B); - void setStreamSizes(ArrayRef<support::ulittle32_t> S); - void setDirectoryBlocks(ArrayRef<support::ulittle32_t> D); - void setStreamMap(const std::vector<ArrayRef<support::ulittle32_t>> &S); - Error generateSimpleStreamMap(); + Error initialize(const msf::SuperBlock &Super); + MsfBuilder &getMsfBuilder(); InfoStreamBuilder &getInfoBuilder(); DbiStreamBuilder &getDbiBuilder(); Expected<std::unique_ptr<PDBFile>> build(); private: - std::unique_ptr<codeview::StreamInterface> PdbFileBuffer; std::unique_ptr<InfoStreamBuilder> Info; std::unique_ptr<DbiStreamBuilder> Dbi; std::unique_ptr<PDBFile> File; + std::unique_ptr<MsfBuilder> Msf; }; } } |