[lld] r280012 - COFF: add beginnings of debug directory creation
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 1 15:57:11 PDT 2016
I worked around this change in llvm-symbolizer in r280410, which has us
check if the PDB name in the debug directory is empty before using
PDBContext. We probably want a more robust way to signal whether the binary
has dwarf or PDB info.
On Thu, Sep 1, 2016 at 11:28 AM, Reid Kleckner <rnk at google.com> wrote:
> This broke an asan test that is trying to test the combination of LLD and
> DWARF:
> http://lab.llvm.org:8011/builders/sanitizer-windows/
> builds/28266/steps/run%20tests/logs/stdio
>
> It is only visible now because other breakage has been fixed. I don't want
> to revert, since this seems like the right path forward, but in the future,
> if you could watch that bot rather than relying failure email, I'd
> appreciate it. The winasan bot is the closest thing we have to end-to-end
> tests for the whole LLVM toolchain, so it's really sensitive to these kinds
> of changes.
>
> In this case what's going on is llvm-symbolizer sees the new debug
> directory with a PDB path in it and says "aha, this file has PDBs, not
> DWARF, I'll look there", and then the test fails because it lacks debug
> info.
>
> On Mon, Aug 29, 2016 at 2:20 PM, Saleem Abdulrasool via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: compnerd
>> Date: Mon Aug 29 16:20:46 2016
>> New Revision: 280012
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=280012&view=rev
>> Log:
>> COFF: add beginnings of debug directory creation
>>
>> The IMAGE_FILE_HEADER structure contains a (RVA, size) to an array of
>> COFF_DEBUG_DIRECTORY records. Each one of these records contains an RVA
>> to a OMF
>> Debug Directory. These OMF debug directories are derived into newer types
>> such
>> as PDB70, PDB20, etc. This constructs a PDB70 structure which will allow
>> us to
>> associate a GUID with a build to actually tie debug information.
>>
>> Added:
>> lld/trunk/test/COFF/rsds.test
>> Modified:
>> lld/trunk/COFF/Config.h
>> lld/trunk/COFF/Driver.cpp
>> lld/trunk/COFF/Writer.cpp
>> lld/trunk/test/COFF/delayimports32.test
>> lld/trunk/test/COFF/symtab.test
>>
>> Modified: lld/trunk/COFF/Config.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?
>> rev=280012&r1=280011&r2=280012&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/COFF/Config.h (original)
>> +++ lld/trunk/COFF/Config.h Mon Aug 29 16:20:46 2016
>> @@ -86,6 +86,7 @@ struct Configuration {
>> bool Debug = false;
>> bool WriteSymtab = true;
>> unsigned DebugTypes = static_cast<unsigned>(DebugType::None);
>> + StringRef PDBPath;
>>
>> // Symbols in this set are considered as live by the garbage collector.
>> std::set<Undefined *> GCRoot;
>>
>> Modified: lld/trunk/COFF/Driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cp
>> p?rev=280012&r1=280011&r2=280012&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/COFF/Driver.cpp (original)
>> +++ lld/trunk/COFF/Driver.cpp Mon Aug 29 16:20:46 2016
>> @@ -372,6 +372,12 @@ void LinkerDriver::link(llvm::ArrayRef<c
>> : getDefaultDebugType(Args);
>> }
>>
>> + // Create a dummy PDB file to satisfy build sytem rules.
>> + if (auto *Arg = Args.getLastArg(OPT_pdb)) {
>> + Config->PDBPath = Arg->getValue();
>> + createPDB(Config->PDBPath);
>> + }
>> +
>> // Handle /noentry
>> if (Args.hasArg(OPT_noentry)) {
>> if (!Args.hasArg(OPT_dll))
>> @@ -743,10 +749,6 @@ void LinkerDriver::link(llvm::ArrayRef<c
>> if (Config->Manifest == Configuration::SideBySide)
>> createSideBySideManifest();
>>
>> - // Create a dummy PDB file to satisfy build sytem rules.
>> - if (auto *Arg = Args.getLastArg(OPT_pdb))
>> - createPDB(Arg->getValue());
>> -
>> // Identify unreferenced COMDAT sections.
>> if (Config->DoGC)
>> markLive(Symtab.getChunks());
>>
>> Modified: lld/trunk/COFF/Writer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cp
>> p?rev=280012&r1=280011&r2=280012&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/COFF/Writer.cpp (original)
>> +++ lld/trunk/COFF/Writer.cpp Mon Aug 29 16:20:46 2016
>> @@ -21,6 +21,7 @@
>> #include "llvm/Support/Debug.h"
>> #include "llvm/Support/Endian.h"
>> #include "llvm/Support/FileOutputBuffer.h"
>> +#include "llvm/Support/RandomNumberGenerator.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include <algorithm>
>> #include <cstdio>
>> @@ -42,6 +43,61 @@ static const int DOSStubSize = 64;
>> static const int NumberfOfDataDirectory = 16;
>>
>> namespace {
>> +
>> +class DebugDirectoryChunk : public Chunk {
>> +public:
>> + DebugDirectoryChunk(const std::vector<std::unique_ptr<Chunk>> &R)
>> + : Records(R) {}
>> +
>> + size_t getSize() const override {
>> + return Records.size() * sizeof(debug_directory);
>> + }
>> +
>> + void writeTo(uint8_t *B) const override {
>> + auto *D = reinterpret_cast<debug_directory *>(B + OutputSectionOff);
>> +
>> + for (const std::unique_ptr<Chunk> &Record : Records) {
>> + D->Characteristics = 0;
>> + D->TimeDateStamp = 0;
>> + D->MajorVersion = 0;
>> + D->MinorVersion = 0;
>> + D->Type = COFF::IMAGE_DEBUG_TYPE_CODEVIEW;
>> + D->SizeOfData = Record->getSize();
>> + D->AddressOfRawData = Record->getRVA();
>> + // TODO(compnerd) get the file offset
>> + D->PointerToRawData = 0;
>> +
>> + ++D;
>> + }
>> + }
>> +
>> +private:
>> + const std::vector<std::unique_ptr<Chunk>> &Records;
>> +};
>> +
>> +class CVDebugRecordChunk : public Chunk {
>> + size_t getSize() const override {
>> + return sizeof(codeview::DebugInfo) + Config->PDBPath.size() + 1;
>> + }
>> +
>> + void writeTo(uint8_t *B) const override {
>> + auto *R = reinterpret_cast<codeview::DebugInfo *>(B +
>> OutputSectionOff);
>> +
>> + R->Signature.CVSignature = OMF::Signature::PDB70;
>> + // TODO(compnerd) fill in a GUID by hashing the contents of the
>> binary to
>> + // get a reproducible build
>> + if (getRandomBytes(R->PDB70.Signature, sizeof(R->PDB70.Signature)))
>> + fatal("entropy source failure");
>> + // TODO(compnerd) track the Age
>> + R->PDB70.Age = 1;
>> +
>> + // variable sized field (PDB Path)
>> + auto *P = reinterpret_cast<char *>(B + OutputSectionOff +
>> sizeof(*R));
>> + memcpy(P, Config->PDBPath.data(), Config->PDBPath.size());
>> + P[Config->PDBPath.size()] = '\0';
>> + }
>> +};
>> +
>> // The writer writes a SymbolTable result to a file.
>> class Writer {
>> public:
>> @@ -87,6 +143,9 @@ private:
>> EdataContents Edata;
>> std::unique_ptr<SEHTableChunk> SEHTable;
>>
>> + std::unique_ptr<Chunk> DebugDirectory;
>> + std::vector<std::unique_ptr<Chunk>> DebugRecords;
>> +
>> uint64_t FileSize;
>> uint32_t PointerToSymbolTable = 0;
>> uint64_t SizeOfImage;
>> @@ -294,6 +353,19 @@ void Writer::createMiscChunks() {
>> RData->addChunk(C);
>> }
>>
>> + // Create Debug Information Chunks
>> + if (Config->Debug) {
>> + DebugDirectory = make_unique<DebugDirectoryChunk>(DebugRecords);
>> +
>> + // TODO(compnerd) create a coffgrp entry if DebugType::CV is not
>> enabled
>> + if (Config->DebugTypes & static_cast<unsigned>(coff::DebugType::CV))
>> + DebugRecords.push_back(make_unique<CVDebugRecordChunk>());
>> +
>> + RData->addChunk(DebugDirectory.get());
>> + for (const std::unique_ptr<Chunk> &C : DebugRecords)
>> + RData->addChunk(C.get());
>> + }
>> +
>> // Create SEH table. x86-only.
>> if (Config->Machine != I386)
>> return;
>> @@ -608,6 +680,10 @@ template <typename PEHeaderTy> void Writ
>> : sizeof(object::coff_tls_directory32);
>> }
>> }
>> + if (Config->Debug) {
>> + Dir[DEBUG_DIRECTORY].RelativeVirtualAddress =
>> DebugDirectory->getRVA();
>> + Dir[DEBUG_DIRECTORY].Size = DebugDirectory->getSize();
>> + }
>> if (Symbol *Sym = Symtab->findUnderscore("_load_config_used")) {
>> if (auto *B = dyn_cast<DefinedRegular>(Sym->Body)) {
>> SectionChunk *SC = B->getChunk();
>>
>> Modified: lld/trunk/test/COFF/delayimports32.test
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dela
>> yimports32.test?rev=280012&r1=280011&r2=280012&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/test/COFF/delayimports32.test (original)
>> +++ lld/trunk/test/COFF/delayimports32.test Mon Aug 29 16:20:46 2016
>> @@ -14,7 +14,7 @@ IMPORT-NEXT: Name: std32.dll
>> IMPORT-NEXT: Attributes: 0x1
>> IMPORT-NEXT: ModuleHandle: 0x1018
>> IMPORT-NEXT: ImportAddressTable: 0x1020
>> -IMPORT-NEXT: ImportNameTable: 0x3040
>> +IMPORT-NEXT: ImportNameTable: 0x4040
>> IMPORT-NEXT: BoundDelayImportTable: 0x0
>> IMPORT-NEXT: UnloadDelayImportTable: 0x0
>> IMPORT-NEXT: Import {
>> @@ -71,7 +71,7 @@ BASEREL-NEXT: }
>> BASEREL-NEXT: ]
>>
>> DISASM: 202b: 68 20 10 40 00 pushl $4198432
>> -DISASM-NEXT: 2030: 68 00 30 40 00 pushl $4206592
>> +DISASM-NEXT: 2030: 68 00 40 40 00 pushl $4210688
>> DISASM-NEXT: 2035: e8 c6 ff ff ff calll -58 <_main at 0>
>> DISASM-NEXT: 203a: 5a popl %edx
>> DISASM-NEXT: 203b: 59 popl %ecx
>> @@ -79,7 +79,7 @@ DISASM-NEXT: 203c: ff e0 jmpl
>> DISASM-NEXT: 203e: 51 pushl %ecx
>> DISASM-NEXT: 203f: 52 pushl %edx
>> DISASM-NEXT: 2040: 68 24 10 40 00 pushl $4198436
>> -DISASM-NEXT: 2045: 68 00 30 40 00 pushl $4206592
>> +DISASM-NEXT: 2045: 68 00 40 40 00 pushl $4210688
>> DISASM-NEXT: 204a: e8 b1 ff ff ff calll -79 <_main at 0>
>> DISASM-NEXT: 204f: 5a popl %edx
>> DISASM-NEXT: 2050: 59 popl %ecx
>>
>> Added: lld/trunk/test/COFF/rsds.test
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/rsds
>> .test?rev=280012&view=auto
>> ============================================================
>> ==================
>> --- lld/trunk/test/COFF/rsds.test (added)
>> +++ lld/trunk/test/COFF/rsds.test Mon Aug 29 16:20:46 2016
>> @@ -0,0 +1,113 @@
>> +# RUN: yaml2obj %s > %t.obj
>> +
>> +# RUN: lld-link /debug /dll /out:%t.dll /entry:DllMain %t.obj
>> +# RUN: llvm-readobj -coff-debug-directory %t.dll | FileCheck %s
>> +
>> +# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:DllMain %t.obj
>> +# RUN: llvm-readobj -coff-debug-directory %t.dll | FileCheck %s
>> -check-prefix CHECK-PDB
>> +
>> +# CHECK: DebugDirectory [
>> +# CHECK: DebugEntry {
>> +# CHECK: Characteristics: 0x0
>> +# CHECK: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
>> +# CHECK: MajorVersion: 0x0
>> +# CHECK: MinorVersion: 0x0
>> +# CHECK: Type: CodeView (0x2)
>> +# CHECK: SizeOfData: 0x19
>> +# CHECK: AddressOfRawData:
>> +# CHECK: PointerToRawData:
>> +# CHECK: PDBInfo {
>> +# CHECK: PDBSignature: 0x53445352
>> +# CHECK: PDBGUID:
>> +# CHECK: PDBAge: 1
>> +# CHECK: PDBFileName: {{$}}
>> +# CHECK: }
>> +# CHECK: }
>> +# CHECK: ]
>> +
>> +# CHECK-PDB: DebugDirectory [
>> +# CHECK-PDB: DebugEntry {
>> +# CHECK-PDB: Characteristics: 0x0
>> +# CHECK-PDB: TimeDateStamp: 1970-01-01 00:00:00 (0x0)
>> +# CHECK-PDB: MajorVersion: 0x0
>> +# CHECK-PDB: MinorVersion: 0x0
>> +# CHECK-PDB: Type: CodeView (0x2)
>> +# CHECK-PDB: SizeOfData:
>> +# CHECK-PDB: AddressOfRawData:
>> +# CHECK-PDB: PointerToRawData:
>> +# CHECK-PDB: PDBInfo {
>> +# CHECK-PDB: PDBSignature: 0x53445352
>> +# CHECK-PDB: PDBGUID:
>> +# CHECK-PDB: PDBAge: 1
>> +# CHECK-PDB: PDBFileName: {{.*}}.pdb
>> +# CHECK-PDB: }
>> +# CHECK-PDB: }
>> +# CHECK-PDB: ]
>> +
>> +--- !COFF
>> +header:
>> + Machine: IMAGE_FILE_MACHINE_I386
>> + Characteristics: [ ]
>> +sections:
>> + - Name: .text
>> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
>> IMAGE_SCN_MEM_READ ]
>> + Alignment: 4
>> + SectionData: 31C0C3
>> + - Name: .data
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: ''
>> + - Name: .bss
>> + Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: ''
>> +symbols:
>> + - Name: .text
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 3
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 3963538403
>> + Number: 1
>> + - Name: .data
>> + Value: 0
>> + SectionNumber: 2
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 0
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 2
>> + - Name: .bss
>> + Value: 0
>> + SectionNumber: 3
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 0
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 3
>> + - Name: '@feat.00'
>> + Value: 1
>> + SectionNumber: -1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + - Name: _DllMain
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> +...
>>
>> Modified: lld/trunk/test/COFF/symtab.test
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/symt
>> ab.test?rev=280012&r1=280011&r2=280012&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/test/COFF/symtab.test (original)
>> +++ lld/trunk/test/COFF/symtab.test Mon Aug 29 16:20:46 2016
>> @@ -74,7 +74,7 @@
>> # CHECK-NEXT: Symbol {
>> # CHECK-NEXT: Name: __imp_ExitProcess
>> # CHECK-NEXT: Value: 64
>> -# CHECK-NEXT: Section: .idata (4)
>> +# CHECK-NEXT: Section: .idata (5)
>> # CHECK-NEXT: BaseType: Null (0x0)
>> # CHECK-NEXT: ComplexType: Null (0x0)
>> # CHECK-NEXT: StorageClass: External (0x2)
>> @@ -92,7 +92,7 @@
>> # CHECK-NEXT: Symbol {
>> # CHECK-NEXT: Name: __imp_MessageBoxA
>> # CHECK-NEXT: Value: 72
>> -# CHECK-NEXT: Section: .idata (4)
>> +# CHECK-NEXT: Section: .idata (5)
>> # CHECK-NEXT: BaseType: Null (0x0)
>> # CHECK-NEXT: ComplexType: Null (0x0)
>> # CHECK-NEXT: StorageClass: External (0x2)
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160901/2bde72ef/attachment.html>
More information about the llvm-commits
mailing list