| //===- TypeTableCollection.cpp -------------------------------- *- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/DebugInfo/CodeView/TypeTableCollection.h" |
| |
| #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" |
| #include "llvm/DebugInfo/CodeView/RecordName.h" |
| #include "llvm/Support/BinaryStreamReader.h" |
| |
| using namespace llvm; |
| using namespace llvm::codeview; |
| |
| TypeTableCollection::TypeTableCollection(ArrayRef<ArrayRef<uint8_t>> Records) |
| : NameStorage(Allocator), Records(Records) { |
| Names.resize(Records.size()); |
| } |
| |
| Optional<TypeIndex> TypeTableCollection::getFirst() { |
| if (empty()) |
| return None; |
| return TypeIndex::fromArrayIndex(0); |
| } |
| |
| Optional<TypeIndex> TypeTableCollection::getNext(TypeIndex Prev) { |
| assert(contains(Prev)); |
| ++Prev; |
| if (Prev.toArrayIndex() == size()) |
| return None; |
| return Prev; |
| } |
| |
| CVType TypeTableCollection::getType(TypeIndex Index) { |
| assert(Index.toArrayIndex() < Records.size()); |
| return CVType(Records[Index.toArrayIndex()]); |
| } |
| |
| StringRef TypeTableCollection::getTypeName(TypeIndex Index) { |
| if (Index.isNoneType() || Index.isSimple()) |
| return TypeIndex::simpleTypeName(Index); |
| |
| uint32_t I = Index.toArrayIndex(); |
| if (Names[I].data() == nullptr) { |
| StringRef Result = NameStorage.save(computeTypeName(*this, Index)); |
| Names[I] = Result; |
| } |
| return Names[I]; |
| } |
| |
| bool TypeTableCollection::contains(TypeIndex Index) { |
| return Index.toArrayIndex() <= size(); |
| } |
| |
| uint32_t TypeTableCollection::size() { return Records.size(); } |
| |
| uint32_t TypeTableCollection::capacity() { return Records.size(); } |