xref: /llvm-project/llvm/tools/llvm-pdbutil/TypeReferenceTracker.h (revision a996cc217cefb9071888de38c6f05e5742d0106f)
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