33 using namespace llvm::codeview;
34 using namespace llvm::msf;
35 using namespace llvm::pdb;
41 PDBFile::PDBFile(std::unique_ptr<ReadableStream> PdbFileBuffer,
43 : Allocator(Allocator), Buffer(std::move(PdbFileBuffer)) {}
87 return ContainerLayout.
StreamMap[StreamIndex];
97 if (
auto EC = Buffer->readBytes(StreamBlockOffset, NumBytes, Result))
105 "PDBFile is immutable");
116 "Does not contain superblock");
122 if (Buffer->getLength() % SB->
BlockSize != 0)
124 "File size is not a multiple of block size");
125 ContainerLayout.
SB =
SB;
142 auto FpmStream = MappedBlockStream::createFpmStream(ContainerLayout, *Buffer);
150 for (
auto Byte : FpmBytes) {
180 auto DS = MappedBlockStream::createDirectoryStream(ContainerLayout, *Buffer);
190 uint64_t NumExpectedStreamBlocks =
191 StreamSize == UINT32_MAX
202 if (
auto EC = Reader.
readArray(Blocks, NumExpectedStreamBlocks))
205 uint64_t BlockEndOffset =
209 "Stream block map is corrupt.");
211 ContainerLayout.
StreamMap.push_back(Blocks);
216 DirectoryStream = std::move(DS);
228 return DbiS.takeError();
230 auto GlobalS = safelyCreateIndexedStream(
231 ContainerLayout, *Buffer, DbiS->getGlobalSymbolStreamIndex());
232 if (!GlobalS)
return GlobalS.takeError();
233 auto TempGlobals = llvm::make_unique<GlobalsStream>(std::move(*GlobalS));
234 if (
auto EC = TempGlobals->reload())
235 return std::move(
EC);
236 Globals = std::move(TempGlobals);
243 auto InfoS = safelyCreateIndexedStream(ContainerLayout, *Buffer,
StreamPDB);
244 if (!InfoS)
return InfoS.takeError();
245 auto TempInfo = llvm::make_unique<InfoStream>(std::move(*InfoS));
246 if (
auto EC = TempInfo->reload())
247 return std::move(
EC);
248 Info = std::move(TempInfo);
255 auto DbiS = safelyCreateIndexedStream(ContainerLayout, *Buffer,
StreamDBI);
256 if (!DbiS)
return DbiS.takeError();
257 auto TempDbi = llvm::make_unique<DbiStream>(*
this, std::move(*DbiS));
258 if (
auto EC = TempDbi->reload())
259 return std::move(
EC);
260 Dbi = std::move(TempDbi);
267 auto TpiS = safelyCreateIndexedStream(ContainerLayout, *Buffer,
StreamTPI);
268 if (!TpiS)
return TpiS.takeError();
269 auto TempTpi = llvm::make_unique<TpiStream>(*
this, std::move(*TpiS));
270 if (
auto EC = TempTpi->reload())
271 return std::move(
EC);
272 Tpi = std::move(TempTpi);
279 auto IpiS = safelyCreateIndexedStream(ContainerLayout, *Buffer,
StreamIPI);
280 if (!IpiS)
return IpiS.takeError();
281 auto TempIpi = llvm::make_unique<TpiStream>(*
this, std::move(*IpiS));
282 if (
auto EC = TempIpi->reload())
283 return std::move(
EC);
284 Ipi = std::move(TempIpi);
293 return DbiS.takeError();
295 auto PublicS = safelyCreateIndexedStream(
296 ContainerLayout, *Buffer, DbiS->getPublicSymbolStreamIndex());
297 if (!PublicS)
return PublicS.takeError();
299 llvm::make_unique<PublicsStream>(*
this, std::move(*PublicS));
300 if (
auto EC = TempPublics->reload())
301 return std::move(
EC);
302 Publics = std::move(TempPublics);
311 return DbiS.takeError();
313 uint32_t SymbolStreamNum = DbiS->getSymRecordStreamIndex();
315 safelyCreateIndexedStream(ContainerLayout, *Buffer, SymbolStreamNum);
316 if (!SymbolS)
return SymbolS.takeError();
318 auto TempSymbols = llvm::make_unique<SymbolStream>(std::move(*SymbolS));
319 if (
auto EC = TempSymbols->reload())
320 return std::move(
EC);
321 Symbols = std::move(TempSymbols);
327 if (!StringTable || !StringTableStream) {
330 return IS.takeError();
332 uint32_t NameStreamIndex = IS->getNamedStreamIndex(
"/names");
335 safelyCreateIndexedStream(ContainerLayout, *Buffer, NameStreamIndex);
336 if (!NS)
return NS.takeError();
339 auto N = llvm::make_unique<NameHashTable>();
340 if (
auto EC =
N->load(Reader))
341 return std::move(
EC);
342 StringTable = std::move(
N);
343 StringTableStream = std::move(*NS);
352 if (!DbiS)
return false;
362 if (!DbiS)
return false;
368 if (!DbiS)
return false;
376 if (!IS)
return false;
390 return MappedBlockStream::createIndexedStream(Layout, MsfData, StreamIndex);
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
uint32_t getNumDirectoryBytes() const
bool hasPDBSymbolStream()
Error validateSuperBlock(const SuperBlock &SB)
uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize)
ArrayRef< support::ulittle32_t > getDirectoryBlockArray() const
Expected< GlobalsStream & > getPDBGlobalsStream()
void setOffset(uint32_t Off)
bool hasPDBPublicsStream()
uint32_t getBlockMapIndex() const
Expected< TpiStream & > getPDBTpiStream()
uint32_t getFileSize() const
uint32_t getNumStreams() const override
Error setBlockData(uint32_t BlockIndex, uint32_t Offset, ArrayRef< uint8_t > Data) const override
uint64_t getBlockMapOffset() const
uint32_t getStreamByteSize(uint32_t StreamIndex) const override
uint32_t getBlockSize() const override
Tagged union holding either a T or a Error.
bool hasPDBDbiStream() const
support::ulittle32_t BlockSize
bool hasPDBIpiStream() const
Expected< NameHashTable & > getStringTable()
size_t size() const
size - Get the array size.
Maximum length of the test input libFuzzer tries to guess a good value based on the corpus and reports it always prefer smaller inputs during the corpus shuffle When libFuzzer itself reports a bug this exit code will be used If indicates the maximal total time in seconds to run the fuzzer minimizes the provided crash input Use with etc Experimental Use value profile to guide fuzzing Number of simultaneous worker processes to run the jobs If min(jobs, NumberOfCpuCores()/2)\" is used.") FUZZER_FLAG_INT(reload
support::ulittle32_t BlockMapAddr
INITIALIZE_PASS(HexagonEarlyIfConversion,"hexagon-eif","Hexagon early if conversion", false, false) bool HexagonEarlyIfConversion MachineBasicBlock * SB
Error readBytes(ArrayRef< uint8_t > &Buffer, uint32_t Size)
Allocate memory in an ever growing pool, as if by bump-pointer.
Expected< SymbolStream & > getPDBSymbolStream()
Error readInteger(uint8_t &Dest)
Error readArray(ArrayRef< T > &Array, uint32_t NumElements)
Expected< TpiStream & > getPDBIpiStream()
Greedy Register Allocator
void consumeError(Error Err)
Consume a Error without doing anything.
Expected< DbiStream & > getPDBDbiStream()
support::ulittle32_t Unknown1
uint32_t getNumDirectoryBlocks() const
static ErrorSuccess success()
Create a success value.
ArrayRef< support::ulittle32_t > DirectoryBlocks
uint32_t getUnknown1() const
uint32_t getFreeBlockMapBlock() const
Expected< PublicsStream & > getPDBPublicsStream()
bool hasPDBTpiStream() const
uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize)
std::vector< ArrayRef< support::ulittle32_t > > StreamMap
bool hasPDBGlobalsStream()
Expected< ArrayRef< uint8_t > > getBlockData(uint32_t BlockIndex, uint32_t NumBytes) const override
uint32_t getFullFpmByteSize(const MSFLayout &L)
uint32_t bytesRemaining() const
ArrayRef< support::ulittle32_t > StreamSizes
Expected< InfoStream & > getPDBInfoStream()
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
support::ulittle32_t FreeBlockMapBlock
Lightweight error class with error context and mandatory checking.
ArrayRef< support::ulittle32_t > getStreamBlockList(uint32_t StreamIndex) const override
uint32_t getBlockCount() const override
support::ulittle32_t NumDirectoryBytes
support::ulittle32_t NumBlocks
Error readObject(const T *&Dest)