LLVM  16.0.0git
PublicsStream.cpp
Go to the documentation of this file.
1 //===- PublicsStream.cpp - PDB Public Symbol Stream -----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // The data structures defined in this file are based on the reference
10 // implementation which is available at
11 // https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h
12 //
13 // When you are reading the reference source code, you'd find the
14 // information below useful.
15 //
16 // - ppdb1->m_fMinimalDbgInfo seems to be always true.
17 // - SMALLBUCKETS macro is defined.
18 //
19 // The reference doesn't compile, so I learned just by reading code.
20 // It's not guaranteed to be correct.
21 //
22 //===----------------------------------------------------------------------===//
23 
29 #include "llvm/Support/Endian.h"
30 #include "llvm/Support/Error.h"
31 #include <cstdint>
32 
33 using namespace llvm;
34 using namespace llvm::msf;
35 using namespace llvm::support;
36 using namespace llvm::pdb;
37 
38 PublicsStream::PublicsStream(std::unique_ptr<MappedBlockStream> Stream)
39  : Stream(std::move(Stream)) {}
40 
42 
43 uint32_t PublicsStream::getSymHash() const { return Header->SymHash; }
45  return Header->ISectThunkTable;
46 }
48  return Header->OffThunkTable;
49 }
50 
51 // Publics stream contains fixed-size headers and a serialized hash table.
52 // This implementation is not complete yet. It reads till the end of the
53 // stream so that we verify the stream is at least not corrupted. However,
54 // we skip over the hash table which we believe contains information about
55 // public symbols.
57  BinaryStreamReader Reader(*Stream);
58 
59  // Check stream size.
60  if (Reader.bytesRemaining() <
61  sizeof(PublicsStreamHeader) + sizeof(GSIHashHeader))
62  return make_error<RawError>(raw_error_code::corrupt_file,
63  "Publics Stream does not contain a header.");
64 
65  // Read PSGSIHDR struct.
66  if (Reader.readObject(Header))
67  return make_error<RawError>(raw_error_code::corrupt_file,
68  "Publics Stream does not contain a header.");
69 
70  // Read the hash table.
71  if (auto E = PublicsTable.read(Reader))
72  return E;
73 
74  // Something called "address map" follows.
75  uint32_t NumAddressMapEntries = Header->AddrMap / sizeof(uint32_t);
76  if (auto EC = Reader.readArray(AddressMap, NumAddressMapEntries))
77  return joinErrors(std::move(EC),
78  make_error<RawError>(raw_error_code::corrupt_file,
79  "Could not read an address map."));
80 
81  // Something called "thunk map" follows.
82  if (auto EC = Reader.readArray(ThunkMap, Header->NumThunks))
83  return joinErrors(std::move(EC),
84  make_error<RawError>(raw_error_code::corrupt_file,
85  "Could not read a thunk map."));
86 
87  // Something called "section map" follows.
88  if (Reader.bytesRemaining() > 0) {
89  if (auto EC = Reader.readArray(SectionOffsets, Header->NumSections))
90  return joinErrors(std::move(EC),
91  make_error<RawError>(raw_error_code::corrupt_file,
92  "Could not read a section map."));
93  }
94 
95  if (Reader.bytesRemaining() > 0)
96  return make_error<RawError>(raw_error_code::corrupt_file,
97  "Corrupted publics stream.");
98  return Error::success();
99 }
BinaryStreamReader.h
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
PublicsStream.h
llvm::pdb::PublicsStreamHeader::AddrMap
support::ulittle32_t AddrMap
Definition: RawTypes.h:266
RawTypes.h
llvm::pdb::PublicsStreamHeader::ISectThunkTable
support::ulittle16_t ISectThunkTable
Definition: RawTypes.h:269
llvm::Error::success
static ErrorSuccess success()
Create a success value.
Definition: Error.h:329
llvm::pdb::PublicsStream::reload
Error reload()
Definition: PublicsStream.cpp:56
Error.h
llvm::BinaryStreamReader::bytesRemaining
uint64_t bytesRemaining() const
Definition: BinaryStreamReader.h:250
RawError.h
llvm::msf
Definition: IMSFFile.h:18
llvm::pdb::GSIHashHeader
Header of the hash tables found in the globals and publics sections.
Definition: RawTypes.h:28
llvm::pdb::PublicsStream::getThunkTableSection
uint16_t getThunkTableSection() const
Definition: PublicsStream.cpp:44
llvm::pdb::raw_error_code::corrupt_file
@ corrupt_file
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
llvm::pdb
Definition: ConcreteSymbolEnumerator.h:20
llvm::BinaryStreamReader
Provides read only access to a subclass of BinaryStream.
Definition: BinaryStreamReader.h:29
llvm::pdb::PublicsStreamHeader::OffThunkTable
support::ulittle32_t OffThunkTable
Definition: RawTypes.h:271
llvm::pdb::PublicsStreamHeader::SymHash
support::ulittle32_t SymHash
Definition: RawTypes.h:265
move
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
Definition: README.txt:546
llvm::joinErrors
Error joinErrors(Error E1, Error E2)
Concatenate errors.
Definition: Error.h:426
MappedBlockStream.h
llvm::move
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1666
llvm::BinaryStreamReader::readObject
Error readObject(const T *&Dest)
Get a pointer to an object of type T from the underlying stream, as if by memcpy, and store the resul...
Definition: BinaryStreamReader.h:162
uint32_t
std
Definition: BitVector.h:851
uint16_t
llvm::pdb::PublicsStream::getThunkTableOffset
uint32_t getThunkTableOffset() const
Definition: PublicsStream.cpp:47
llvm::Error
Lightweight error class with error context and mandatory checking.
Definition: Error.h:155
llvm::support
Definition: Endian.h:25
llvm::pdb::PublicsStream::~PublicsStream
~PublicsStream()
llvm::pdb::PublicsStreamHeader::NumSections
support::ulittle32_t NumSections
Definition: RawTypes.h:272
llvm::pdb::PublicsStreamHeader::NumThunks
support::ulittle32_t NumThunks
Definition: RawTypes.h:267
llvm::pdb::PublicsStreamHeader
Definition: RawTypes.h:264
Endian.h
llvm::BinaryStreamReader::readArray
Error readArray(ArrayRef< T > &Array, uint32_t NumElements)
Get a reference to a NumElements element array of objects of type T from the underlying stream as if ...
Definition: BinaryStreamReader.h:180
llvm::pdb::GSIHashTable::read
Error read(BinaryStreamReader &Reader)
Definition: GlobalsStream.cpp:170
llvm::pdb::PublicsStream::getSymHash
uint32_t getSymHash() const
Definition: PublicsStream.cpp:43