1 | //===- TypeMerger.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 LLD_COFF_TYPEMERGER_H |
10 | #define LLD_COFF_TYPEMERGER_H |
11 | |
12 | #include "Config.h" |
13 | #include "DebugTypes.h" |
14 | #include "lld/Common/Timer.h" |
15 | #include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h" |
16 | #include "llvm/DebugInfo/CodeView/TypeHashing.h" |
17 | #include "llvm/Support/Allocator.h" |
18 | #include <atomic> |
19 | |
20 | namespace lld::coff { |
21 | |
22 | using llvm::codeview::GloballyHashedType; |
23 | using llvm::codeview::TypeIndex; |
24 | |
25 | struct GHashState; |
26 | |
27 | class TypeMerger { |
28 | public: |
29 | TypeMerger(COFFLinkerContext &ctx, llvm::BumpPtrAllocator &alloc); |
30 | |
31 | ~TypeMerger(); |
32 | |
33 | /// Get the type table or the global type table if /DEBUG:GHASH is enabled. |
34 | inline llvm::codeview::TypeCollection &getTypeTable() { |
35 | assert(!ctx.config.debugGHashes); |
36 | return typeTable; |
37 | } |
38 | |
39 | /// Get the ID table or the global ID table if /DEBUG:GHASH is enabled. |
40 | inline llvm::codeview::TypeCollection &getIDTable() { |
41 | assert(!ctx.config.debugGHashes); |
42 | return idTable; |
43 | } |
44 | |
45 | /// Use global hashes to eliminate duplicate types and identify unique type |
46 | /// indices in each TpiSource. |
47 | void mergeTypesWithGHash(); |
48 | |
49 | /// Map from PDB function id type indexes to PDB function type indexes. |
50 | /// Populated after mergeTypesWithGHash. |
51 | llvm::DenseMap<TypeIndex, TypeIndex> funcIdToType; |
52 | |
53 | /// Type records that will go into the PDB TPI stream. |
54 | llvm::codeview::MergingTypeTableBuilder typeTable; |
55 | |
56 | /// Item records that will go into the PDB IPI stream. |
57 | llvm::codeview::MergingTypeTableBuilder idTable; |
58 | |
59 | // When showSummary is enabled, these are histograms of TPI and IPI records |
60 | // keyed by type index. |
61 | SmallVector<uint32_t, 0> tpiCounts; |
62 | SmallVector<uint32_t, 0> ipiCounts; |
63 | |
64 | /// Dependency type sources, such as type servers or PCH object files. These |
65 | /// must be processed before objects that rely on them. Set by |
66 | /// sortDependencies. |
67 | ArrayRef<TpiSource *> dependencySources; |
68 | |
69 | /// Object file sources. These must be processed after dependencySources. |
70 | ArrayRef<TpiSource *> objectSources; |
71 | |
72 | /// Sorts the dependencies and reassigns TpiSource indices. |
73 | void sortDependencies(); |
74 | |
75 | private: |
76 | void clearGHashes(); |
77 | |
78 | COFFLinkerContext &ctx; |
79 | }; |
80 | |
81 | } // namespace lld::coff |
82 | |
83 | #endif |
84 | |