diff options
author | Chuanqi Xu <yedeng.yd@linux.alibaba.com> | 2023-09-07 17:10:07 +0800 |
---|---|---|
committer | Chuanqi Xu <yedeng.yd@linux.alibaba.com> | 2023-09-07 17:13:16 +0800 |
commit | 869111ccf2d3916bf24a31bdb367d7e567483ff0 (patch) | |
tree | b58d9fcd080657ec57c3e774430b14be2aa00a3c /clang/lib | |
parent | 31ded495271e5869d619da851a351c9f6f05b2d4 (diff) | |
download | llvm-869111ccf2d3916bf24a31bdb367d7e567483ff0.zip llvm-869111ccf2d3916bf24a31bdb367d7e567483ff0.tar.gz llvm-869111ccf2d3916bf24a31bdb367d7e567483ff0.tar.bz2 |
[NFC] [C++20] [Modules] Refactor the warning to '-fmodule-file=<BMIPath>' for C++20 modules
Previous implementation of the warning to use `-fmodule-file=<BMIPath>`
for C++20 Modules is not straightforward and it is problematic in case
we read the BMIPath by writing tools based clang components. This patch
refactors it with a simple and direct style.
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Frontend/FrontendAction.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 15 |
3 files changed, 18 insertions, 13 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index e500675..49c1d8e 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -1717,7 +1717,8 @@ void CompilerInstance::createASTReader() { Listener->attachToASTReader(*TheASTReader); } -bool CompilerInstance::loadModuleFile(StringRef FileName) { +bool CompilerInstance::loadModuleFile( + StringRef FileName, serialization::ModuleFile *&LoadedModuleFile) { llvm::Timer Timer; if (FrontendTimerGroup) Timer.init("preloading." + FileName.str(), "Preloading " + FileName.str(), @@ -1743,7 +1744,8 @@ bool CompilerInstance::loadModuleFile(StringRef FileName) { // Try to load the module file. switch (TheASTReader->ReadAST( FileName, serialization::MK_ExplicitModule, SourceLocation(), - ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0)) { + ConfigMismatchIsRecoverable ? ASTReader::ARR_ConfigurationMismatch : 0, + &LoadedModuleFile)) { case ASTReader::Success: // We successfully loaded the module file; remember the set of provided // modules so that we don't try to load implicit modules for them. diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 2da25be..e016b94 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -1023,10 +1023,16 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, } // If we were asked to load any module files, do so now. - for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles) - if (!CI.loadModuleFile(ModuleFile)) + for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles) { + serialization::ModuleFile *Loaded = nullptr; + if (!CI.loadModuleFile(ModuleFile, Loaded)) return false; + if (Loaded && Loaded->StandardCXXModule) + CI.getDiagnostics().Report( + diag::warn_eagerly_load_for_standard_cplusplus_modules); + } + // If there is a layout overrides file, attach an external AST source that // provides the layouts from that file. if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() && diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index faeea66..8ece979 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -4311,10 +4311,10 @@ static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { } } -ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, - ModuleKind Type, +ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, - unsigned ClientLoadCapabilities) { + unsigned ClientLoadCapabilities, + ModuleFile **NewLoadedModuleFile) { llvm::TimeTraceScope scope("ReadAST", FileName); llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc); @@ -4344,6 +4344,9 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, return ReadResult; } + if (NewLoadedModuleFile && !Loaded.empty()) + *NewLoadedModuleFile = Loaded.back().Mod; + // Here comes stuff that we only do once the entire chain is loaded. Do *not* // remove modules from this point. Various fields are updated during reading // the AST block and removing the modules would result in dangling pointers. @@ -5709,12 +5712,6 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, if (DeserializationListener) DeserializationListener->ModuleRead(GlobalID, CurrentModule); - // If we're loading a module before we initialize the sema, it implies - // we're performing eagerly loading. - if (!getSema() && CurrentModule->isModulePurview() && - !getContext().getLangOpts().isCompilingModule()) - Diag(clang::diag::warn_eagerly_load_for_standard_cplusplus_modules); - SubmodulesLoaded[GlobalIndex] = CurrentModule; // Clear out data that will be replaced by what is in the module file. |