@@ -2616,6 +2616,18 @@ bool ASTReader::shouldDisableValidationForFile(
26162616 return false ;
26172617}
26182618
2619+ namespace {
2620+
2621+ std::pair<StringRef, StringRef>
2622+ getUnresolvedInputFilenames (const ASTReader::RecordData &Record,
2623+ const StringRef InputBlob) {
2624+ uint16_t AsRequestedLength = Record[7 ];
2625+ return {InputBlob.substr (0 , AsRequestedLength),
2626+ InputBlob.substr (AsRequestedLength)};
2627+ }
2628+
2629+ } // namespace
2630+
26192631InputFileInfo ASTReader::getInputFileInfo (ModuleFile &F, unsigned ID) {
26202632 // If this ID is bogus, just return an empty input file.
26212633 if (ID == 0 || ID > F.InputFileInfosLoaded .size ())
@@ -2659,11 +2671,12 @@ InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
26592671 R.Transient = static_cast <bool >(Record[4 ]);
26602672 R.TopLevel = static_cast <bool >(Record[5 ]);
26612673 R.ModuleMap = static_cast <bool >(Record[6 ]);
2662- uint16_t AsRequestedLength = Record[7 ];
2663- R.UnresolvedImportedFilenameAsRequested = Blob.substr (0 , AsRequestedLength);
2664- R.UnresolvedImportedFilename = Blob.substr (AsRequestedLength);
2665- if (R.UnresolvedImportedFilename .empty ())
2666- R.UnresolvedImportedFilename = R.UnresolvedImportedFilenameAsRequested ;
2674+ auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2675+ getUnresolvedInputFilenames (Record, Blob);
2676+ R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2677+ R.UnresolvedImportedFilename = UnresolvedFilename.empty ()
2678+ ? UnresolvedFilenameAsRequested
2679+ : UnresolvedFilename;
26672680
26682681 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance ();
26692682 if (!MaybeEntry) // FIXME this drops errors on the floor.
@@ -5704,6 +5717,11 @@ bool ASTReader::readASTFileControlBlock(
57045717 bool DoneWithControlBlock = false ;
57055718 SmallString<0 > PathBuf;
57065719 PathBuf.reserve (256 );
5720+ // Additional path buffer to use when multiple paths need to be resolved.
5721+ // For example, when deserializing input files that contains a path that was
5722+ // resolved from a vfs overlay and an external location.
5723+ SmallString<0 > AdditionalPathBuf;
5724+ AdditionalPathBuf.reserve (256 );
57075725 while (!DoneWithControlBlock) {
57085726 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance ();
57095727 if (!MaybeEntry) {
@@ -5835,12 +5853,20 @@ bool ASTReader::readASTFileControlBlock(
58355853 break ;
58365854 case INPUT_FILE:
58375855 bool Overridden = static_cast <bool >(Record[3 ]);
5838- size_t FilenameLen = ModuleDir.size () + Record[7 ] + 1 ;
5839- auto Filename = ResolveImportedPath (PathBuf, Blob, ModuleDir);
5840- StringRef FilenameAsRequested = Filename->substr (0 , FilenameLen);
5841- StringRef ExternalFilename = Filename->substr (FilenameLen);
5856+ auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5857+ getUnresolvedInputFilenames (Record, Blob);
5858+ auto FilenameAsRequestedBuf = ResolveImportedPath (
5859+ PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
5860+ StringRef Filename;
5861+ if (UnresolvedFilename.empty ())
5862+ Filename = *FilenameAsRequestedBuf;
5863+ else {
5864+ auto FilenameBuf = ResolveImportedPath (
5865+ AdditionalPathBuf, UnresolvedFilename, ModuleDir);
5866+ Filename = *FilenameBuf;
5867+ }
58425868 shouldContinue = Listener.visitInputFile (
5843- FilenameAsRequested, ExternalFilename , isSystemFile, Overridden,
5869+ *FilenameAsRequestedBuf, Filename , isSystemFile, Overridden,
58445870 /* IsExplicitModule=*/ false );
58455871 break ;
58465872 }
0 commit comments