1cda7ff9dSReid Kleckner //===- TypeReferenceTracker.h --------------------------------- *- C++ --*-===// 2cda7ff9dSReid Kleckner // 3cda7ff9dSReid Kleckner // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4cda7ff9dSReid Kleckner // See https://llvm.org/LICENSE.txt for license information. 5cda7ff9dSReid Kleckner // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cda7ff9dSReid Kleckner // 7cda7ff9dSReid Kleckner //===----------------------------------------------------------------------===// 8cda7ff9dSReid Kleckner 9cda7ff9dSReid Kleckner #ifndef LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 10cda7ff9dSReid Kleckner #define LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 11cda7ff9dSReid Kleckner 12cda7ff9dSReid Kleckner #include "llvm/ADT/BitVector.h" 13cda7ff9dSReid Kleckner #include "llvm/ADT/SmallVector.h" 14cda7ff9dSReid Kleckner #include "llvm/DebugInfo/CodeView/CVRecord.h" 15cda7ff9dSReid Kleckner #include "llvm/DebugInfo/CodeView/TypeIndex.h" 16cda7ff9dSReid Kleckner #include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h" 17*75112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/Native/InputFile.h" 18cda7ff9dSReid Kleckner #include "llvm/Support/Error.h" 19cda7ff9dSReid Kleckner 20cda7ff9dSReid Kleckner namespace llvm { 21cda7ff9dSReid Kleckner namespace pdb { 22cda7ff9dSReid Kleckner 23cda7ff9dSReid Kleckner class TpiStream; 24cda7ff9dSReid Kleckner 25cda7ff9dSReid Kleckner /// Maintains bitvector to track whether a type was referenced by a symbol 26cda7ff9dSReid Kleckner /// record. 27cda7ff9dSReid Kleckner class TypeReferenceTracker { 28cda7ff9dSReid Kleckner public: 29cda7ff9dSReid Kleckner TypeReferenceTracker(InputFile &File); 30cda7ff9dSReid Kleckner 31cda7ff9dSReid Kleckner // Do the work of marking referenced types. 32cda7ff9dSReid Kleckner void mark(); 33cda7ff9dSReid Kleckner 34cda7ff9dSReid Kleckner // Return true if a symbol record transitively references this type. isTypeReferenced(codeview::TypeIndex TI)35cda7ff9dSReid Kleckner bool isTypeReferenced(codeview::TypeIndex TI) { 36cda7ff9dSReid Kleckner return TI.toArrayIndex() <= NumTypeRecords && 37cda7ff9dSReid Kleckner TypeReferenced.test(TI.toArrayIndex()); 38cda7ff9dSReid Kleckner } 39cda7ff9dSReid Kleckner 40cda7ff9dSReid Kleckner private: 41cda7ff9dSReid Kleckner void addTypeRefsFromSymbol(const codeview::CVSymbol &Sym); 42cda7ff9dSReid Kleckner 43cda7ff9dSReid Kleckner // Mark types on this list as referenced. 44cda7ff9dSReid Kleckner void addReferencedTypes(ArrayRef<uint8_t> RecData, 45cda7ff9dSReid Kleckner ArrayRef<codeview::TiReference> Refs); 46cda7ff9dSReid Kleckner 47cda7ff9dSReid Kleckner // Consume all types on the worklist. 48cda7ff9dSReid Kleckner void markReferencedTypes(); 49cda7ff9dSReid Kleckner 50cda7ff9dSReid Kleckner void addOneTypeRef(codeview::TiRefKind RefKind, codeview::TypeIndex RefTI); 51cda7ff9dSReid Kleckner 52cda7ff9dSReid Kleckner InputFile &File; 53cda7ff9dSReid Kleckner codeview::LazyRandomTypeCollection &Types; 54cda7ff9dSReid Kleckner codeview::LazyRandomTypeCollection *Ids = nullptr; 55cda7ff9dSReid Kleckner TpiStream *Tpi = nullptr; 56cda7ff9dSReid Kleckner BitVector TypeReferenced; 57cda7ff9dSReid Kleckner BitVector IdReferenced; 58cda7ff9dSReid Kleckner SmallVector<std::pair<codeview::TiRefKind, codeview::TypeIndex>, 10> 59cda7ff9dSReid Kleckner RefWorklist; 60cda7ff9dSReid Kleckner uint32_t NumTypeRecords = 0; 61cda7ff9dSReid Kleckner uint32_t NumIdRecords = 0; 62cda7ff9dSReid Kleckner }; 63cda7ff9dSReid Kleckner 64cda7ff9dSReid Kleckner } // namespace pdb 65cda7ff9dSReid Kleckner } // namespace llvm 66cda7ff9dSReid Kleckner 67cda7ff9dSReid Kleckner #endif // LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H 68