1 //===- TpiStream.cpp - PDB Type Info (TPI) Stream 2 Access ------*- C++ -*-===// 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 #ifndef LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAM_H 10 #define LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAM_H 11 12 #include "llvm/DebugInfo/CodeView/CVRecord.h" 13 #include "llvm/DebugInfo/PDB/Native/HashTable.h" 14 #include "llvm/DebugInfo/PDB/Native/RawConstants.h" 15 #include "llvm/Support/BinaryStreamArray.h" 16 #include "llvm/Support/BinaryStreamRef.h" 17 18 #include "llvm/Support/Error.h" 19 20 namespace llvm { 21 class BinaryStream; 22 namespace codeview { 23 class TypeIndex; 24 struct TypeIndexOffset; 25 class LazyRandomTypeCollection; 26 } 27 namespace msf { 28 class MappedBlockStream; 29 } 30 namespace pdb { 31 struct TpiStreamHeader; 32 class PDBFile; 33 34 class TpiStream { 35 friend class TpiStreamBuilder; 36 37 public: 38 TpiStream(PDBFile &File, std::unique_ptr<msf::MappedBlockStream> Stream); 39 ~TpiStream(); 40 Error reload(); 41 42 PdbRaw_TpiVer getTpiVersion() const; 43 44 uint32_t TypeIndexBegin() const; 45 uint32_t TypeIndexEnd() const; 46 uint32_t getNumTypeRecords() const; 47 uint16_t getTypeHashStreamIndex() const; 48 uint16_t getTypeHashStreamAuxIndex() const; 49 50 uint32_t getHashKeySize() const; 51 uint32_t getNumHashBuckets() const; 52 FixedStreamArray<support::ulittle32_t> getHashValues() const; 53 FixedStreamArray<codeview::TypeIndexOffset> getTypeIndexOffsets() const; 54 HashTable<support::ulittle32_t> &getHashAdjusters(); 55 56 codeview::CVTypeRange types(bool *HadError) const; typeArray()57 const codeview::CVTypeArray &typeArray() const { return TypeRecords; } 58 typeCollection()59 codeview::LazyRandomTypeCollection &typeCollection() { return *Types; } 60 61 Expected<codeview::TypeIndex> 62 findFullDeclForForwardRef(codeview::TypeIndex ForwardRefTI) const; 63 64 std::vector<codeview::TypeIndex> findRecordsByName(StringRef Name) const; 65 66 codeview::CVType getType(codeview::TypeIndex Index); 67 68 BinarySubstreamRef getTypeRecordsSubstream() const; 69 70 Error commit(); 71 72 void buildHashMap(); 73 74 bool supportsTypeLookup() const; 75 76 private: 77 PDBFile &Pdb; 78 std::unique_ptr<msf::MappedBlockStream> Stream; 79 80 std::unique_ptr<codeview::LazyRandomTypeCollection> Types; 81 82 BinarySubstreamRef TypeRecordsSubstream; 83 84 codeview::CVTypeArray TypeRecords; 85 86 std::unique_ptr<BinaryStream> HashStream; 87 FixedStreamArray<support::ulittle32_t> HashValues; 88 FixedStreamArray<codeview::TypeIndexOffset> TypeIndexOffsets; 89 HashTable<support::ulittle32_t> HashAdjusters; 90 91 std::vector<std::vector<codeview::TypeIndex>> HashMap; 92 93 const TpiStreamHeader *Header; 94 }; 95 } 96 } 97 98 #endif 99