1 //===- TypeStreamMerger.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_DEBUGINFO_CODEVIEW_TYPESTREAMMERGER_H 10 #define LLVM_DEBUGINFO_CODEVIEW_TYPESTREAMMERGER_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/DebugInfo/CodeView/CVRecord.h" 14 #include "llvm/Support/Error.h" 15 16 namespace llvm { 17 template <typename T> class SmallVectorImpl; 18 namespace codeview { 19 20 class TypeIndex; 21 struct GloballyHashedType; 22 class GlobalTypeTableBuilder; 23 class MergingTypeTableBuilder; 24 25 /// Used to forward information about PCH.OBJ (precompiled) files, when 26 /// applicable. 27 struct PCHMergerInfo { 28 uint32_t PCHSignature{}; 29 uint32_t EndPrecompIndex = ~0U; 30 }; 31 32 /// Merge one set of type records into another. This method assumes 33 /// that all records are type records, and there are no Id records present. 34 /// 35 /// \param Dest The table to store the re-written type records into. 36 /// 37 /// \param SourceToDest A vector, indexed by the TypeIndex in the source 38 /// type stream, that contains the index of the corresponding type record 39 /// in the destination stream. 40 /// 41 /// \param Types The collection of types to merge in. 42 /// 43 /// \returns Error::success() if the operation succeeded, otherwise an 44 /// appropriate error code. 45 Error mergeTypeRecords(MergingTypeTableBuilder &Dest, 46 SmallVectorImpl<TypeIndex> &SourceToDest, 47 const CVTypeArray &Types); 48 49 /// Merge one set of id records into another. This method assumes 50 /// that all records are id records, and there are no Type records present. 51 /// However, since Id records can refer back to Type records, this method 52 /// assumes that the referenced type records have also been merged into 53 /// another type stream (for example using the above method), and accepts 54 /// the mapping from source to dest for that stream so that it can re-write 55 /// the type record mappings accordingly. 56 /// 57 /// \param Dest The table to store the re-written id records into. 58 /// 59 /// \param Types The mapping to use for the type records that these id 60 /// records refer to. 61 /// 62 /// \param SourceToDest A vector, indexed by the TypeIndex in the source 63 /// id stream, that contains the index of the corresponding id record 64 /// in the destination stream. 65 /// 66 /// \param Ids The collection of id records to merge in. 67 /// 68 /// \returns Error::success() if the operation succeeded, otherwise an 69 /// appropriate error code. 70 Error mergeIdRecords(MergingTypeTableBuilder &Dest, ArrayRef<TypeIndex> Types, 71 SmallVectorImpl<TypeIndex> &SourceToDest, 72 const CVTypeArray &Ids); 73 74 /// Merge a unified set of type and id records, splitting them into 75 /// separate output streams. 76 /// 77 /// \param DestIds The table to store the re-written id records into. 78 /// 79 /// \param DestTypes the table to store the re-written type records into. 80 /// 81 /// \param SourceToDest A vector, indexed by the TypeIndex in the source 82 /// id stream, that contains the index of the corresponding id record 83 /// in the destination stream. 84 /// 85 /// \param IdsAndTypes The collection of id records to merge in. 86 /// 87 /// \returns Error::success() if the operation succeeded, otherwise an 88 /// appropriate error code. 89 Error mergeTypeAndIdRecords(MergingTypeTableBuilder &DestIds, 90 MergingTypeTableBuilder &DestTypes, 91 SmallVectorImpl<TypeIndex> &SourceToDest, 92 const CVTypeArray &IdsAndTypes, 93 std::optional<PCHMergerInfo> &PCHInfo); 94 95 Error mergeTypeAndIdRecords(GlobalTypeTableBuilder &DestIds, 96 GlobalTypeTableBuilder &DestTypes, 97 SmallVectorImpl<TypeIndex> &SourceToDest, 98 const CVTypeArray &IdsAndTypes, 99 ArrayRef<GloballyHashedType> Hashes, 100 std::optional<PCHMergerInfo> &PCHInfo); 101 102 Error mergeTypeRecords(GlobalTypeTableBuilder &Dest, 103 SmallVectorImpl<TypeIndex> &SourceToDest, 104 const CVTypeArray &Types, 105 ArrayRef<GloballyHashedType> Hashes, 106 std::optional<PCHMergerInfo> &PCHInfo); 107 108 Error mergeIdRecords(GlobalTypeTableBuilder &Dest, ArrayRef<TypeIndex> Types, 109 SmallVectorImpl<TypeIndex> &SourceToDest, 110 const CVTypeArray &Ids, 111 ArrayRef<GloballyHashedType> Hashes); 112 113 } // end namespace codeview 114 } // end namespace llvm 115 116 #endif // LLVM_DEBUGINFO_CODEVIEW_TYPESTREAMMERGER_H 117