<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">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><div>^ had me wondering for a second there (PDF files? from the compiler?)</div><div>Â </div><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><div>Could we fix the dumper so we can test this please?</div><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">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><br></div></div>