[lld] r255039 - COFF: Create an empty but valid PDF file.

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 8 11:00:41 PST 2015


On Tue, Dec 8, 2015 at 10:39 AM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: ruiu
> Date: Tue Dec  8 12:39:55 2015
> New Revision: 255039
>
> URL: http://llvm.org/viewvc/llvm-project?rev=255039&view=rev
> Log:
> COFF: Create an empty but valid PDF file.
>

^ had me wondering for a second there (PDF files? from the compiler?)


>
> MSVC linker considers PDB files created with this patch valid.
> So you don't have to remove PDB files created by lld before
> running MSVC linker.
>
> This patch has no test since llvm-pdbdump dislikes PDB files
> with no metadata streams.
>

Could we fix the dumper so we can test this please?


>
> Modified:
>     lld/trunk/COFF/PDB.cpp
>
> Modified: lld/trunk/COFF/PDB.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=255039&r1=255038&r2=255039&view=diff
>
> ==============================================================================
> --- lld/trunk/COFF/PDB.cpp (original)
> +++ lld/trunk/COFF/PDB.cpp Tue Dec  8 12:39:55 2015
> @@ -10,23 +10,51 @@
>  #include "Driver.h"
>  #include "Error.h"
>  #include "Symbols.h"
> +#include "llvm/Support/Endian.h"
>  #include "llvm/Support/FileOutputBuffer.h"
>  #include <memory>
>
>  using namespace llvm;
> +using namespace llvm::support;
> +using namespace llvm::support::endian;
>
>  const int PageSize = 4096;
>  const uint8_t Magic[32] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0";
>
> +namespace {
> +struct PDBHeader {
> +  uint8_t Magic[32];
> +  ulittle32_t PageSize;
> +  ulittle32_t FpmPage;
> +  ulittle32_t PageCount;
> +  ulittle32_t RootSize;
> +  ulittle32_t Reserved;
> +  ulittle32_t RootPointer;
> +};
> +}
> +
>  void lld::coff::createPDB(StringRef Path) {
>    // Create a file.
>    size_t FileSize = PageSize * 3;
> -  ErrorOr<std::unique_ptr<FileOutputBuffer>> BufOrErr =
> +  ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
>        FileOutputBuffer::create(Path, FileSize);
> -  error(BufOrErr, Twine("failed to open ") + Path);
> -  std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufOrErr);
> +  error(BufferOrErr, Twine("failed to open ") + Path);
> +  std::unique_ptr<FileOutputBuffer> Buffer = std::move(*BufferOrErr);
> +
> +  // Write the file header.
> +  uint8_t *Buf = Buffer->getBufferStart();
> +  auto *Hdr = reinterpret_cast<PDBHeader *>(Buf);
> +  memcpy(Hdr->Magic, Magic, sizeof(Magic));
> +  Hdr->PageSize = PageSize;
> +  // I don't know what FpmPage field means, but it must not be 0.
> +  Hdr->FpmPage = 1;
> +  Hdr->PageCount = FileSize / PageSize;
> +  // Root directory is empty, containing only the length field.
> +  Hdr->RootSize = 4;
> +  // Root directory is on page 1.
> +  Hdr->RootPointer = 1;
>
> -  // Write the file magic.
> -  uint8_t *P = Buf->getBufferStart();
> -  memcpy(P, Magic, sizeof(Magic));
> +  // Write the root directory. Root stream is on page 2.
> +  write32le(Buf + PageSize, 2);
> +  Buffer->commit();
>  }
>
>
> _______________________________________________
> 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/20151208/95ec54b8/attachment.html>


More information about the llvm-commits mailing list