Files
archived-llvm/lib/DebugInfo/PDB/Native/PublicsStreamBuilder.cpp
Zachary Turner c1422a59e8 [lld/pdb] Create an empty public symbol record stream.
This is part of the continuing effort to increase parity between
LLD and MSVC PDBs.  link still doesn't like our PDBs, so the most
obvious thing to check was whether adding an empty publics stream
would get it to do something else.  It still fails in the same way
but at least this removes one more variable from the equation.
The next logical step would be to try creating an empty globals
stream.

Differential Revision: https://reviews.llvm.org/D35224

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307598 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-10 22:40:20 +00:00

90 lines
2.6 KiB
C++

//===- DbiStreamBuilder.cpp - PDB Dbi Stream Creation -----------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/PDB/Native/PublicsStreamBuilder.h"
#include "llvm/DebugInfo/MSF/MSFBuilder.h"
#include "llvm/DebugInfo/MSF/MSFCommon.h"
#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
#include "GSI.h"
using namespace llvm;
using namespace llvm::msf;
using namespace llvm::pdb;
PublicsStreamBuilder::PublicsStreamBuilder(msf::MSFBuilder &Msf) : Msf(Msf) {}
PublicsStreamBuilder::~PublicsStreamBuilder() {}
uint32_t PublicsStreamBuilder::calculateSerializedLength() const {
uint32_t Size = 0;
Size += sizeof(PublicsStreamHeader);
Size += sizeof(GSIHashHeader);
Size += HashRecords.size() * sizeof(PSHashRecord);
size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32);
uint32_t NumBitmapEntries = BitmapSizeInBits / 8;
Size += NumBitmapEntries;
// FIXME: Account for hash buckets. For now since we we write a zero-bitmap
// indicating that no hash buckets are valid, we also write zero byets of hash
// bucket data.
Size += 0;
return Size;
}
Error PublicsStreamBuilder::finalizeMsfLayout() {
Expected<uint32_t> Idx = Msf.addStream(calculateSerializedLength());
if (!Idx)
return Idx.takeError();
StreamIdx = *Idx;
Expected<uint32_t> RecordIdx = Msf.addStream(0);
if (!RecordIdx)
return RecordIdx.takeError();
RecordStreamIdx = *RecordIdx;
return Error::success();
}
Error PublicsStreamBuilder::commit(BinaryStreamWriter &PublicsWriter) {
PublicsStreamHeader PSH;
GSIHashHeader GSH;
// FIXME: Figure out what to put for these values.
PSH.AddrMap = 0;
PSH.ISectThunkTable = 0;
PSH.NumSections = 0;
PSH.NumThunks = 0;
PSH.OffThunkTable = 0;
PSH.SizeOfThunk = 0;
PSH.SymHash = 0;
GSH.VerSignature = GSIHashHeader::HdrSignature;
GSH.VerHdr = GSIHashHeader::HdrVersion;
GSH.HrSize = 0;
GSH.NumBuckets = 0;
if (auto EC = PublicsWriter.writeObject(PSH))
return EC;
if (auto EC = PublicsWriter.writeObject(GSH))
return EC;
if (auto EC = PublicsWriter.writeArray(makeArrayRef(HashRecords)))
return EC;
size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32);
uint32_t NumBitmapEntries = BitmapSizeInBits / 8;
std::vector<uint8_t> BitmapData(NumBitmapEntries);
// FIXME: Build an actual bitmap
if (auto EC = PublicsWriter.writeBytes(makeArrayRef(BitmapData)))
return EC;
// FIXME: Write actual hash buckets.
return Error::success();
}