@@ -77,8 +77,7 @@ class TypeStreamMerger {
7777 // Local hashing entry points
7878 Error mergeTypesAndIds (MergingTypeTableBuilder &DestIds,
7979 MergingTypeTableBuilder &DestTypes,
80- const CVTypeArray &IdsAndTypes,
81- Optional<EndPrecompRecord> &EP);
80+ const CVTypeArray &IdsAndTypes, Optional<uint32_t > &S);
8281 Error mergeIdRecords (MergingTypeTableBuilder &Dest,
8382 ArrayRef<TypeIndex> TypeSourceToDest,
8483 const CVTypeArray &Ids);
@@ -90,14 +89,14 @@ class TypeStreamMerger {
9089 GlobalTypeTableBuilder &DestTypes,
9190 const CVTypeArray &IdsAndTypes,
9291 ArrayRef<GloballyHashedType> Hashes,
93- Optional<EndPrecompRecord > &EP );
92+ Optional<uint32_t > &S );
9493 Error mergeIdRecords (GlobalTypeTableBuilder &Dest,
9594 ArrayRef<TypeIndex> TypeSourceToDest,
9695 const CVTypeArray &Ids,
9796 ArrayRef<GloballyHashedType> Hashes);
9897 Error mergeTypeRecords (GlobalTypeTableBuilder &Dest, const CVTypeArray &Types,
9998 ArrayRef<GloballyHashedType> Hashes,
100- Optional<EndPrecompRecord > &EP );
99+ Optional<uint32_t > &S );
101100
102101private:
103102 Error doit (const CVTypeArray &Types);
@@ -197,7 +196,7 @@ class TypeStreamMerger {
197196 // / its type indices.
198197 SmallVector<uint8_t , 256 > RemapStorage;
199198
200- Optional<EndPrecompRecord> EndPrecomp;
199+ Optional<uint32_t > PCHSignature;
201200};
202201
203202} // end anonymous namespace
@@ -275,25 +274,25 @@ Error TypeStreamMerger::mergeIdRecords(MergingTypeTableBuilder &Dest,
275274Error TypeStreamMerger::mergeTypesAndIds (MergingTypeTableBuilder &DestIds,
276275 MergingTypeTableBuilder &DestTypes,
277276 const CVTypeArray &IdsAndTypes,
278- Optional<EndPrecompRecord > &EP ) {
277+ Optional<uint32_t > &S ) {
279278 DestIdStream = &DestIds;
280279 DestTypeStream = &DestTypes;
281280 UseGlobalHashes = false ;
282281 auto Err = doit (IdsAndTypes);
283- EP = EndPrecomp ;
282+ S = PCHSignature ;
284283 return Err;
285284}
286285
287286// Global hashing entry points
288287Error TypeStreamMerger::mergeTypeRecords (GlobalTypeTableBuilder &Dest,
289288 const CVTypeArray &Types,
290289 ArrayRef<GloballyHashedType> Hashes,
291- Optional<EndPrecompRecord > &EP ) {
290+ Optional<uint32_t > &S ) {
292291 DestGlobalTypeStream = &Dest;
293292 UseGlobalHashes = true ;
294293 GlobalHashes = Hashes;
295294 auto Err = doit (Types);
296- EP = EndPrecomp ;
295+ S = PCHSignature ;
297296 return Err;
298297}
299298
@@ -313,13 +312,13 @@ Error TypeStreamMerger::mergeTypesAndIds(GlobalTypeTableBuilder &DestIds,
313312 GlobalTypeTableBuilder &DestTypes,
314313 const CVTypeArray &IdsAndTypes,
315314 ArrayRef<GloballyHashedType> Hashes,
316- Optional<EndPrecompRecord > &EP ) {
315+ Optional<uint32_t > &S ) {
317316 DestGlobalIdStream = &DestIds;
318317 DestGlobalTypeStream = &DestTypes;
319318 UseGlobalHashes = true ;
320319 GlobalHashes = Hashes;
321320 auto Err = doit (IdsAndTypes);
322- EP = EndPrecomp ;
321+ S = PCHSignature ;
323322 return Err;
324323}
325324
@@ -445,28 +444,27 @@ Error llvm::codeview::mergeIdRecords(MergingTypeTableBuilder &Dest,
445444Error llvm::codeview::mergeTypeAndIdRecords (
446445 MergingTypeTableBuilder &DestIds, MergingTypeTableBuilder &DestTypes,
447446 SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
448- Optional<EndPrecompRecord > &EndPrecomp ) {
447+ Optional<uint32_t > &PCHSignature ) {
449448 TypeStreamMerger M (SourceToDest);
450- return M.mergeTypesAndIds (DestIds, DestTypes, IdsAndTypes, EndPrecomp );
449+ return M.mergeTypesAndIds (DestIds, DestTypes, IdsAndTypes, PCHSignature );
451450}
452451
453452Error llvm::codeview::mergeTypeAndIdRecords (
454453 GlobalTypeTableBuilder &DestIds, GlobalTypeTableBuilder &DestTypes,
455454 SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
456- ArrayRef<GloballyHashedType> Hashes,
457- Optional<EndPrecompRecord> &EndPrecomp) {
455+ ArrayRef<GloballyHashedType> Hashes, Optional<uint32_t > &PCHSignature) {
458456 TypeStreamMerger M (SourceToDest);
459457 return M.mergeTypesAndIds (DestIds, DestTypes, IdsAndTypes, Hashes,
460- EndPrecomp );
458+ PCHSignature );
461459}
462460
463461Error llvm::codeview::mergeTypeRecords (GlobalTypeTableBuilder &Dest,
464462 SmallVectorImpl<TypeIndex> &SourceToDest,
465463 const CVTypeArray &Types,
466464 ArrayRef<GloballyHashedType> Hashes,
467- Optional<EndPrecompRecord > &EndPrecomp ) {
465+ Optional<uint32_t > &PCHSignature ) {
468466 TypeStreamMerger M (SourceToDest);
469- return M.mergeTypeRecords (Dest, Types, Hashes, EndPrecomp );
467+ return M.mergeTypeRecords (Dest, Types, Hashes, PCHSignature );
470468}
471469
472470Error llvm::codeview::mergeIdRecords (GlobalTypeTableBuilder &Dest,
@@ -483,11 +481,13 @@ Expected<bool> TypeStreamMerger::shouldRemapType(const CVType &Type) {
483481 // signature, through EndPrecompRecord. This is done here for performance
484482 // reasons, to avoid re-parsing the Types stream.
485483 if (Type.kind () == LF_ENDPRECOMP) {
486- assert (!EndPrecomp);
487- EndPrecomp.emplace ();
484+ EndPrecompRecord EP;
488485 if (auto EC = TypeDeserializer::deserializeAs (const_cast <CVType &>(Type),
489- EndPrecomp. getValue () ))
486+ EP ))
490487 return joinErrors (std::move (EC), errorCorruptRecord ());
488+ if (PCHSignature.hasValue ())
489+ return errorCorruptRecord ();
490+ PCHSignature.emplace (EP.getSignature ());
491491 return false ;
492492 }
493493 return true ;
0 commit comments