LLVM
8.0.1
|
#include "llvm/DebugInfo/MSF/MSFBuilder.h"
Public Member Functions | |
Error | setBlockMapAddr (uint32_t Addr) |
Request the block map to be at a specific block address. More... | |
Error | setDirectoryBlocksHint (ArrayRef< uint32_t > DirBlocks) |
void | setFreePageMap (uint32_t Fpm) |
void | setUnknown1 (uint32_t Unk1) |
Expected< uint32_t > | addStream (uint32_t Size, ArrayRef< uint32_t > Blocks) |
Add a stream to the MSF file with the given size, occupying the given list of blocks. More... | |
Expected< uint32_t > | addStream (uint32_t Size) |
Add a stream to the MSF file with the given size, occupying any available blocks that the builder decides to use. More... | |
Error | setStreamSize (uint32_t Idx, uint32_t Size) |
Update the size of an existing stream. More... | |
uint32_t | getNumStreams () const |
Get the total number of streams in the MSF layout. More... | |
uint32_t | getStreamSize (uint32_t StreamIdx) const |
Get the size of a stream by index. More... | |
ArrayRef< uint32_t > | getStreamBlocks (uint32_t StreamIdx) const |
Get the list of blocks allocated to a particular stream. More... | |
uint32_t | getNumUsedBlocks () const |
Get the total number of blocks that will be allocated to actual data in this MSF file. More... | |
uint32_t | getNumFreeBlocks () const |
Get the total number of blocks that exist in the MSF file but are not allocated to any valid data. More... | |
uint32_t | getTotalBlockCount () const |
Get the total number of blocks in the MSF file. More... | |
bool | isBlockFree (uint32_t Idx) const |
Check whether a particular block is allocated or free. More... | |
Expected< MSFLayout > | generateLayout () |
Finalize the layout and build the headers and structures that describe the MSF layout and can be written directly to the MSF file. More... | |
Expected< FileBufferByteStream > | commit (StringRef Path, MSFLayout &Layout) |
Write the MSF layout to the underlying file. More... | |
BumpPtrAllocator & | getAllocator () |
Static Public Member Functions | |
static Expected< MSFBuilder > | create (BumpPtrAllocator &Allocator, uint32_t BlockSize, uint32_t MinBlockCount=0, bool CanGrow=true) |
Create a new MSFBuilder . More... | |
Definition at line 27 of file MSFBuilder.h.
Add a stream to the MSF file with the given size, occupying the given list of blocks.
This is useful when reading a MSF file and you want a particular stream to occupy the original set of blocks. If the given blocks are already allocated, or if the number of blocks specified is incorrect for the given stream size, this function will return an Error.
Definition at line 155 of file MSFBuilder.cpp.
References llvm::msf::bytesToBlocks(), llvm::msf::invalid_format, llvm::BitVector::reset(), llvm::BitVector::resize(), llvm::ArrayRef< T >::size(), llvm::BitVector::size(), llvm::BitVector::test(), and llvm::msf::unspecified.
Referenced by llvm::pdb::GSIStreamBuilder::finalizeMsfLayout(), llvm::pdb::TpiStreamBuilder::finalizeMsfLayout(), llvm::pdb::DbiModuleDescriptorBuilder::finalizeMsfLayout(), and llvm::pdb::DbiStreamBuilder::finalizeMsfLayout().
Add a stream to the MSF file with the given size, occupying any available blocks that the builder decides to use.
This is useful when building a new PDB file from scratch and you don't care what blocks a stream occupies but you just want it to work.
Definition at line 182 of file MSFBuilder.cpp.
References llvm::msf::bytesToBlocks().
Expected< FileBufferByteStream > MSFBuilder::commit | ( | StringRef | Path, |
MSFLayout & | Layout | ||
) |
Write the MSF layout to the underlying file.
Definition at line 339 of file MSFBuilder.cpp.
References llvm::msf::SuperBlock::BlockMapAddr, llvm::msf::SuperBlock::BlockSize, llvm::msf::blockToOffset(), commitFpm(), llvm::FileOutputBuffer::create(), llvm::msf::WritableMappedBlockStream::createDirectoryStream(), llvm::msf::MSFLayout::DirectoryBlocks, generateLayout(), llvm::support::little, llvm::msf::SuperBlock::NumBlocks, llvm::msf::MSFLayout::SB, llvm::BinaryStreamWriter::setOffset(), llvm::msf::MSFLayout::StreamMap, llvm::msf::MSFLayout::StreamSizes, llvm::Expected< T >::takeError(), llvm::BinaryStreamWriter::writeArray(), llvm::BinaryStreamWriter::writeInteger(), and llvm::BinaryStreamWriter::writeObject().
|
static |
Create a new MSFBuilder
.
BlockSize | The internal block size used by the PDB file. See isValidBlockSize() for a list of valid block sizes. |
MinBlockCount | Causes the builder to reserve up front space for at least MinBlockCount blocks. This is useful when using MSFBuilder to read an existing MSF that you want to write back out later. The original MSF file's SuperBlock contains the exact number of blocks used by the file, so is a good hint as to how many blocks the new MSF file will contain. Furthermore, it is actually necessary in this case. To preserve stability of the file's layout, it is helpful to try to keep all streams mapped to their original block numbers. To ensure that this is possible, space for all blocks must be allocated beforehand so that streams can be assigned to them. |
CanGrow | If true, any operation which results in an attempt to locate a free block when all available blocks have been exhausted will allocate a new block, thereby growing the size of the final MSF file. When false, any such attempt will result in an error. This is especially useful in testing scenarios when you know your test isn't going to do anything to increase the size of the file, so having an Error returned if it were to happen would catch a programming error |
MinBlockCount
does not leave enough room for the mandatory reserved blocks required by an MSF file. Definition at line 50 of file MSFBuilder.cpp.
References llvm::msf::getMinimumBlockCount(), llvm::msf::invalid_format, llvm::msf::isValidBlockSize(), and llvm::max().
Finalize the layout and build the headers and structures that describe the MSF layout and can be written directly to the MSF file.
Definition at line 251 of file MSFBuilder.cpp.
References llvm::BumpPtrAllocatorImpl< AllocatorT, SlabSize, SizeThreshold >::Allocate(), B, llvm::msf::SuperBlock::BlockMapAddr, llvm::msf::SuperBlock::BlockSize, llvm::msf::bytesToBlocks(), llvm::msf::SuperBlock::FreeBlockMapBlock, I, llvm::msf::Magic, llvm::msf::SuperBlock::MagicBytes, llvm::Intrinsic::memcpy, llvm::msf::SuperBlock::NumBlocks, llvm::msf::SuperBlock::NumDirectoryBytes, llvm::msf::MSFLayout::SB, second, llvm::BitVector::size(), and llvm::msf::SuperBlock::Unknown1.
Referenced by commit().
|
inline |
Definition at line 119 of file MSFBuilder.h.
Referenced by llvm::pdb::GSIHashStreamBuilder::addSymbol(), llvm::pdb::GSIStreamBuilder::commit(), llvm::pdb::InfoStreamBuilder::commit(), and llvm::pdb::DbiModuleDescriptorBuilder::commit().
uint32_t MSFBuilder::getNumFreeBlocks | ( | ) | const |
Get the total number of blocks that exist in the MSF file but are not allocated to any valid data.
Definition at line 149 of file MSFBuilder.cpp.
References llvm::BitVector::count().
Referenced by getNumUsedBlocks().
uint32_t MSFBuilder::getNumStreams | ( | ) | const |
Get the total number of streams in the MSF layout.
This should return 1 for every call to addStream
.
Definition at line 225 of file MSFBuilder.cpp.
uint32_t MSFBuilder::getNumUsedBlocks | ( | ) | const |
Get the total number of blocks that will be allocated to actual data in this MSF file.
Definition at line 145 of file MSFBuilder.cpp.
References getNumFreeBlocks(), and getTotalBlockCount().
Get the list of blocks allocated to a particular stream.
Definition at line 231 of file MSFBuilder.cpp.
References assert(), llvm::msf::bytesToBlocks(), D, and Size.
Get the size of a stream by index.
Definition at line 227 of file MSFBuilder.cpp.
Referenced by setStreamSize().
uint32_t MSFBuilder::getTotalBlockCount | ( | ) | const |
Get the total number of blocks in the MSF file.
In practice this is equal to getNumUsedBlocks() + getNumFreeBlocks()
.
Definition at line 151 of file MSFBuilder.cpp.
References llvm::BitVector::size().
Referenced by getNumUsedBlocks().
Check whether a particular block is allocated or free.
Definition at line 153 of file MSFBuilder.cpp.
Referenced by setBlockMapAddr(), and setDirectoryBlocksHint().
Request the block map to be at a specific block address.
This is useful when editing a MSF and you want the layout to be as stable as possible.
Definition at line 62 of file MSFBuilder.cpp.
References llvm::msf::block_in_use, llvm::msf::insufficient_buffer, isBlockFree(), llvm::BitVector::resize(), llvm::BitVector::size(), and llvm::Error::success().
Definition at line 87 of file MSFBuilder.cpp.
References llvm::alignTo(), assert(), B, llvm::BitVector::count(), llvm::BitVector::find_first(), llvm::BitVector::find_next(), I, llvm::msf::insufficient_buffer, isBlockFree(), llvm::BitVector::reset(), llvm::BitVector::resize(), llvm::BitVector::size(), llvm::Error::success(), and llvm::msf::unspecified.
void MSFBuilder::setFreePageMap | ( | uint32_t | Fpm | ) |
Definition at line 83 of file MSFBuilder.cpp.
Update the size of an existing stream.
This will allocate or deallocate blocks as needed to match the requested size. This can fail if CanGrow
was set to false when initializing the MSFBuilder
.
Definition at line 192 of file MSFBuilder.cpp.
References llvm::msf::bytesToBlocks(), llvm::ArrayRef< T >::drop_front(), getStreamSize(), P, Size, and llvm::Error::success().
Referenced by llvm::pdb::InfoStreamBuilder::finalizeMsfLayout(), llvm::pdb::TpiStreamBuilder::finalizeMsfLayout(), and llvm::pdb::DbiStreamBuilder::finalizeMsfLayout().
void MSFBuilder::setUnknown1 | ( | uint32_t | Unk1 | ) |
Definition at line 85 of file MSFBuilder.cpp.