summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/StreamArray.h12
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h7
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/InfoStream.h2
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h13
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/MsfBuilder.h5
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h34
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h41
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h13
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;
};
}
}
OpenPOWER on IntegriCloud