@@ -2266,8 +2266,15 @@ bool ASTReader::shouldDisableValidationForFile(
2266
2266
return false ;
2267
2267
}
2268
2268
2269
- ASTReader::InputFileInfo
2270
- ASTReader::readInputFileInfo (ModuleFile &F, unsigned ID) {
2269
+ InputFileInfo ASTReader::getInputFileInfo (ModuleFile &F, unsigned ID) {
2270
+ // If this ID is bogus, just return an empty input file.
2271
+ if (ID == 0 || ID > F.InputFileInfosLoaded .size ())
2272
+ return InputFileInfo ();
2273
+
2274
+ // If we've already loaded this input file, return it.
2275
+ if (!F.InputFileInfosLoaded [ID - 1 ].Filename .empty ())
2276
+ return F.InputFileInfosLoaded [ID - 1 ];
2277
+
2271
2278
// Go find this input file.
2272
2279
BitstreamCursor &Cursor = F.InputFilesCursor ;
2273
2280
SavedStreamPosition SavedPosition (Cursor);
@@ -2320,6 +2327,9 @@ ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2320
2327
}
2321
2328
R.ContentHash = (static_cast <uint64_t >(Record[1 ]) << 32 ) |
2322
2329
static_cast <uint64_t >(Record[0 ]);
2330
+
2331
+ // Note that we've loaded this input file info.
2332
+ F.InputFileInfosLoaded [ID - 1 ] = R;
2323
2333
return R;
2324
2334
}
2325
2335
@@ -2344,7 +2354,7 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2344
2354
consumeError (std::move (Err));
2345
2355
}
2346
2356
2347
- InputFileInfo FI = readInputFileInfo (F, ID);
2357
+ InputFileInfo FI = getInputFileInfo (F, ID);
2348
2358
off_t StoredSize = FI.StoredSize ;
2349
2359
time_t StoredTime = FI.StoredTime ;
2350
2360
bool Overridden = FI.Overridden ;
@@ -2691,7 +2701,7 @@ ASTReader::ReadControlBlock(ModuleFile &F,
2691
2701
: NumUserInputs;
2692
2702
for (unsigned I = 0 ; I < N; ++I) {
2693
2703
bool IsSystem = I >= NumUserInputs;
2694
- InputFileInfo FI = readInputFileInfo (F, I+ 1 );
2704
+ InputFileInfo FI = getInputFileInfo (F, I + 1 );
2695
2705
Listener->visitInputFile (FI.Filename , IsSystem, FI.Overridden ,
2696
2706
F.Kind == MK_ExplicitModule ||
2697
2707
F.Kind == MK_PrebuiltModule);
@@ -2968,6 +2978,7 @@ ASTReader::ReadControlBlock(ModuleFile &F,
2968
2978
F.InputFileOffsets =
2969
2979
(const llvm::support::unaligned_uint64_t *)Blob.data ();
2970
2980
F.InputFilesLoaded .resize (NumInputs);
2981
+ F.InputFileInfosLoaded .resize (NumInputs);
2971
2982
F.NumUserInputFiles = NumUserInputs;
2972
2983
break ;
2973
2984
}
@@ -2983,7 +2994,7 @@ void ASTReader::readIncludedFiles(ModuleFile &F, StringRef Blob,
2983
2994
2984
2995
for (unsigned I = 0 ; I < FileCount; ++I) {
2985
2996
size_t ID = endian::readNext<uint32_t , little, unaligned>(D);
2986
- InputFileInfo IFI = readInputFileInfo (F, ID);
2997
+ InputFileInfo IFI = getInputFileInfo (F, ID);
2987
2998
if (llvm::ErrorOr<const FileEntry *> File =
2988
2999
PP.getFileManager ().getFile (IFI.Filename ))
2989
3000
PP.getIncludedFiles ().insert (*File);
@@ -9217,9 +9228,8 @@ void ASTReader::visitTopLevelModuleMaps(
9217
9228
llvm::function_ref<void (FileEntryRef FE)> Visitor) {
9218
9229
unsigned NumInputs = MF.InputFilesLoaded .size ();
9219
9230
for (unsigned I = 0 ; I < NumInputs; ++I) {
9220
- InputFileInfo IFI = readInputFileInfo (MF, I + 1 );
9231
+ InputFileInfo IFI = getInputFileInfo (MF, I + 1 );
9221
9232
if (IFI.TopLevelModuleMap )
9222
- // FIXME: This unnecessarily re-reads the InputFileInfo.
9223
9233
if (auto FE = getInputFile (MF, I + 1 ).getFile ())
9224
9234
Visitor (*FE);
9225
9235
}
0 commit comments