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 20namespace lld::coff { 21 22using llvm::codeview::GloballyHashedType; 23using llvm::codeview::TypeIndex; 24 25struct GHashState; 26 27class TypeMerger { 28public: 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 75private: 76 void clearGHashes(); 77 78 COFFLinkerContext &ctx; 79}; 80 81} // namespace lld::coff 82 83#endif 84