https://github.com/jansvoboda11 created https://github.com/llvm/llvm-project/pull/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. >From 4b0c9ddf692da1d144a7241852ba77d5f41b0774 Mon Sep 17 00:00:00 2001 From: Jan Svoboda <jan_svob...@apple.com> Date: Fri, 11 Apr 2025 10:04:12 -0700 Subject: [PATCH] [clang][frontend] Expose `CompilerInstance::cloneForModuleCompile()` This PR exposes `cloneForModuleCompile()` as a `CompilerInstance` member function. This will be eventually used in the dependency scanner to customize implicit module builds. --- .../include/clang/Frontend/CompilerInstance.h | 8 +++++ clang/lib/Frontend/CompilerInstance.cpp | 30 +++++++------------ 2 files changed, 19 insertions(+), 19 deletions(-) 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, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits