@@ -159,8 +159,14 @@ struct DiagnosticSerializer {
159
159
llvm::Expected<DiagnosticInfo::FixIt>
160
160
deserializeFixIt (const SerializedFixIt &);
161
161
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
+ };
162
168
llvm::Error deserializeDiagnosticInfo (const SerializedDiagnosticInfo &,
163
- ReplayFunc);
169
+ DiagnosticStorage &, ReplayFunc);
164
170
165
171
// Deserialize File and return the bufferID in serializing SourceManager.
166
172
unsigned deserializeFile (const SerializedFile &File);
@@ -288,8 +294,10 @@ void DiagnosticSerializer::handleDiagnostic(SourceManager &SM,
288
294
const DiagnosticInfo &Info,
289
295
ReplayFunc Fn) {
290
296
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
+ }
293
301
}
294
302
295
303
unsigned DiagnosticSerializer::getFileIDFromBufferID (SourceManager &SM,
@@ -537,7 +545,8 @@ llvm::Error DiagnosticSerializer::deserializeGeneratedFileInfo(
537
545
}
538
546
539
547
llvm::Error DiagnosticSerializer::deserializeDiagnosticInfo (
540
- const SerializedDiagnosticInfo &Info, ReplayFunc callback) {
548
+ const SerializedDiagnosticInfo &Info, DiagnosticStorage &Storage,
549
+ ReplayFunc callback) {
541
550
DiagID ID = (DiagID)Info.ID ;
542
551
auto Loc = deserializeSourceLoc (Info.Loc );
543
552
if (!Loc)
@@ -546,33 +555,32 @@ llvm::Error DiagnosticSerializer::deserializeDiagnosticInfo(
546
555
auto BICD = deserializeSourceLoc (Info.BufferIndirectlyCausingDiagnostic );
547
556
if (!BICD)
548
557
return BICD.takeError ();
549
- SmallVector<DiagnosticInfo, 2 > ChildDiag;
558
+
559
+ llvm::TinyPtrVector<DiagnosticInfo *> ChildDiagPtrs;
550
560
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
+ });
555
567
if (E)
556
568
return E;
557
569
}
558
- llvm::TinyPtrVector<DiagnosticInfo*> ChildDiagPtrs;
559
- llvm::for_each (ChildDiag, [&ChildDiagPtrs](DiagnosticInfo &I) {
560
- ChildDiagPtrs.push_back (&I);
561
- });
562
- SmallVector<CharSourceRange, 2 > Ranges;
563
570
for (auto &R : Info.Ranges ) {
564
571
auto Range = deserializeSourceRange (R);
565
572
if (!Range)
566
573
return Range.takeError ();
567
- Ranges.emplace_back (*Range);
574
+ Storage. Ranges .emplace_back (*Range);
568
575
}
569
- SmallVector<DiagnosticInfo::FixIt, 2 > FixIts ;
576
+ auto Ranges = ArrayRef (Storage. Ranges ). take_back (Info. Ranges . size ()) ;
570
577
for (auto &F : Info.FixIts ) {
571
578
auto FixIt = deserializeFixIt (F);
572
579
if (!FixIt)
573
580
return FixIt.takeError ();
574
- FixIts.emplace_back (*FixIt);
581
+ Storage. FixIts .emplace_back (*FixIt);
575
582
}
583
+ auto FixIts = ArrayRef (Storage.FixIts ).take_back (Info.FixIts .size ());
576
584
577
585
DiagnosticInfo DeserializedInfo{ID,
578
586
*Loc,
@@ -623,11 +631,13 @@ llvm::Error DiagnosticSerializer::doEmitFromCached(llvm::StringRef Buffer,
623
631
}
624
632
625
633
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
+ });
631
641
if (E)
632
642
return E;
633
643
}
0 commit comments