1//===- TypeReferenceTracker.h --------------------------------- *- 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_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 10#define LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 11 12#include "InputFile.h" 13 14#include "llvm/ADT/BitVector.h" 15#include "llvm/ADT/Optional.h" 16#include "llvm/ADT/SmallVector.h" 17#include "llvm/DebugInfo/CodeView/CVRecord.h" 18#include "llvm/DebugInfo/CodeView/TypeIndex.h" 19#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h" 20#include "llvm/Support/Error.h" 21 22namespace llvm { 23namespace pdb { 24 25class TpiStream; 26 27/// Maintains bitvector to track whether a type was referenced by a symbol 28/// record. 29class TypeReferenceTracker { 30public: 31 TypeReferenceTracker(InputFile &File); 32 33 // Do the work of marking referenced types. 34 void mark(); 35 36 // Return true if a symbol record transitively references this type. 37 bool isTypeReferenced(codeview::TypeIndex TI) { 38 return TI.toArrayIndex() <= NumTypeRecords && 39 TypeReferenced.test(TI.toArrayIndex()); 40 } 41 42private: 43 void addTypeRefsFromSymbol(const codeview::CVSymbol &Sym); 44 45 // Mark types on this list as referenced. 46 void addReferencedTypes(ArrayRef<uint8_t> RecData, 47 ArrayRef<codeview::TiReference> Refs); 48 49 // Consume all types on the worklist. 50 void markReferencedTypes(); 51 52 void addOneTypeRef(codeview::TiRefKind RefKind, codeview::TypeIndex RefTI); 53 54 InputFile &File; 55 codeview::LazyRandomTypeCollection &Types; 56 codeview::LazyRandomTypeCollection *Ids = nullptr; 57 TpiStream *Tpi = nullptr; 58 BitVector TypeReferenced; 59 BitVector IdReferenced; 60 SmallVector<std::pair<codeview::TiRefKind, codeview::TypeIndex>, 10> 61 RefWorklist; 62 uint32_t NumTypeRecords = 0; 63 uint32_t NumIdRecords = 0; 64}; 65 66} // namespace pdb 67} // namespace llvm 68 69#endif // LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 70