1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- GlobalsStream.h - PDB Index of Symbols by Name -----------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_DEBUGINFO_PDB_NATIVE_GLOBALSSTREAM_H
- #define LLVM_DEBUGINFO_PDB_NATIVE_GLOBALSSTREAM_H
- #include "llvm/ADT/iterator.h"
- #include "llvm/DebugInfo/CodeView/CVRecord.h"
- #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
- #include "llvm/Support/BinaryStreamArray.h"
- #include "llvm/Support/Endian.h"
- #include "llvm/Support/Error.h"
- namespace llvm {
- class BinaryStreamReader;
- namespace msf {
- class MappedBlockStream;
- }
- namespace pdb {
- class SymbolStream;
- /// Iterator over hash records producing symbol record offsets. Abstracts away
- /// the fact that symbol record offsets on disk are off-by-one.
- class GSIHashIterator
- : public iterator_adaptor_base<
- GSIHashIterator, FixedStreamArrayIterator<PSHashRecord>,
- std::random_access_iterator_tag, const uint32_t> {
- public:
- template <typename T>
- GSIHashIterator(T &&v)
- : GSIHashIterator::iterator_adaptor_base(std::forward<T &&>(v)) {}
- uint32_t operator*() const {
- uint32_t Off = this->I->Off;
- return --Off;
- }
- };
- /// From https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.cpp
- enum : unsigned { IPHR_HASH = 4096 };
- /// A readonly view of a hash table used in the globals and publics streams.
- /// Most clients will only want to iterate this to get symbol record offsets
- /// into the PDB symbol stream.
- class GSIHashTable {
- public:
- const GSIHashHeader *HashHdr;
- FixedStreamArray<PSHashRecord> HashRecords;
- FixedStreamArray<support::ulittle32_t> HashBitmap;
- FixedStreamArray<support::ulittle32_t> HashBuckets;
- std::array<int32_t, IPHR_HASH + 1> BucketMap;
- Error read(BinaryStreamReader &Reader);
- uint32_t getVerSignature() const { return HashHdr->VerSignature; }
- uint32_t getVerHeader() const { return HashHdr->VerHdr; }
- uint32_t getHashRecordSize() const { return HashHdr->HrSize; }
- uint32_t getNumBuckets() const { return HashHdr->NumBuckets; }
- typedef GSIHashHeader iterator;
- GSIHashIterator begin() const { return GSIHashIterator(HashRecords.begin()); }
- GSIHashIterator end() const { return GSIHashIterator(HashRecords.end()); }
- };
- class GlobalsStream {
- public:
- explicit GlobalsStream(std::unique_ptr<msf::MappedBlockStream> Stream);
- ~GlobalsStream();
- const GSIHashTable &getGlobalsTable() const { return GlobalsTable; }
- Error reload();
- std::vector<std::pair<uint32_t, codeview::CVSymbol>>
- findRecordsByName(StringRef Name, const SymbolStream &Symbols) const;
- private:
- GSIHashTable GlobalsTable;
- std::unique_ptr<msf::MappedBlockStream> Stream;
- };
- } // namespace pdb
- }
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|