<div dir="ltr">This broke an asan test that is trying to test the combination of LLD and DWARF:<div><a href="http://lab.llvm.org:8011/builders/sanitizer-windows/builds/28266/steps/run%20tests/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-windows/builds/28266/steps/run%20tests/logs/stdio</a><br></div><div><br></div><div>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.</div><div><br></div><div>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.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 29, 2016 at 2:20 PM, Saleem Abdulrasool via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Mon Aug 29 16:20:46 2016<br>
New Revision: 280012<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=280012&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=280012&view=rev</a><br>
Log:<br>
COFF: add beginnings of debug directory creation<br>
<br>
The IMAGE_FILE_HEADER structure contains a (RVA, size) to an array of<br>
COFF_DEBUG_DIRECTORY records. Each one of these records contains an RVA to a OMF<br>
Debug Directory. These OMF debug directories are derived into newer types such<br>
as PDB70, PDB20, etc. This constructs a PDB70 structure which will allow us to<br>
associate a GUID with a build to actually tie debug information.<br>
<br>
Added:<br>
    lld/trunk/test/COFF/rsds.test<br>
Modified:<br>
    lld/trunk/COFF/Config.h<br>
    lld/trunk/COFF/Driver.cpp<br>
    lld/trunk/COFF/Writer.cpp<br>
    lld/trunk/test/COFF/<wbr>delayimports32.test<br>
    lld/trunk/test/COFF/symtab.<wbr>test<br>
