[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