<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Dec 8, 2015 at 11:00 AM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Tue, Dec 8, 2015 at 10:39 AM, Rui Ueyama 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: ruiu<br>
Date: Tue Dec  8 12:39:55 2015<br>
New Revision: 255039<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=255039&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=255039&view=rev</a><br>
Log:<br>
COFF: Create an empty but valid PDF file.<br></blockquote><div><br></div></span><div>^ had me wondering for a second there (PDF files? from the compiler?)</div></div></div></div></blockquote><div><br></div><div>Sorry I didn't notice until now. :|</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div> </div><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
MSVC linker considers PDB files created with this patch valid.<br>
So you don't have to remove PDB files created by lld before<br>
running MSVC linker.<br>
<br>
This patch has no test since llvm-pdbdump dislikes PDB files<br>
with no metadata streams.<br></blockquote><div><br></div></span><div>Could we fix the dumper so we can test this please?</div></div></div></div></blockquote><div><br></div><div>I'm going to add metadata in the next patch so that it can be dumped using llvm-pdbdump. There's no official spec of the PDB file, and a PDB file without metadata is very artificial, I cannot say that that's a bug of llvm-pdbdump even if it cannot dump such file.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Modified:<br>
    lld/trunk/COFF/PDB.cpp<br>
<br>
Modified: lld/trunk/COFF/PDB.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=255039&r1=255038&r2=255039&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=255039&r1=255038&r2=255039&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/PDB.cpp (original)<br>
+++ lld/trunk/COFF/PDB.cpp Tue Dec  8 12:39:55 2015<br>
@@ -10,23 +10,51 @@<br>
 #include "Driver.h"<br>
 #include "Error.h"<br>
 #include "Symbols.h"<br>
+#include "llvm/Support/Endian.h"<br>
 #include "llvm/Support/FileOutputBuffer.h"<br>
 #include <memory><br>
<br>
 using namespace llvm;<br>
+using namespace llvm::support;<br>
+using namespace llvm::support::endian;<br>
<br>
 const int PageSize = 4096;<br>
 const uint8_t Magic[32] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0";<br>
<br>
+namespace {<br>
+struct PDBHeader {<br>
+  uint8_t Magic[32];<br>
+  ulittle32_t PageSize;<br>
+  ulittle32_t FpmPage;<br>
+  ulittle32_t PageCount;<br>
+  ulittle32_t RootSize;<br>
+  ulittle32_t Reserved;<br>
+  ulittle32_t RootPointer;<br>
+};<br>
+}<br>
+<br>
 void lld::coff::createPDB(StringRef Path) {<br>
   // Create a file.<br>
   size_t FileSize = PageSize * 3;<br>
-  ErrorOr<std::unique_ptr<FileOutputBuffer>> BufOrErr =<br>
+  ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =<br>
       FileOutputBuffer::create(Path, FileSize);<br>
-  error(BufOrErr, Twine("failed to open ") + Path);<br>
-  std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufOrErr);<br>
+  error(BufferOrErr, Twine("failed to open ") + Path);<br>
+  std::unique_ptr<FileOutputBuffer> Buffer = std::move(*BufferOrErr);<br>
+<br>
+  // Write the file header.<br>
+  uint8_t *Buf = Buffer->getBufferStart();<br>
+  auto *Hdr = reinterpret_cast<PDBHeader *>(Buf);<br>
+  memcpy(Hdr->Magic, Magic, sizeof(Magic));<br>
+  Hdr->PageSize = PageSize;<br>
+  // I don't know what FpmPage field means, but it must not be 0.<br>
+  Hdr->FpmPage = 1;<br>
+  Hdr->PageCount = FileSize / PageSize;<br>
+  // Root directory is empty, containing only the length field.<br>
+  Hdr->RootSize = 4;<br>
+  // Root directory is on page 1.<br>
+  Hdr->RootPointer = 1;<br>
<br>
-  // Write the file magic.<br>
-  uint8_t *P = Buf->getBufferStart();<br>
-  memcpy(P, Magic, sizeof(Magic));<br>
+  // Write the root directory. Root stream is on page 2.<br>
+  write32le(Buf + PageSize, 2);<br>
+  Buffer->commit();<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>