Skip to content

Commit

Permalink
Add section header stream to PDB.
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D25357

llvm-svn: 283825
  • Loading branch information
rui314 committed Oct 10, 2016
1 parent 914eef6 commit 5550595
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 19 deletions.
5 changes: 1 addition & 4 deletions lld/COFF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "Config.h"
#include "Error.h"
#include "InputFiles.h"
#include "PDB.h"
#include "SymbolTable.h"
#include "Symbols.h"
#include "Writer.h"
Expand Down Expand Up @@ -374,10 +373,8 @@ void LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
}

// Create a dummy PDB file to satisfy build sytem rules.
if (auto *Arg = Args.getLastArg(OPT_pdb)) {
if (auto *Arg = Args.getLastArg(OPT_pdb))
Config->PDBPath = Arg->getValue();
createPDB(Config->PDBPath);
}

// Handle /noentry
if (Args.hasArg(OPT_noentry)) {
Expand Down
6 changes: 5 additions & 1 deletion lld/COFF/PDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ using namespace llvm::support::endian;

static ExitOnError ExitOnErr;

void coff::createPDB(StringRef Path) {
void coff::createPDB(StringRef Path, ArrayRef<uint8_t> SectionTable) {
BumpPtrAllocator Alloc;
pdb::PDBFileBuilder Builder(Alloc);
ExitOnErr(Builder.initialize(4096)); // 4096 is blocksize
Expand Down Expand Up @@ -63,6 +63,10 @@ void coff::createPDB(StringRef Path) {
auto &IpiBuilder = Builder.getIpiBuilder();
IpiBuilder.setVersionHeader(pdb::PdbTpiV80);

// Add COFF section header stream.
ExitOnErr(
DbiBuilder.addDbgStream(pdb::DbgHeaderType::SectionHdr, SectionTable));

// Write to a file.
ExitOnErr(Builder.commit(Path));
}
3 changes: 2 additions & 1 deletion lld/COFF/PDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@
#ifndef LLD_COFF_PDB_H
#define LLD_COFF_PDB_H

#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"

namespace lld {
namespace coff {
void createPDB(llvm::StringRef Path);
void createPDB(llvm::StringRef Path, llvm::ArrayRef<uint8_t> SectionTable);
}
}

Expand Down
10 changes: 9 additions & 1 deletion lld/COFF/Writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
//
//===----------------------------------------------------------------------===//

#include "Writer.h"
#include "Config.h"
#include "DLL.h"
#include "Error.h"
#include "InputFiles.h"
#include "PDB.h"
#include "SymbolTable.h"
#include "Symbols.h"
#include "Writer.h"
#include "lld/Core/Parallel.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
Expand Down Expand Up @@ -147,6 +148,7 @@ class Writer {
std::unique_ptr<Chunk> DebugDirectory;
std::vector<std::unique_ptr<Chunk>> DebugRecords;
CVDebugRecordChunk *BuildId = nullptr;
ArrayRef<uint8_t> SectionTable;

uint64_t FileSize;
uint32_t PointerToSymbolTable = 0;
Expand Down Expand Up @@ -301,6 +303,10 @@ void Writer::run() {
writeSections();
sortExceptionTable();
writeBuildId();

if (!Config->PDBPath.empty())
createPDB(Config->PDBPath, SectionTable);

if (auto EC = Buffer->commit())
fatal(EC, "failed to write the output file");
}
Expand Down Expand Up @@ -719,6 +725,8 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
Sec->writeHeaderTo(Buf);
Buf += sizeof(coff_section);
}
SectionTable = ArrayRef<uint8_t>(
Buf - OutputSections.size() * sizeof(coff_section), Buf);

if (OutputSymtab.empty())
return;
Expand Down
4 changes: 1 addition & 3 deletions lld/COFF/Writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@

namespace lld {
namespace coff {

class Chunk;
class OutputSection;
class SymbolTable;

void writeResult(SymbolTable *T);

Expand Down
55 changes: 46 additions & 9 deletions lld/test/COFF/pdb.test
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,28 @@
# RUN: llvm-pdbdump pdb2yaml -stream-metadata -stream-directory -pdb-stream \
# RUN: -dbi-stream -ipi-stream %t.pdb | FileCheck %s

# RUN: llvm-pdbdump raw -section-headers %t.pdb | FileCheck -check-prefix RAW %s

# CHECK: MSF:
# CHECK-NEXT: SuperBlock:
# CHECK-NEXT: BlockSize: 4096
# CHECK-NEXT: FreeBlockMap:
# CHECK-NEXT: NumBlocks: 9
# CHECK-NEXT: NumDirectoryBytes: 40
# CHECK-NEXT: NumBlocks: 10
# CHECK-NEXT: NumDirectoryBytes: 48
# CHECK-NEXT: Unknown1: 0
# CHECK-NEXT: BlockMapAddr: 3
# CHECK-NEXT: NumDirectoryBlocks: 1
# CHECK-NEXT: DirectoryBlocks: [ 8 ]
# CHECK-NEXT: NumStreams: 5
# CHECK-NEXT: FileSize: 36864
# CHECK-NEXT: StreamSizes: [ 0, 48, 56, 68, 56 ]
# CHECK-NEXT: DirectoryBlocks: [ 9 ]
# CHECK-NEXT: NumStreams: 6
# CHECK-NEXT: FileSize: 40960
# CHECK-NEXT: StreamSizes: [ 0, 48, 56, 90, 56, 80 ]
# CHECK-NEXT: StreamMap:
# CHECK-NEXT: - Stream: [ ]
# CHECK-NEXT: - Stream: [ 4 ]
# CHECK-NEXT: - Stream: [ 6 ]
# CHECK-NEXT: - Stream: [ ]
# CHECK-NEXT: - Stream: [ 5 ]
# CHECK-NEXT: - Stream: [ 7 ]
# CHECK-NEXT: - Stream: [ 6 ]
# CHECK-NEXT: - Stream: [ 8 ]
# CHECK-NEXT: - Stream: [ 4 ]
# CHECK-NEXT: PdbStream:
# CHECK-NEXT: Age: 1
# CHECK-NEXT: Guid: '{00000000-0000-0000-0000-000000000000}'
Expand All @@ -40,6 +43,40 @@
# CHECK-NEXT: Version: VC80
# CHECK-NEXT: Records:

# RAW: Section Headers [
# RAW-NEXT: {
# RAW-NEXT: Name: .text
# RAW-NEXT: Virtual Size: 3
# RAW-NEXT: Virtual Address: 4096
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 512
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x60000020)
# RAW-NEXT: IMAGE_SCN_CNT_CODE (0x20)
# RAW-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Name: .rdata
# RAW-NEXT: Virtual Size: 107
# RAW-NEXT: Virtual Address: 8192
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 1024
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x40000040)
# RAW-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: ]

--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_I386
Expand Down

0 comments on commit 5550595

Please sign in to comment.