1//===- TypeTableCollection.cpp -------------------------------- *- 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#include "llvm/DebugInfo/CodeView/TypeTableCollection.h" 10 11#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" 12#include "llvm/DebugInfo/CodeView/RecordName.h" 13#include "llvm/Support/BinaryStreamReader.h" 14 15using namespace llvm; 16using namespace llvm::codeview; 17 18TypeTableCollection::TypeTableCollection(ArrayRef<ArrayRef<uint8_t>> Records) 19 : NameStorage(Allocator), Records(Records) { 20 Names.resize(Records.size()); 21} 22 23Optional<TypeIndex> TypeTableCollection::getFirst() { 24 if (empty()) 25 return None; 26 return TypeIndex::fromArrayIndex(0); 27} 28 29Optional<TypeIndex> TypeTableCollection::getNext(TypeIndex Prev) { 30 assert(contains(Prev)); 31 ++Prev; 32 if (Prev.toArrayIndex() == size()) 33 return None; 34 return Prev; 35} 36 37CVType TypeTableCollection::getType(TypeIndex Index) { 38 assert(Index.toArrayIndex() < Records.size()); 39 return CVType(Records[Index.toArrayIndex()]); 40} 41 42StringRef TypeTableCollection::getTypeName(TypeIndex Index) { 43 if (Index.isNoneType() || Index.isSimple()) 44 return TypeIndex::simpleTypeName(Index); 45 46 uint32_t I = Index.toArrayIndex(); 47 if (Names[I].data() == nullptr) { 48 StringRef Result = NameStorage.save(computeTypeName(*this, Index)); 49 Names[I] = Result; 50 } 51 return Names[I]; 52} 53 54bool TypeTableCollection::contains(TypeIndex Index) { 55 return Index.toArrayIndex() <= size(); 56} 57 58uint32_t TypeTableCollection::size() { return Records.size(); } 59 60uint32_t TypeTableCollection::capacity() { return Records.size(); } 61