@@ -159,8 +159,14 @@ struct DiagnosticSerializer {
159159 llvm::Expected<DiagnosticInfo::FixIt>
160160 deserializeFixIt (const SerializedFixIt &);
161161
162+ // Stores the temporary data from deserialization.
163+ struct DiagnosticStorage {
164+ SmallVector<DiagnosticInfo, 2 > ChildDiag;
165+ SmallVector<CharSourceRange, 2 > Ranges;
166+ SmallVector<DiagnosticInfo::FixIt, 2 > FixIts;
167+ };
162168 llvm::Error deserializeDiagnosticInfo (const SerializedDiagnosticInfo &,
163- ReplayFunc);
169+ DiagnosticStorage &, ReplayFunc);
164170
165171 // Deserialize File and return the bufferID in serializing SourceManager.
166172 unsigned deserializeFile (const SerializedFile &File);
@@ -288,8 +294,10 @@ void DiagnosticSerializer::handleDiagnostic(SourceManager &SM,
288294 const DiagnosticInfo &Info,
289295 ReplayFunc Fn) {
290296 DiagInfos.emplace_back (convertDiagnosticInfo (SM, Info));
291- if (Fn)
292- cantFail (deserializeDiagnosticInfo (DiagInfos.back (), Fn));
297+ if (Fn) {
298+ DiagnosticStorage Storage;
299+ cantFail (deserializeDiagnosticInfo (DiagInfos.back (), Storage, Fn));
300+ }
293301}
294302
295303unsigned DiagnosticSerializer::getFileIDFromBufferID (SourceManager &SM,
@@ -537,7 +545,8 @@ llvm::Error DiagnosticSerializer::deserializeGeneratedFileInfo(
537545}
538546
539547llvm::Error DiagnosticSerializer::deserializeDiagnosticInfo (
540- const SerializedDiagnosticInfo &Info, ReplayFunc callback) {
548+ const SerializedDiagnosticInfo &Info, DiagnosticStorage &Storage,
549+ ReplayFunc callback) {
541550 DiagID ID = (DiagID)Info.ID ;
542551 auto Loc = deserializeSourceLoc (Info.Loc );
543552 if (!Loc)
@@ -546,33 +555,32 @@ llvm::Error DiagnosticSerializer::deserializeDiagnosticInfo(
546555 auto BICD = deserializeSourceLoc (Info.BufferIndirectlyCausingDiagnostic );
547556 if (!BICD)
548557 return BICD.takeError ();
549- SmallVector<DiagnosticInfo, 2 > ChildDiag;
558+
559+ llvm::TinyPtrVector<DiagnosticInfo *> ChildDiagPtrs;
550560 for (auto &CD : Info.ChildDiagnosticInfo ) {
551- auto E = deserializeDiagnosticInfo (CD, [&](const DiagnosticInfo &Info) {
552- ChildDiag.emplace_back (Info);
553- return llvm::Error::success ();
554- });
561+ auto E =
562+ deserializeDiagnosticInfo (CD, Storage, [&](const DiagnosticInfo &Info) {
563+ Storage.ChildDiag .emplace_back (Info);
564+ ChildDiagPtrs.push_back (&Storage.ChildDiag .back ());
565+ return llvm::Error::success ();
566+ });
555567 if (E)
556568 return E;
557569 }
558- llvm::TinyPtrVector<DiagnosticInfo*> ChildDiagPtrs;
559- llvm::for_each (ChildDiag, [&ChildDiagPtrs](DiagnosticInfo &I) {
560- ChildDiagPtrs.push_back (&I);
561- });
562- SmallVector<CharSourceRange, 2 > Ranges;
563570 for (auto &R : Info.Ranges ) {
564571 auto Range = deserializeSourceRange (R);
565572 if (!Range)
566573 return Range.takeError ();
567- Ranges.emplace_back (*Range);
574+ Storage. Ranges .emplace_back (*Range);
568575 }
569- SmallVector<DiagnosticInfo::FixIt, 2 > FixIts ;
576+ auto Ranges = ArrayRef (Storage. Ranges ). take_back (Info. Ranges . size ()) ;
570577 for (auto &F : Info.FixIts ) {
571578 auto FixIt = deserializeFixIt (F);
572579 if (!FixIt)
573580 return FixIt.takeError ();
574- FixIts.emplace_back (*FixIt);
581+ Storage. FixIts .emplace_back (*FixIt);
575582 }
583+ auto FixIts = ArrayRef (Storage.FixIts ).take_back (Info.FixIts .size ());
576584
577585 DiagnosticInfo DeserializedInfo{ID,
578586 *Loc,
@@ -623,11 +631,13 @@ llvm::Error DiagnosticSerializer::doEmitFromCached(llvm::StringRef Buffer,
623631 }
624632
625633 for (auto &Info : DiagInfos) {
626- auto E = deserializeDiagnosticInfo (Info, [&](const DiagnosticInfo &Info) {
627- for (auto *Diag : Diags.getConsumers ())
628- Diag->handleDiagnostic (SrcMgr, Info);
629- return llvm::Error::success ();
630- });
634+ DiagnosticStorage Storage;
635+ auto E = deserializeDiagnosticInfo (Info, Storage,
636+ [&](const DiagnosticInfo &Info) {
637+ for (auto *Diag : Diags.getConsumers ())
638+ Diag->handleDiagnostic (SrcMgr, Info);
639+ return llvm::Error::success ();
640+ });
631641 if (E)
632642 return E;
633643 }
0 commit comments