-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][frontend] Expose CompilerInstance::cloneForModuleCompile()
#135405
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This PR exposes `cloneForModuleCompile()` as a `CompilerInstance` member function. This will be eventually used in the dependency scanner to customize implicit module builds.
@llvm/pr-subscribers-clang Author: Jan Svoboda (jansvoboda11) ChangesThis PR exposes Full diff: https://github.com/llvm/llvm-project/pull/135405.diff 2 Files Affected:
diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h
index 4960d40ca7c37..66f56932c51a3 100644
--- a/clang/include/clang/Frontend/CompilerInstance.h
+++ b/clang/include/clang/Frontend/CompilerInstance.h
@@ -871,6 +871,14 @@ class CompilerInstance : public ModuleLoader {
bool IsInclusionDirective);
public:
+ /// Creates a new \c CompilerInstance for compiling a module.
+ ///
+ /// This takes care of creating appropriate \c FrontendInputFile for
+ /// public/private frameworks, inferred modules and such.
+ std::unique_ptr<CompilerInstance>
+ cloneForModuleCompile(SourceLocation ImportLoc, Module *Module,
+ StringRef ModuleFileName);
+
ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path,
Module::NameVisibilityKind Visibility,
bool IsInclusionDirective) override;
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 55265af90f917..eb138de9d20cc 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1335,23 +1335,15 @@ static OptionalFileEntryRef getPublicModuleMap(FileEntryRef File,
return FileMgr.getOptionalFileRef(PublicFilename);
}
-/// Creates a \c CompilerInstance for compiling a module.
-///
-/// This takes care of creating appropriate \c FrontendInputFile for
-/// public/private frameworks, inferred modules and such.
-static std::unique_ptr<CompilerInstance>
-createCompilerInstanceForModuleCompile(CompilerInstance &ImportingInstance,
- SourceLocation ImportLoc, Module *Module,
- StringRef ModuleFileName) {
+std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
+ SourceLocation ImportLoc, Module *Module, StringRef ModuleFileName) {
StringRef ModuleName = Module->getTopLevelModuleName();
- InputKind IK(getLanguageFromOptions(ImportingInstance.getLangOpts()),
- InputKind::ModuleMap);
+ InputKind IK(getLanguageFromOptions(getLangOpts()), InputKind::ModuleMap);
// Get or create the module map that we'll use to build this module.
- ModuleMap &ModMap =
- ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap();
- SourceManager &SourceMgr = ImportingInstance.getSourceManager();
+ ModuleMap &ModMap = getPreprocessor().getHeaderSearchInfo().getModuleMap();
+ SourceManager &SourceMgr = getSourceManager();
if (FileID ModuleMapFID = ModMap.getContainingModuleMapFileID(Module);
ModuleMapFID.isValid()) {
@@ -1372,8 +1364,8 @@ createCompilerInstanceForModuleCompile(CompilerInstance &ImportingInstance,
// Canonicalize compilation to start with the public module map. This is
// vital for submodules declarations in the private module maps to be
// correctly parsed when depending on a top level module in the public one.
- if (OptionalFileEntryRef PublicMMFile = getPublicModuleMap(
- *ModuleMapFile, ImportingInstance.getFileManager()))
+ if (OptionalFileEntryRef PublicMMFile =
+ getPublicModuleMap(*ModuleMapFile, getFileManager()))
ModuleMapFile = PublicMMFile;
StringRef ModuleMapFilePath = ModuleMapFile->getNameAsRequested();
@@ -1387,7 +1379,7 @@ createCompilerInstanceForModuleCompile(CompilerInstance &ImportingInstance,
// Use the module map where this module resides.
return createCompilerInstanceForModuleCompileImpl(
- ImportingInstance, ImportLoc, ModuleName,
+ *this, ImportLoc, ModuleName,
FrontendInputFile(ModuleMapFilePath, IK, IsSystem),
ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName);
}
@@ -1404,7 +1396,7 @@ createCompilerInstanceForModuleCompile(CompilerInstance &ImportingInstance,
Module->print(OS);
auto Instance = createCompilerInstanceForModuleCompileImpl(
- ImportingInstance, ImportLoc, ModuleName,
+ *this, ImportLoc, ModuleName,
FrontendInputFile(FakeModuleMapFile, IK, +Module->IsSystem),
ModMap.getModuleMapFileForUniquing(Module)->getName(), ModuleFileName);
@@ -1465,8 +1457,8 @@ static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance,
SourceLocation ModuleNameLoc,
Module *Module,
StringRef ModuleFileName) {
- auto Instance = createCompilerInstanceForModuleCompile(
- ImportingInstance, ModuleNameLoc, Module, ModuleFileName);
+ auto Instance = ImportingInstance.cloneForModuleCompile(ModuleNameLoc, Module,
+ ModuleFileName);
if (!compileModule(ImportingInstance, ModuleNameLoc,
Module->getTopLevelModuleName(), ModuleFileName,
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/186/builds/8138 Here is the relevant piece of the build log for the reference
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/52/builds/7519 Here is the relevant piece of the build log for the reference
|
…lvm#135405) This PR exposes `cloneForModuleCompile()` as a public `CompilerInstance` member function. This will be eventually used in the dependency scanner to customize implicit module builds.
This PR exposes
cloneForModuleCompile()
as a publicCompilerInstance
member function. This will be eventually used in the dependency scanner to customize implicit module builds.