<br>
Modified: lld/trunk/COFF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=280012&r1=280011&r2=280012&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Config.<wbr>h?rev=280012&r1=280011&r2=<wbr>280012&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Config.h (original)<br>
+++ lld/trunk/COFF/Config.h Mon Aug 29 16:20:46 2016<br>
@@ -86,6 +86,7 @@ struct Configuration {<br>
   bool Debug = false;<br>
   bool WriteSymtab = true;<br>
   unsigned DebugTypes = static_cast<unsigned>(<wbr>DebugType::None);<br>
+  StringRef PDBPath;<br>
<br>
   // Symbols in this set are considered as live by the garbage collector.<br>
   std::set<Undefined *> GCRoot;<br>
<br>
Modified: lld/trunk/COFF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=280012&r1=280011&r2=280012&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Driver.<wbr>cpp?rev=280012&r1=280011&r2=<wbr>280012&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Driver.cpp (original)<br>
+++ lld/trunk/COFF/Driver.cpp Mon Aug 29 16:20:46 2016<br>
@@ -372,6 +372,12 @@ void LinkerDriver::link(llvm::<wbr>ArrayRef<c<br>
             : getDefaultDebugType(Args);<br>
   }<br>
<br>
+  // Create a dummy PDB file to satisfy build sytem rules.<br>
+  if (auto *Arg = Args.getLastArg(OPT_pdb)) {<br>
+    Config->PDBPath = Arg->getValue();<br>
+    createPDB(Config->PDBPath);<br>
+  }<br>
+<br>
   // Handle /noentry<br>
   if (Args.hasArg(OPT_noentry)) {<br>
     if (!Args.hasArg(OPT_dll))<br>
@@ -743,10 +749,6 @@ void LinkerDriver::link(llvm::<wbr>ArrayRef<c<br>
   if (Config->Manifest == Configuration::SideBySide)<br>
     createSideBySideManifest();<br>
<br>
-  // Create a dummy PDB file to satisfy build sytem rules.<br>
-  if (auto *Arg = Args.getLastArg(OPT_pdb))<br>
-    createPDB(Arg->getValue());<br>
-<br>
   // Identify unreferenced COMDAT sections.<br>
   if (Config->DoGC)<br>
     markLive(Symtab.getChunks());<br>
<br>
Modified: lld/trunk/COFF/Writer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=280012&r1=280011&r2=280012&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Writer.<wbr>cpp?rev=280012&r1=280011&r2=<wbr>280012&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Writer.cpp (original)<br>
+++ lld/trunk/COFF/Writer.cpp Mon Aug 29 16:20:46 2016<br>
@@ -21,6 +21,7 @@<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/<wbr>FileOutputBuffer.h"<br>
+#include "llvm/Support/<wbr>RandomNumberGenerator.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
 #include <algorithm><br>
 #include <cstdio><br>
@@ -42,6 +43,61 @@ static const int DOSStubSize = 64;<br>
 static const int NumberfOfDataDirectory = 16;<br>
<br>
 namespace {<br>
+<br>
+class DebugDirectoryChunk : public Chunk {<br>
+public:<br>
+  DebugDirectoryChunk(const std::vector<std::unique_ptr<<wbr>Chunk>> &R)<br>
+      : Records(R) {}<br>
+<br>
+  size_t getSize() const override {<br>
+    return Records.size() * sizeof(debug_directory);<br>
+  }<br>
+<br>
+  void writeTo(uint8_t *B) const override {<br>
+    auto *D = reinterpret_cast<debug_<wbr>directory *>(B + OutputSectionOff);<br>
+<br>
+    for (const std::unique_ptr<Chunk> &Record : Records) {<br>
+      D->Characteristics = 0;<br>
+      D->TimeDateStamp = 0;<br>
+      D->MajorVersion = 0;<br>
+      D->MinorVersion = 0;<br>
+      D->Type = COFF::IMAGE_DEBUG_TYPE_<wbr>CODEVIEW;<br>
+      D->SizeOfData = Record->getSize();<br>
+      D->AddressOfRawData = Record->getRVA();<br>
+      // TODO(compnerd) get the file offset<br>
+      D->PointerToRawData = 0;<br>
+<br>
+      ++D;<br>
+    }<br>
+  }<br>
+<br>
+private:<br>
+  const std::vector<std::unique_ptr<<wbr>Chunk>> &Records;<br>
+};<br>
+<br>
+class CVDebugRecordChunk : public Chunk {<br>
+  size_t getSize() const override {<br>
+    return sizeof(codeview::DebugInfo) + Config->PDBPath.size() + 1;<br>
+  }<br>
+<br>
+  void writeTo(uint8_t *B) const override {<br>
+    auto *R = reinterpret_cast<codeview::<wbr>DebugInfo *>(B + OutputSectionOff);<br>
+<br>
+    R->Signature.CVSignature = OMF::Signature::PDB70;<br>
+    // TODO(compnerd) fill in a GUID by hashing the contents of the binary to<br>
+    // get a reproducible build<br>
+    if (getRandomBytes(R->PDB70.<wbr>Signature, sizeof(R->PDB70.Signature)))<br>
+      fatal("entropy source failure");<br>
+    // TODO(compnerd) track the Age<br>
+    R->PDB70.Age = 1;<br>
+<br>
+    // variable sized field (PDB Path)<br>
+    auto *P = reinterpret_cast<char *>(B + OutputSectionOff + sizeof(*R));<br>
+    memcpy(P, Config->PDBPath.data(), Config->PDBPath.size());<br>
+    P[Config->PDBPath.size()] = '\0';<br>
+  }<br>
+};<br>
+<br>
 // The writer writes a SymbolTable result to a file.<br>
 class Writer {<br>
 public:<br>
@@ -87,6 +143,9 @@ private:<br>
   EdataContents Edata;<br>
   std::unique_ptr<SEHTableChunk> SEHTable;<br>
<br>
+  std::unique_ptr<Chunk> DebugDirectory;<br>
+  std::vector<std::unique_ptr<<wbr>Chunk>> DebugRecords;<br>
+<br>
   uint64_t FileSize;<br>
   uint32_t PointerToSymbolTable = 0;<br>
   uint64_t SizeOfImage;<br>
@@ -294,6 +353,19 @@ void Writer::createMiscChunks() {<br>
       RData->addChunk(C);<br>
   }<br>
<br>
+  // Create Debug Information Chunks<br>
+  if (Config->Debug) {<br>
+    DebugDirectory = make_unique<<wbr>DebugDirectoryChunk>(<wbr>DebugRecords);<br>
+<br>
+    // TODO(compnerd) create a coffgrp entry if DebugType::CV is not enabled<br>
+    if (Config->DebugTypes & static_cast<unsigned>(coff::<wbr>DebugType::CV))<br>
+      DebugRecords.push_back(make_<wbr>unique<CVDebugRecordChunk>());<br>
+<br>
+    RData->addChunk(<wbr>DebugDirectory.get());<br>
+    for (const std::unique_ptr<Chunk> &C : DebugRecords)<br>
+      RData->addChunk(C.get());<br>
+  }<br>
+<br>
   // Create SEH table. x86-only.<br>
   if (Config->Machine != I386)<br>
     return;<br>
@@ -608,6 +680,10 @@ template <typename PEHeaderTy> void Writ<br>
                                 : sizeof(object::coff_tls_<wbr>directory32);<br>
     }<br>
   }<br>
+  if (Config->Debug) {<br>
+    Dir[DEBUG_DIRECTORY].<wbr>RelativeVirtualAddress = DebugDirectory->getRVA();<br>
+    Dir[DEBUG_DIRECTORY].Size = DebugDirectory->getSize();<br>
+  }<br>
   if (Symbol *Sym = Symtab->findUnderscore("_load_<wbr>config_used")) {<br>
     if (auto *B = dyn_cast<DefinedRegular>(Sym-><wbr>Body)) {<br>
       SectionChunk *SC = B->getChunk();<br>
<br>
Modified: lld/trunk/test/COFF/<wbr>delayimports32.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/delayimports32.test?rev=280012&r1=280011&r2=280012&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/COFF/<wbr>delayimports32.test?rev=<wbr>280012&r1=280011&r2=280012&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/COFF/<wbr>delayimports32.test (original)<br>
+++ lld/trunk/test/COFF/<wbr>delayimports32.test Mon Aug 29 16:20:46 2016<br>
@@ -14,7 +14,7 @@ IMPORT-NEXT:   Name: std32.dll<br>
 IMPORT-NEXT:   Attributes: 0x1<br>
 IMPORT-NEXT:   ModuleHandle: 0x1018<br>
 IMPORT-NEXT:   ImportAddressTable: 0x1020<br>
-IMPORT-NEXT:   ImportNameTable: 0x3040<br>
+IMPORT-NEXT:   ImportNameTable: 0x4040<br>
 IMPORT-NEXT:   BoundDelayImportTable: 0x0<br>
 IMPORT-NEXT:   UnloadDelayImportTable: 0x0<br>
 IMPORT-NEXT:   Import {<br>
@@ -71,7 +71,7 @@ BASEREL-NEXT:   }<br>
 BASEREL-NEXT: ]<br>
<br>
 DISASM:      202b:      68 20 10 40 00  pushl   $4198432<br>
-DISASM-NEXT: 2030:      68 00 30 40 00  pushl   $4206592<br>
+DISASM-NEXT: 2030:      68 00 40 40 00  pushl   $4210688<br>
 DISASM-NEXT: 2035:      e8 c6 ff ff ff  calll   -58 <_main@0><br>
 DISASM-NEXT: 203a:      5a      popl    %edx<br>
 DISASM-NEXT: 203b:      59      popl    %ecx<br>
@@ -79,7 +79,7 @@ DISASM-NEXT: 203c:      ff e0   jmpl<br>
 DISASM-NEXT: 203e:      51      pushl   %ecx<br>
 DISASM-NEXT: 203f:      52      pushl   %edx<br>
 DISASM-NEXT: 2040:      68 24 10 40 00  pushl   $4198436<br>
-DISASM-NEXT: 2045:      68 00 30 40 00  pushl   $4206592<br>
+DISASM-NEXT: 2045:      68 00 40 40 00  pushl   $4210688<br>
 DISASM-NEXT: 204a:      e8 b1 ff ff ff  calll   -79 <_main@0><br>
 DISASM-NEXT: 204f:      5a      popl    %edx<br>
 DISASM-NEXT: 2050:      59      popl    %ecx<br>
<br>
Added: lld/trunk/test/COFF/rsds.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/rsds.test?rev=280012&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/COFF/<wbr>rsds.test?rev=280012&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/COFF/rsds.test (added)<br>
+++ lld/trunk/test/COFF/rsds.test Mon Aug 29 16:20:46 2016<br>
@@ -0,0 +1,113 @@<br>
+# RUN: yaml2obj %s > %t.obj<br>
+<br>
+# RUN: lld-link /debug /dll /out:%t.dll /entry:DllMain %t.obj<br>
+# RUN: llvm-readobj -coff-debug-directory %t.dll | FileCheck %s<br>
+<br>
+# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:DllMain %t.obj<br>
+# RUN: llvm-readobj -coff-debug-directory %t.dll | FileCheck %s -check-prefix CHECK-PDB<br>
+<br>
+# CHECK: DebugDirectory [<br>
+# CHECK:   DebugEntry {<br>
+# CHECK:     Characteristics: 0x0<br>
+# CHECK:     TimeDateStamp: 1970-01-01 00:00:00 (0x0)<br>
+# CHECK:     MajorVersion: 0x0<br>
+# CHECK:     MinorVersion: 0x0<br>
+# CHECK:     Type: CodeView (0x2)<br>
+# CHECK:     SizeOfData: 0x19<br>
+# CHECK:     AddressOfRawData:<br>
+# CHECK:     PointerToRawData:<br>
+# CHECK:     PDBInfo {<br>
+# CHECK:       PDBSignature: 0x53445352<br>
+# CHECK:       PDBGUID:<br>
+# CHECK:       PDBAge: 1<br>
+# CHECK:       PDBFileName: {{$}}<br>
+# CHECK:     }<br>
+# CHECK:   }<br>
+# CHECK: ]<br>
+<br>
+# CHECK-PDB: DebugDirectory [<br>
+# CHECK-PDB:   DebugEntry {<br>
+# CHECK-PDB:     Characteristics: 0x0<br>
+# CHECK-PDB:     TimeDateStamp: 1970-01-01 00:00:00 (0x0)<br>
+# CHECK-PDB:     MajorVersion: 0x0<br>
+# CHECK-PDB:     MinorVersion: 0x0<br>
+# CHECK-PDB:     Type: CodeView (0x2)<br>
+# CHECK-PDB:     SizeOfData:<br>
+# CHECK-PDB:     AddressOfRawData:<br>
+# CHECK-PDB:     PointerToRawData:<br>
+# CHECK-PDB:     PDBInfo {<br>
+# CHECK-PDB:       PDBSignature: 0x53445352<br>
+# CHECK-PDB:       PDBGUID:<br>
+# CHECK-PDB:       PDBAge: 1<br>
+# CHECK-PDB:       PDBFileName: {{.*}}.pdb<br>
+# CHECK-PDB:     }<br>
+# CHECK-PDB:   }<br>
+# CHECK-PDB: ]<br>
+<br>
+--- !COFF<br>
+header:<br>
+  Machine:         IMAGE_FILE_MACHINE_I386<br>
+  Characteristics: [  ]<br>
+sections:<br>
+  - Name:            .text<br>
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>
+    Alignment:       4<br>
+    SectionData:     31C0C3<br>
+  - Name:            .data<br>
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_<wbr>DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]<br>
+    Alignment:       4<br>
+    SectionData:     ''<br>
+  - Name:            .bss<br>
+    Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_<wbr>DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]<br>
+    Alignment:       4<br>
+    SectionData:     ''<br>
+symbols:<br>
+  - Name:            .text<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+    SectionDefinition:<br>
+      Length:          3<br>
+      NumberOfRelocations: 0<br>
+      NumberOfLinenumbers: 0<br>
+      CheckSum:        3963538403<br>
+      Number:          1<br>
+  - Name:            .data<br>
+    Value:           0<br>
+    SectionNumber:   2<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+    SectionDefinition:<br>
+      Length:          0<br>
+      NumberOfRelocations: 0<br>
+      NumberOfLinenumbers: 0<br>
+      CheckSum:        0<br>
+      Number:          2<br>
+  - Name:            .bss<br>
+    Value:           0<br>
+    SectionNumber:   3<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+    SectionDefinition:<br>
+      Length:          0<br>
+      NumberOfRelocations: 0<br>
+      NumberOfLinenumbers: 0<br>
+      CheckSum:        0<br>
+      Number:          3<br>
+  - Name:            '@feat.00'<br>
+    Value:           1<br>
+    SectionNumber:   -1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+  - Name:            _DllMain<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION<br>
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL<br>
+...<br>
<br>
Modified: lld/trunk/test/COFF/symtab.<wbr>test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/symtab.test?rev=280012&r1=280011&r2=280012&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/COFF/<wbr>symtab.test?rev=280012&r1=<wbr>280011&r2=280012&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/COFF/symtab.<wbr>test (original)<br>
+++ lld/trunk/test/COFF/symtab.<wbr>test Mon Aug 29 16:20:46 2016<br>
@@ -74,7 +74,7 @@<br>
 # CHECK-NEXT:   Symbol {<br>
 # CHECK-NEXT:     Name: __imp_ExitProcess<br>
 # CHECK-NEXT:     Value: 64<br>
-# CHECK-NEXT:     Section: .idata (4)<br>
+# CHECK-NEXT:     Section: .idata (5)<br>
 # CHECK-NEXT:     BaseType: Null (0x0)<br>
 # CHECK-NEXT:     ComplexType: Null (0x0)<br>
 # CHECK-NEXT:     StorageClass: External (0x2)<br>
@@ -92,7 +92,7 @@<br>
 # CHECK-NEXT:   Symbol {<br>
 # CHECK-NEXT:     Name: __imp_MessageBoxA<br>
 # CHECK-NEXT:     Value: 72<br>
-# CHECK-NEXT:     Section: .idata (4)<br>
+# CHECK-NEXT:     Section: .idata (5)<br>
 # CHECK-NEXT:     BaseType: Null (0x0)<br>
 # CHECK-NEXT:     ComplexType: Null (0x0)<br>
 # CHECK-NEXT:     StorageClass: External (0x2)<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>