[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