1317017Sdim//===- TpiStream.cpp - PDB Type Info (TPI) Stream 2 Access ------*- C++ -*-===// 2317017Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317017Sdim// 7317017Sdim//===----------------------------------------------------------------------===// 8317017Sdim 9317017Sdim#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H 10317017Sdim#define LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H 11317017Sdim 12317017Sdim#include "llvm/DebugInfo/CodeView/TypeRecord.h" 13317017Sdim#include "llvm/DebugInfo/PDB/Native/HashTable.h" 14317017Sdim#include "llvm/DebugInfo/PDB/Native/RawConstants.h" 15317017Sdim#include "llvm/DebugInfo/PDB/Native/RawTypes.h" 16317017Sdim#include "llvm/DebugInfo/PDB/PDBTypes.h" 17317017Sdim#include "llvm/Support/BinaryStreamArray.h" 18320397Sdim#include "llvm/Support/BinaryStreamRef.h" 19317017Sdim#include "llvm/Support/raw_ostream.h" 20317017Sdim 21317017Sdim#include "llvm/Support/Error.h" 22317017Sdim 23317017Sdimnamespace llvm { 24319164Sdimnamespace codeview { 25319164Sdimclass LazyRandomTypeCollection; 26319164Sdim} 27317017Sdimnamespace msf { 28317017Sdimclass MappedBlockStream; 29317017Sdim} 30317017Sdimnamespace pdb { 31317017Sdimclass PDBFile; 32317017Sdim 33317017Sdimclass TpiStream { 34317017Sdim friend class TpiStreamBuilder; 35317017Sdim 36317017Sdimpublic: 37319547Sdim TpiStream(PDBFile &File, std::unique_ptr<msf::MappedBlockStream> Stream); 38317017Sdim ~TpiStream(); 39317017Sdim Error reload(); 40317017Sdim 41317017Sdim PdbRaw_TpiVer getTpiVersion() const; 42317017Sdim 43317017Sdim uint32_t TypeIndexBegin() const; 44317017Sdim uint32_t TypeIndexEnd() const; 45317969Sdim uint32_t getNumTypeRecords() const; 46317017Sdim uint16_t getTypeHashStreamIndex() const; 47317017Sdim uint16_t getTypeHashStreamAuxIndex() const; 48317017Sdim 49317017Sdim uint32_t getHashKeySize() const; 50317969Sdim uint32_t getNumHashBuckets() const; 51317017Sdim FixedStreamArray<support::ulittle32_t> getHashValues() const; 52318384Sdim FixedStreamArray<codeview::TypeIndexOffset> getTypeIndexOffsets() const; 53341825Sdim HashTable<support::ulittle32_t> &getHashAdjusters(); 54317017Sdim 55317017Sdim codeview::CVTypeRange types(bool *HadError) const; 56318477Sdim const codeview::CVTypeArray &typeArray() const { return TypeRecords; } 57317017Sdim 58319164Sdim codeview::LazyRandomTypeCollection &typeCollection() { return *Types; } 59319164Sdim 60344779Sdim Expected<codeview::TypeIndex> 61344779Sdim findFullDeclForForwardRef(codeview::TypeIndex ForwardRefTI) const; 62344779Sdim 63344779Sdim std::vector<codeview::TypeIndex> findRecordsByName(StringRef Name) const; 64344779Sdim 65344779Sdim codeview::CVType getType(codeview::TypeIndex Index); 66344779Sdim 67320397Sdim BinarySubstreamRef getTypeRecordsSubstream() const; 68320397Sdim 69317017Sdim Error commit(); 70317017Sdim 71344779Sdim void buildHashMap(); 72344779Sdim 73344779Sdim bool supportsTypeLookup() const; 74344779Sdim 75317017Sdimprivate: 76319547Sdim PDBFile &Pdb; 77317017Sdim std::unique_ptr<msf::MappedBlockStream> Stream; 78317017Sdim 79319164Sdim std::unique_ptr<codeview::LazyRandomTypeCollection> Types; 80319164Sdim 81320397Sdim BinarySubstreamRef TypeRecordsSubstream; 82320397Sdim 83317017Sdim codeview::CVTypeArray TypeRecords; 84317017Sdim 85317017Sdim std::unique_ptr<BinaryStream> HashStream; 86317017Sdim FixedStreamArray<support::ulittle32_t> HashValues; 87318384Sdim FixedStreamArray<codeview::TypeIndexOffset> TypeIndexOffsets; 88341825Sdim HashTable<support::ulittle32_t> HashAdjusters; 89317017Sdim 90344779Sdim std::vector<std::vector<codeview::TypeIndex>> HashMap; 91344779Sdim 92317017Sdim const TpiStreamHeader *Header; 93317017Sdim}; 94317017Sdim} 95317017Sdim} 96317017Sdim 97317017Sdim#endif 98