summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/CMakeLists.txt1
-rw-r--r--lld/COFF/PDB.cpp56
-rw-r--r--lld/test/COFF/pdb.test25
3 files changed, 52 insertions, 30 deletions
diff --git a/lld/COFF/CMakeLists.txt b/lld/COFF/CMakeLists.txt
index 659f89dcfa6..84215cee612 100644
--- a/lld/COFF/CMakeLists.txt
+++ b/lld/COFF/CMakeLists.txt
@@ -21,6 +21,7 @@ add_lld_library(lldCOFF
LINK_COMPONENTS
${LLVM_TARGETS_TO_BUILD}
Core
+ DebugInfoPDB
LTO
LibDriver
Object
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 9445dcb6938..0c38e26a70d 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -9,7 +9,16 @@
#include "PDB.h"
#include "Error.h"
+#include "llvm/DebugInfo/MSF/MSFBuilder.h"
#include "llvm/DebugInfo/MSF/MSFCommon.h"
+#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
+#include "llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h"
+#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
+#include "llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h"
+#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h"
+#include "llvm/DebugInfo/PDB/Raw/TpiStream.h"
+#include "llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/FileOutputBuffer.h"
#include <memory>
@@ -19,36 +28,45 @@ using namespace llvm;
using namespace llvm::support;
using namespace llvm::support::endian;
+static ExitOnError ExitOnErr;
+
const int BlockSize = 4096;
void coff::createPDB(StringRef Path) {
// Create a file.
- size_t FileSize = BlockSize * 3;
- ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
- FileOutputBuffer::create(Path, FileSize);
+ size_t FileSize = BlockSize * 10;
+ auto BufferOrErr = FileOutputBuffer::create(Path, FileSize);
if (auto EC = BufferOrErr.getError())
fatal(EC, "failed to open " + Path);
- std::unique_ptr<FileOutputBuffer> Buffer = std::move(*BufferOrErr);
+ auto FileByteStream =
+ llvm::make_unique<msf::FileBufferByteStream>(std::move(*BufferOrErr));
- // Write the file header.
- uint8_t *Buf = Buffer->getBufferStart();
- auto *SB = reinterpret_cast<msf::SuperBlock *>(Buf);
- memcpy(SB->MagicBytes, msf::Magic, sizeof(msf::Magic));
- SB->BlockSize = BlockSize;
+ // Create the superblock.
+ msf::SuperBlock SB;
+ memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic));
+ SB.BlockSize = 4096;
+ SB.FreeBlockMapBlock = 2;
+ SB.NumBlocks = 10;
+ SB.NumDirectoryBytes = 0;
+ SB.Unknown1 = 0;
+ SB.BlockMapAddr = 9;
- // FreeBlockMap is a page number containing free page map bitmap.
- // Set a dummy value for now.
- SB->FreeBlockMapBlock = 1;
+ BumpPtrAllocator Alloc;
+ pdb::PDBFileBuilder Builder(Alloc);
+ ExitOnErr(Builder.initialize(SB));
+ ExitOnErr(Builder.getMsfBuilder().setDirectoryBlocksHint({8}));
- SB->NumBlocks = FileSize / BlockSize;
+ ExitOnErr(Builder.getMsfBuilder().addStream(1, {4}));
+ ExitOnErr(Builder.getMsfBuilder().addStream(1, {5}));
+ ExitOnErr(Builder.getMsfBuilder().addStream(1, {6}));
- // Root directory is empty, containing only the length field.
- SB->NumDirectoryBytes = 4;
+ // Add an empty IPI stream.
+ Builder.getInfoBuilder();
- // Root directory is on page 1.
- SB->BlockMapAddr = 1;
+ // Add an empty TPI stream.
+ auto &TpiBuilder = Builder.getTpiBuilder();
+ TpiBuilder.setVersionHeader(pdb::PdbTpiV80);
// Write the root directory. Root stream is on page 2.
- write32le(Buf + BlockSize, 2);
- Buffer->commit();
+ ExitOnErr(Builder.commit(*FileByteStream));
}
diff --git a/lld/test/COFF/pdb.test b/lld/test/COFF/pdb.test
index 169b39924cb..ade135af7b9 100644
--- a/lld/test/COFF/pdb.test
+++ b/lld/test/COFF/pdb.test
@@ -4,18 +4,21 @@
# CHECK: MSF:
# CHECK-NEXT: SuperBlock:
-# CHECK-NEXT: BlockSize: 4096
-# CHECK-NEXT: FreeBlockMap: 1
-# CHECK-NEXT: NumBlocks: 3
-# CHECK-NEXT: NumDirectoryBytes: 4
-# CHECK-NEXT: Unknown1: 0
-# CHECK-NEXT: BlockMapAddr: 1
-# CHECK-NEXT: NumDirectoryBlocks: 1
-# CHECK-NEXT: DirectoryBlocks: [ 2 ]
-# CHECK-NEXT: NumStreams: 0
-# CHECK-NEXT: FileSize: 12288
-# CHECK-NEXT: StreamSizes: [ ]
+# CHECK-NEXT: BlockSize: 4096
+# CHECK-NEXT: FreeBlockMap: 2
+# CHECK-NEXT: NumBlocks: 10
+# CHECK-NEXT: NumDirectoryBytes: 28
+# CHECK-NEXT: Unknown1: 0
+# CHECK-NEXT: BlockMapAddr: 9
+# CHECK-NEXT: NumDirectoryBlocks: 1
+# CHECK-NEXT: DirectoryBlocks: [ 8 ]
+# CHECK-NEXT: NumStreams: 3
+# CHECK-NEXT: FileSize: 40960
+# CHECK-NEXT: StreamSizes: [ 1, 48, 56 ]
# CHECK-NEXT: StreamMap:
+# CHECK-NEXT: - Stream: [ 4 ]
+# CHECK-NEXT: - Stream: [ 5 ]
+# CHECK-NEXT: - Stream: [ 6 ]
--- !COFF
header:
OpenPOWER on IntegriCloud