@@ -44,7 +44,7 @@ class Deserializer {
4444
4545public:
4646 Deserializer (llvm::MemoryBufferRef Data) : Cursor(Data) {}
47- bool readFineGrainedDependencyGraph (SourceFileDepGraph &g);
47+ bool readFineGrainedDependencyGraph (SourceFileDepGraph &g, Purpose purpose );
4848 bool readFineGrainedDependencyGraphFromSwiftModule (SourceFileDepGraph &g);
4949};
5050
@@ -151,14 +151,24 @@ static llvm::Optional<DeclAspect> getDeclAspect(unsigned declAspect) {
151151 return None;
152152}
153153
154- bool Deserializer::readFineGrainedDependencyGraph (SourceFileDepGraph &g) {
154+ bool Deserializer::readFineGrainedDependencyGraph (SourceFileDepGraph &g,
155+ Purpose purpose) {
155156 using namespace record_block ;
156157
157- if (readSignature ())
158- return true ;
158+ switch (purpose) {
159+ case Purpose::ForSwiftDeps:
160+ if (readSignature ())
161+ return true ;
159162
160- if (enterTopLevelBlock ())
161- return true ;
163+ if (enterTopLevelBlock ())
164+ return true ;
165+ LLVM_FALLTHROUGH;
166+ case Purpose::ForSwiftModule:
167+ // N.B. Incremental metadata embedded in swiftmodule files does not have
168+ // a leading signature, and its top-level block has already been
169+ // consumed by the time we get here.
170+ break ;
171+ }
162172
163173 if (readMetadata ())
164174 return true ;
@@ -260,7 +270,7 @@ bool Deserializer::readFineGrainedDependencyGraph(SourceFileDepGraph &g) {
260270bool swift::fine_grained_dependencies::readFineGrainedDependencyGraph (
261271 llvm::MemoryBuffer &buffer, SourceFileDepGraph &g) {
262272 Deserializer deserializer (buffer.getMemBufferRef ());
263- return deserializer.readFineGrainedDependencyGraph (g);
273+ return deserializer.readFineGrainedDependencyGraph (g, Purpose::ForSwiftDeps );
264274}
265275
266276bool swift::fine_grained_dependencies::readFineGrainedDependencyGraph (
@@ -322,7 +332,8 @@ class Serializer {
322332 Serializer (llvm::BitstreamWriter &ExistingOut) : Out(ExistingOut) {}
323333
324334public:
325- void writeFineGrainedDependencyGraph (const SourceFileDepGraph &g);
335+ void writeFineGrainedDependencyGraph (const SourceFileDepGraph &g,
336+ Purpose purpose);
326337};
327338
328339} // end namespace
@@ -382,11 +393,21 @@ void Serializer::writeMetadata() {
382393}
383394
384395void
385- Serializer::writeFineGrainedDependencyGraph (const SourceFileDepGraph &g) {
386- writeSignature ();
387- writeBlockInfoBlock ();
396+ Serializer::writeFineGrainedDependencyGraph (const SourceFileDepGraph &g,
397+ Purpose purpose) {
398+ unsigned blockID = 0 ;
399+ switch (purpose) {
400+ case Purpose::ForSwiftDeps:
401+ writeSignature ();
402+ writeBlockInfoBlock ();
403+ blockID = RECORD_BLOCK_ID;
404+ break ;
405+ case Purpose::ForSwiftModule:
406+ blockID = INCREMENTAL_INFORMATION_BLOCK_ID;
407+ break ;
408+ }
388409
389- llvm::BCBlockRAII restoreBlock (Out, RECORD_BLOCK_ID , 8 );
410+ llvm::BCBlockRAII restoreBlock (Out, blockID , 8 );
390411
391412 using namespace record_block ;
392413
@@ -468,9 +489,10 @@ unsigned Serializer::getIdentifier(StringRef str) {
468489}
469490
470491void swift::fine_grained_dependencies::writeFineGrainedDependencyGraph (
471- llvm::BitstreamWriter &Out, const SourceFileDepGraph &g) {
492+ llvm::BitstreamWriter &Out, const SourceFileDepGraph &g,
493+ Purpose purpose) {
472494 Serializer serializer{Out};
473- serializer.writeFineGrainedDependencyGraph (g);
495+ serializer.writeFineGrainedDependencyGraph (g, purpose );
474496}
475497
476498bool swift::fine_grained_dependencies::writeFineGrainedDependencyGraphToPath (
@@ -480,7 +502,7 @@ bool swift::fine_grained_dependencies::writeFineGrainedDependencyGraphToPath(
480502 return withOutputFile (diags, path, [&](llvm::raw_ostream &out) {
481503 SmallVector<char , 0 > Buffer;
482504 llvm::BitstreamWriter Writer{Buffer};
483- writeFineGrainedDependencyGraph (Writer, g);
505+ writeFineGrainedDependencyGraph (Writer, g, Purpose::ForSwiftDeps );
484506 out.write (Buffer.data (), Buffer.size ());
485507 out.flush ();
486508 return false ;
@@ -516,7 +538,7 @@ static bool enterTopLevelModuleBlock(llvm::BitstreamCursor &cursor, unsigned ID,
516538 if (next.Kind != llvm::BitstreamEntry::SubBlock)
517539 return false ;
518540
519- if (next.ID == RECORD_BLOCK_ID ) {
541+ if (next.ID == llvm::bitc::BLOCKINFO_BLOCK_ID ) {
520542 if (shouldReadBlockInfo) {
521543 if (!cursor.ReadBlockInfoBlock ())
522544 return false ;
@@ -531,7 +553,6 @@ static bool enterTopLevelModuleBlock(llvm::BitstreamCursor &cursor, unsigned ID,
531553 return false ;
532554
533555 if (llvm::Error Err = cursor.EnterSubBlock (ID)) {
534- // FIXME this drops the error on the floor.
535556 consumeError (std::move (Err));
536557 return false ;
537558 }
@@ -549,18 +570,18 @@ bool swift::fine_grained_dependencies::
549570bool Deserializer::readFineGrainedDependencyGraphFromSwiftModule (
550571 SourceFileDepGraph &g) {
551572 if (!checkModuleSignature (Cursor, {0xE2 , 0x9C , 0xA8 , 0x0E }) ||
552- !enterTopLevelModuleBlock (Cursor, RECORD_BLOCK_ID , false )) {
553- return false ;
573+ !enterTopLevelModuleBlock (Cursor, llvm::bitc::FIRST_APPLICATION_BLOCKID , false )) {
574+ return true ;
554575 }
555576
556577 llvm::BitstreamEntry topLevelEntry;
557-
578+ bool DidNotReadFineGrainedDependencies = true ;
558579 while (!Cursor.AtEndOfStream ()) {
559580 llvm::Expected<llvm::BitstreamEntry> maybeEntry =
560581 Cursor.advance (llvm::BitstreamCursor::AF_DontPopBlockAtEnd);
561582 if (!maybeEntry) {
562583 consumeError (maybeEntry.takeError ());
563- return false ;
584+ return true ;
564585 }
565586 topLevelEntry = maybeEntry.get ();
566587 if (topLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
@@ -571,21 +592,25 @@ bool Deserializer::readFineGrainedDependencyGraphFromSwiftModule(
571592 if (llvm::Error Err =
572593 Cursor.EnterSubBlock (INCREMENTAL_INFORMATION_BLOCK_ID)) {
573594 consumeError (std::move (Err));
574- return false ;
595+ return true ;
596+ }
597+ if (readFineGrainedDependencyGraph (g, Purpose::ForSwiftModule)) {
598+ break ;
575599 }
576- readFineGrainedDependencyGraph (g);
600+
601+ DidNotReadFineGrainedDependencies = false ;
577602 break ;
578603 }
579604
580605 default :
581606 // Unknown top-level block, possibly for use by a future version of the
582607 // module format.
583608 if (Cursor.SkipBlock ()) {
584- return false ;
609+ return true ;
585610 }
586611 break ;
587612 }
588613 }
589614
590- return false ;
615+ return DidNotReadFineGrainedDependencies ;
591616}
0 commit comments