@@ -2926,6 +2926,8 @@ static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2926
2926
case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2927
2927
case ASTReader::ConfigurationMismatch:
2928
2928
return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2929
+ case ASTReader::ModuleMismatch:
2930
+ return true;
2929
2931
case ASTReader::HadErrors: return true;
2930
2932
case ASTReader::Success: return false;
2931
2933
}
@@ -3020,11 +3022,10 @@ ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
3020
3022
}
3021
3023
}
3022
3024
3023
- ASTReader::ASTReadResult
3024
- ASTReader::ReadControlBlock(ModuleFile &F,
3025
- SmallVectorImpl<ImportedModule> &Loaded,
3026
- const ModuleFile *ImportedBy,
3027
- unsigned ClientLoadCapabilities) {
3025
+ ASTReader::ASTReadResult ASTReader::ReadControlBlock(
3026
+ ModuleFile &F, SmallVectorImpl<ImportedModule> &Loaded,
3027
+ const ModuleFile *ImportedBy, StringRef ExpectedModuleName,
3028
+ unsigned ClientLoadCapabilities) {
3028
3029
BitstreamCursor &Stream = F.Stream;
3029
3030
3030
3031
if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
@@ -3315,7 +3316,7 @@ ASTReader::ReadControlBlock(ModuleFile &F,
3315
3316
3316
3317
// Load the AST file.
3317
3318
auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3318
- Loaded, StoredSize, StoredModTime,
3319
+ Loaded, StoredSize, StoredModTime, ImportedName,
3319
3320
StoredSignature, Capabilities);
3320
3321
3321
3322
// If we diagnosed a problem, produce a backtrace.
@@ -3338,7 +3339,10 @@ ASTReader::ReadControlBlock(ModuleFile &F,
3338
3339
case OutOfDate: return OutOfDate;
3339
3340
case VersionMismatch: return VersionMismatch;
3340
3341
case ConfigurationMismatch: return ConfigurationMismatch;
3341
- case HadErrors: return HadErrors;
3342
+ case ModuleMismatch:
3343
+ return ModuleMismatch;
3344
+ case HadErrors:
3345
+ return HadErrors;
3342
3346
case Success: break;
3343
3347
}
3344
3348
break;
@@ -3363,6 +3367,14 @@ ASTReader::ReadControlBlock(ModuleFile &F,
3363
3367
if (Listener)
3364
3368
Listener->ReadModuleName(F.ModuleName);
3365
3369
3370
+ // Return if the AST unexpectedly contains a different module
3371
+ if (F.Kind == MK_PrebuiltModule && !ExpectedModuleName.empty() &&
3372
+ F.ModuleName != ExpectedModuleName) {
3373
+ Diag(diag::err_module_mismatch)
3374
+ << ExpectedModuleName << F.FileName << F.ModuleName;
3375
+ return ASTReadResult::ModuleMismatch;
3376
+ }
3377
+
3366
3378
// Validate the AST as soon as we have a name so we can exit early on
3367
3379
// failure.
3368
3380
if (ASTReadResult Result = readUnhashedControlBlockOnce())
@@ -4684,6 +4696,15 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type,
4684
4696
SourceLocation ImportLoc,
4685
4697
unsigned ClientLoadCapabilities,
4686
4698
ModuleFile **NewLoadedModuleFile) {
4699
+ return ReadAST(FileName, Type, ImportLoc, ClientLoadCapabilities, "",
4700
+ NewLoadedModuleFile);
4701
+ }
4702
+
4703
+ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type,
4704
+ SourceLocation ImportLoc,
4705
+ unsigned ClientLoadCapabilities,
4706
+ StringRef ExpectedModuleName,
4707
+ ModuleFile **NewLoadedModuleFile) {
4687
4708
llvm::TimeTraceScope scope("ReadAST", FileName);
4688
4709
4689
4710
llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
@@ -4702,8 +4723,8 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type,
4702
4723
SmallVector<ImportedModule, 4> Loaded;
4703
4724
if (ASTReadResult ReadResult =
4704
4725
ReadASTCore(FileName, Type, ImportLoc,
4705
- /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature() ,
4706
- ClientLoadCapabilities)) {
4726
+ /*ImportedBy=*/nullptr, Loaded, 0, 0, ExpectedModuleName ,
4727
+ ASTFileSignature(), ClientLoadCapabilities)) {
4707
4728
ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4708
4729
4709
4730
// If we find that any modules are unusable, the global index is going
@@ -4954,25 +4975,26 @@ static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4954
4975
llvm_unreachable("unknown module kind");
4955
4976
}
4956
4977
4957
- ASTReader::ASTReadResult
4958
- ASTReader::ReadASTCore(StringRef FileName,
4959
- ModuleKind Type,
4960
- SourceLocation ImportLoc,
4961
- ModuleFile *ImportedBy,
4962
- SmallVectorImpl<ImportedModule> &Loaded,
4963
- off_t ExpectedSize, time_t ExpectedModTime,
4964
- ASTFileSignature ExpectedSignature,
4965
- unsigned ClientLoadCapabilities) {
4978
+ ASTReader::ASTReadResult ASTReader::ReadASTCore(
4979
+ StringRef FileName, ModuleKind Type, SourceLocation ImportLoc,
4980
+ ModuleFile *ImportedBy, SmallVectorImpl<ImportedModule> &Loaded,
4981
+ off_t ExpectedSize, time_t ExpectedModTime, StringRef ExpectedModuleName,
4982
+ ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities) {
4966
4983
ModuleFile *M;
4967
4984
std::string ErrorStr;
4968
- ModuleManager::AddModuleResult AddResult
4969
- = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4970
- getGeneration(), ExpectedSize, ExpectedModTime,
4971
- ExpectedSignature, readASTFileSignature,
4972
- M, ErrorStr);
4985
+ ModuleManager::AddModuleResult AddResult = ModuleMgr.addModule(
4986
+ FileName, Type, ImportLoc, ImportedBy, getGeneration(), ExpectedSize,
4987
+ ExpectedModTime, ExpectedSignature, readASTFileSignature, M, ErrorStr);
4973
4988
4974
4989
switch (AddResult) {
4975
4990
case ModuleManager::AlreadyLoaded:
4991
+ // Return if the AST unexpectedly contains a different module
4992
+ if (Type == MK_PrebuiltModule && !ExpectedModuleName.empty() &&
4993
+ M->ModuleName != ExpectedModuleName) {
4994
+ Diag(diag::err_module_mismatch)
4995
+ << ExpectedModuleName << FileName << M->ModuleName;
4996
+ return ASTReadResult::ModuleMismatch;
4997
+ }
4976
4998
Diag(diag::remark_module_import)
4977
4999
<< M->ModuleName << M->FileName << (ImportedBy ? true : false)
4978
5000
<< (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
@@ -5053,7 +5075,8 @@ ASTReader::ReadASTCore(StringRef FileName,
5053
5075
switch (Entry.ID) {
5054
5076
case CONTROL_BLOCK_ID:
5055
5077
HaveReadControlBlock = true;
5056
- switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5078
+ switch (ReadControlBlock(F, Loaded, ImportedBy, ExpectedModuleName,
5079
+ ClientLoadCapabilities)) {
5057
5080
case Success:
5058
5081
// Check that we didn't try to load a non-module AST file as a module.
5059
5082
//
@@ -5075,6 +5098,8 @@ ASTReader::ReadASTCore(StringRef FileName,
5075
5098
case OutOfDate: return OutOfDate;
5076
5099
case VersionMismatch: return VersionMismatch;
5077
5100
case ConfigurationMismatch: return ConfigurationMismatch;
5101
+ case ModuleMismatch:
5102
+ return ModuleMismatch;
5078
5103
case HadErrors: return HadErrors;
5079
5104
}
5080
5105
break;
0 commit comments