@@ -1150,19 +1150,11 @@ static Language getLanguageFromOptions(const LangOptions &LangOpts) {
11501150  return  LangOpts.CPlusPlus  ? Language::CXX : Language::C;
11511151}
11521152
1153- // / Creates a \c CompilerInstance for compiling a module.
1154- // /
1155- // / This expects a properly initialized \c FrontendInputFile.
1156- static  std::unique_ptr<CompilerInstance>
1157- createCompilerInstanceForModuleCompileImpl (CompilerInstance &ImportingInstance,
1158-                                            SourceLocation ImportLoc,
1159-                                            StringRef ModuleName,
1160-                                            FrontendInputFile Input,
1161-                                            StringRef OriginalModuleMapFile,
1162-                                            StringRef ModuleFileName) {
1153+ std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompileImpl (
1154+     SourceLocation ImportLoc, StringRef ModuleName, FrontendInputFile Input,
1155+     StringRef OriginalModuleMapFile, StringRef ModuleFileName) {
11631156  //  Construct a compiler invocation for creating this module.
1164-   auto  Invocation =
1165-       std::make_shared<CompilerInvocation>(ImportingInstance.getInvocation ());
1157+   auto  Invocation = std::make_shared<CompilerInvocation>(getInvocation ());
11661158
11671159  PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts ();
11681160
@@ -1182,7 +1174,7 @@ createCompilerInstanceForModuleCompileImpl(CompilerInstance &ImportingInstance,
11821174
11831175  //  If the original compiler invocation had -fmodule-name, pass it through.
11841176  Invocation->getLangOpts ().ModuleName  =
1185-       ImportingInstance. getInvocation ().getLangOpts ().ModuleName ;
1177+       getInvocation ().getLangOpts ().ModuleName ;
11861178
11871179  //  Note the name of the module we're building.
11881180  Invocation->getLangOpts ().CurrentModule  = std::string (ModuleName);
@@ -1206,82 +1198,70 @@ createCompilerInstanceForModuleCompileImpl(CompilerInstance &ImportingInstance,
12061198  DiagnosticOptions &DiagOpts = Invocation->getDiagnosticOpts ();
12071199
12081200  DiagOpts.VerifyDiagnostics  = 0 ;
1209-   assert (ImportingInstance. getInvocation ().getModuleHash () ==
1210-          Invocation-> getModuleHash () &&  " Module hash mismatch!" 
1201+   assert (getInvocation ().getModuleHash () == Invocation-> getModuleHash () && 
1202+          " Module hash mismatch!" 
12111203
12121204  //  Construct a compiler instance that will be used to actually create the
12131205  //  module.  Since we're sharing an in-memory module cache,
12141206  //  CompilerInstance::CompilerInstance is responsible for finalizing the
12151207  //  buffers to prevent use-after-frees.
12161208  auto  InstancePtr = std::make_unique<CompilerInstance>(
1217-       ImportingInstance.getPCHContainerOperations (),
1218-       &ImportingInstance.getModuleCache ());
1209+       getPCHContainerOperations (), &getModuleCache ());
12191210  auto  &Instance = *InstancePtr;
12201211
12211212  auto  &Inv = *Invocation;
12221213  Instance.setInvocation (std::move (Invocation));
12231214
12241215  Instance.createDiagnostics (
1225-       ImportingInstance. getVirtualFileSystem (),
1226-       new  ForwardingDiagnosticConsumer (ImportingInstance. getDiagnosticClient ()),
1216+       getVirtualFileSystem (),
1217+       new  ForwardingDiagnosticConsumer (getDiagnosticClient ()),
12271218      /* ShouldOwnClient=*/ true );
12281219
12291220  if  (llvm::is_contained (DiagOpts.SystemHeaderWarningsModules , ModuleName))
12301221    Instance.getDiagnostics ().setSuppressSystemWarnings (false );
12311222
12321223  if  (FrontendOpts.ModulesShareFileManager ) {
1233-     Instance.setFileManager (&ImportingInstance. getFileManager ());
1224+     Instance.setFileManager (&getFileManager ());
12341225  } else  {
1235-     Instance.createFileManager (&ImportingInstance. getVirtualFileSystem ());
1226+     Instance.createFileManager (&getVirtualFileSystem ());
12361227  }
12371228  Instance.createSourceManager (Instance.getFileManager ());
12381229  SourceManager &SourceMgr = Instance.getSourceManager ();
12391230
12401231  //  Note that this module is part of the module build stack, so that we
12411232  //  can detect cycles in the module graph.
1242-   SourceMgr.setModuleBuildStack (
1243-     ImportingInstance.getSourceManager ().getModuleBuildStack ());
1233+   SourceMgr.setModuleBuildStack (getSourceManager ().getModuleBuildStack ());
12441234  SourceMgr.pushModuleBuildStack (ModuleName,
1245-     FullSourceLoc (ImportLoc, ImportingInstance. getSourceManager ()));
1235+                                   FullSourceLoc (ImportLoc, getSourceManager ()));
12461236
1247-   //  Make sure that the failed-module structure has been allocated in
1248-   //  the importing instance, and propagate the pointer to the newly-created
1249-   //  instance.
1250-   if  (!ImportingInstance.hasFailedModulesSet ())
1251-     ImportingInstance.createFailedModulesSet ();
1252-   Instance.setFailedModulesSet (ImportingInstance.getFailedModulesSetPtr ());
1237+   //  Make a copy for the new instance.
1238+   Instance.FailedModules  = FailedModules;
12531239
12541240  //  If we're collecting module dependencies, we need to share a collector
12551241  //  between all of the module CompilerInstances. Other than that, we don't
12561242  //  want to produce any dependency output from the module build.
1257-   Instance.setModuleDepCollector (ImportingInstance. getModuleDepCollector ());
1243+   Instance.setModuleDepCollector (getModuleDepCollector ());
12581244  Inv.getDependencyOutputOpts () = DependencyOutputOptions ();
12591245
12601246  return  InstancePtr;
12611247}
12621248
1263- // / Compile a module file for the given module, using the options
1264- // / provided by the importing compiler instance. Returns true if the module
1265- // / was built without errors.
1266- static  bool  compileModule (CompilerInstance &ImportingInstance,
1267-                           SourceLocation ImportLoc, StringRef ModuleName,
1268-                           StringRef ModuleFileName,
1269-                           CompilerInstance &Instance) {
1249+ bool  CompilerInstance::compileModule (SourceLocation ImportLoc,
1250+                                      StringRef ModuleName,
1251+                                      StringRef ModuleFileName,
1252+                                      CompilerInstance &Instance) {
12701253  llvm::TimeTraceScope TimeScope (" Module Compile" 
12711254
12721255  //  Never compile a module that's already finalized - this would cause the
12731256  //  existing module to be freed, causing crashes if it is later referenced
1274-   if  (ImportingInstance.getModuleCache ().getInMemoryModuleCache ().isPCMFinal (
1275-           ModuleFileName)) {
1276-     ImportingInstance.getDiagnostics ().Report (
1277-         ImportLoc, diag::err_module_rebuild_finalized)
1257+   if  (getModuleCache ().getInMemoryModuleCache ().isPCMFinal (ModuleFileName)) {
1258+     getDiagnostics ().Report (ImportLoc, diag::err_module_rebuild_finalized)
12781259        << ModuleName;
12791260    return  false ;
12801261  }
12811262
1282-   ImportingInstance.getDiagnostics ().Report (ImportLoc,
1283-                                             diag::remark_module_build)
1284-     << ModuleName << ModuleFileName;
1263+   getDiagnostics ().Report (ImportLoc, diag::remark_module_build)
1264+       << ModuleName << ModuleFileName;
12851265
12861266  //  Execute the action to actually build the module in-place. Use a separate
12871267  //  thread so that we get a stack large enough.
@@ -1292,13 +1272,15 @@ static bool compileModule(CompilerInstance &ImportingInstance,
12921272      },
12931273      DesiredStackSize);
12941274
1295-   ImportingInstance.getDiagnostics ().Report (ImportLoc,
1296-                                             diag::remark_module_build_done)
1297-     << ModuleName;
1275+   getDiagnostics ().Report (ImportLoc, diag::remark_module_build_done)
1276+       << ModuleName;
12981277
12991278  //  Propagate the statistics to the parent FileManager.
1300-   if  (!ImportingInstance.getFrontendOpts ().ModulesShareFileManager )
1301-     ImportingInstance.getFileManager ().AddStats (Instance.getFileManager ());
1279+   if  (!getFrontendOpts ().ModulesShareFileManager )
1280+     getFileManager ().AddStats (Instance.getFileManager ());
1281+ 
1282+   //  Propagate the failed modules to the parent instance.
1283+   FailedModules = std::move (Instance.FailedModules );
13021284
13031285  if  (Crashed) {
13041286    //  Clear the ASTConsumer if it hasn't been already, in case it owns streams
@@ -1312,8 +1294,8 @@ static bool compileModule(CompilerInstance &ImportingInstance,
13121294
13131295  //  We've rebuilt a module. If we're allowed to generate or update the global
13141296  //  module index, record that fact in the importing compiler instance.
1315-   if  (ImportingInstance. getFrontendOpts ().GenerateGlobalModuleIndex ) {
1316-     ImportingInstance. setBuildGlobalModuleIndex (true );
1297+   if  (getFrontendOpts ().GenerateGlobalModuleIndex ) {
1298+     setBuildGlobalModuleIndex (true );
13171299  }
13181300
13191301  //  If \p AllowPCMWithCompilerErrors is set return 'success' even if errors
@@ -1378,8 +1360,8 @@ std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
13781360    bool  IsSystem = isSystem (SLoc.getFile ().getFileCharacteristic ());
13791361
13801362    //  Use the module map where this module resides.
1381-     return  createCompilerInstanceForModuleCompileImpl (
1382-         * this ,  ImportLoc, ModuleName,
1363+     return  cloneForModuleCompileImpl (
1364+         ImportLoc, ModuleName,
13831365        FrontendInputFile (ModuleMapFilePath, IK, IsSystem),
13841366        ModMap.getModuleMapFileForUniquing (Module)->getName (), ModuleFileName);
13851367  }
@@ -1395,8 +1377,8 @@ std::unique_ptr<CompilerInstance> CompilerInstance::cloneForModuleCompile(
13951377  llvm::raw_string_ostream OS (InferredModuleMapContent);
13961378  Module->print (OS);
13971379
1398-   auto  Instance = createCompilerInstanceForModuleCompileImpl (
1399-       * this ,  ImportLoc, ModuleName,
1380+   auto  Instance = cloneForModuleCompileImpl (
1381+       ImportLoc, ModuleName,
14001382      FrontendInputFile (FakeModuleMapFile, IK, +Module->IsSystem ),
14011383      ModMap.getModuleMapFileForUniquing (Module)->getName (), ModuleFileName);
14021384
@@ -1460,9 +1442,9 @@ static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance,
14601442  auto  Instance = ImportingInstance.cloneForModuleCompile (ModuleNameLoc, Module,
14611443                                                          ModuleFileName);
14621444
1463-   if  (!compileModule (ImportingInstance,  ModuleNameLoc,
1464-                      Module->getTopLevelModuleName (), ModuleFileName ,
1465-                      *Instance)) {
1445+   if  (!ImportingInstance. compileModule (ModuleNameLoc,
1446+                                         Module->getTopLevelModuleName (),
1447+                                        ModuleFileName,  *Instance)) {
14661448    ImportingInstance.getDiagnostics ().Report (ModuleNameLoc,
14671449                                              diag::err_module_not_built)
14681450        << Module->Name  << SourceRange (ImportLoc, ModuleNameLoc);
@@ -2002,7 +1984,7 @@ ModuleLoadResult CompilerInstance::findOrCompileModuleAndReadAST(
20021984  }
20031985
20041986  //  Check whether we have already attempted to build this module (but failed).
2005-   if  (FailedModules && FailedModules-> hasAlreadyFailed (ModuleName)) {
1987+   if  (FailedModules. contains (ModuleName)) {
20061988    getDiagnostics ().Report (ModuleNameLoc, diag::err_module_not_built)
20071989        << ModuleName << SourceRange (ImportLoc, ModuleNameLoc);
20081990    return  nullptr ;
@@ -2013,8 +1995,7 @@ ModuleLoadResult CompilerInstance::findOrCompileModuleAndReadAST(
20131995                               ModuleFilename)) {
20141996    assert (getDiagnostics ().hasErrorOccurred () &&
20151997           " undiagnosed error in compileModuleAndReadAST" 
2016-     if  (FailedModules)
2017-       FailedModules->addFailed (ModuleName);
1998+     FailedModules.insert (ModuleName);
20181999    return  nullptr ;
20192000  }
20202001
@@ -2238,8 +2219,8 @@ void CompilerInstance::createModuleFromSource(SourceLocation ImportLoc,
22382219
22392220  std::string NullTerminatedSource (Source.str ());
22402221
2241-   auto  Other = createCompilerInstanceForModuleCompileImpl ( 
2242-       * this , ImportLoc, ModuleName, Input,  StringRef (), ModuleFileName);
2222+   auto  Other = cloneForModuleCompileImpl (ImportLoc, ModuleName, Input, 
2223+                                           StringRef (), ModuleFileName);
22432224
22442225  //  Create a virtual file containing our desired source.
22452226  //  FIXME: We shouldn't need to do this.
@@ -2252,8 +2233,7 @@ void CompilerInstance::createModuleFromSource(SourceLocation ImportLoc,
22522233  Other->DeleteBuiltModules  = false ;
22532234
22542235  //  Build the module, inheriting any modules that we've built locally.
2255-   bool  Success =
2256-       compileModule (*this , ImportLoc, ModuleName, ModuleFileName, *Other);
2236+   bool  Success = compileModule (ImportLoc, ModuleName, ModuleFileName, *Other);
22572237
22582238  BuiltModules = std::move (Other->BuiltModules );
22592239
0 commit comments