@@ -362,12 +362,7 @@ ModuleMap::ModuleMap(SourceManager &SourceMgr, DiagnosticsEngine &Diags,
362362 MMapLangOpts.LineComment = true ;
363363}
364364
365- ModuleMap::~ModuleMap () {
366- for (auto &M : Modules)
367- delete M.getValue ();
368- for (auto *M : ShadowModules)
369- delete M;
370- }
365+ ModuleMap::~ModuleMap () = default ;
371366
372367void ModuleMap::setTarget (const TargetInfo &Target) {
373368 assert ((!this ->Target || this ->Target == &Target) &&
@@ -831,6 +826,22 @@ Module *ModuleMap::findModule(StringRef Name) const {
831826 return nullptr ;
832827}
833828
829+ Module *ModuleMap::findOrInferSubmodule (Module *Parent, StringRef Name) {
830+ if (Module *SubM = Parent->findSubmodule (Name))
831+ return SubM;
832+ if (!Parent->InferSubmodules )
833+ return nullptr ;
834+ Module *Result = new (ModulesAlloc.Allocate ())
835+ Module (ModuleConstructorTag{}, Name, SourceLocation (), Parent, false ,
836+ Parent->InferExplicitSubmodules , 0 );
837+ Result->InferExplicitSubmodules = Parent->InferExplicitSubmodules ;
838+ Result->InferSubmodules = Parent->InferSubmodules ;
839+ Result->InferExportWildcard = Parent->InferExportWildcard ;
840+ if (Result->InferExportWildcard )
841+ Result->Exports .push_back (Module::ExportDecl (nullptr , true ));
842+ return Result;
843+ }
844+
834845Module *ModuleMap::lookupModuleUnqualified (StringRef Name,
835846 Module *Context) const {
836847 for (; Context; Context = Context->Parent ) {
@@ -857,8 +868,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
857868 return std::make_pair (Sub, false );
858869
859870 // Create a new module with this name.
860- Module *Result = new Module (Name, SourceLocation (), Parent, IsFramework,
861- IsExplicit, NumCreatedModules++);
871+ Module *Result = new (ModulesAlloc.Allocate ())
872+ Module (ModuleConstructorTag{}, Name, SourceLocation (), Parent,
873+ IsFramework, IsExplicit, NumCreatedModules++);
862874 if (!Parent) {
863875 if (LangOpts.CurrentModule == Name)
864876 SourceModule = Result;
@@ -870,8 +882,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
870882
871883Module *ModuleMap::createGlobalModuleFragmentForModuleUnit (SourceLocation Loc,
872884 Module *Parent) {
873- auto *Result = new Module (" <global>" , Loc, Parent, /* IsFramework*/ false ,
874- /* IsExplicit*/ true , NumCreatedModules++);
885+ auto *Result = new (ModulesAlloc.Allocate ()) Module (
886+ ModuleConstructorTag{}, " <global>" , Loc, Parent, /* IsFramework=*/ false ,
887+ /* IsExplicit=*/ true , NumCreatedModules++);
875888 Result->Kind = Module::ExplicitGlobalModuleFragment;
876889 // If the created module isn't owned by a parent, send it to PendingSubmodules
877890 // to wait for its parent.
@@ -888,35 +901,33 @@ ModuleMap::createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
888901 // Note: Here the `IsExplicit` parameter refers to the semantics in clang
889902 // modules. All the non-explicit submodules in clang modules will be exported
890903 // too. Here we simplify the implementation by using the concept.
891- auto *Result =
892- new Module (" <implicit global>" , Loc, Parent, /* IsFramework= */ false ,
893- /* IsExplicit=*/ false , NumCreatedModules++);
904+ auto *Result = new (ModulesAlloc. Allocate ())
905+ Module (ModuleConstructorTag{}, " <implicit global>" , Loc, Parent,
906+ /* IsFramework= */ false , /* IsExplicit=*/ false , NumCreatedModules++);
894907 Result->Kind = Module::ImplicitGlobalModuleFragment;
895908 return Result;
896909}
897910
898911Module *
899912ModuleMap::createPrivateModuleFragmentForInterfaceUnit (Module *Parent,
900913 SourceLocation Loc) {
901- auto *Result =
902- new Module ( " <private>" , Loc, Parent, /* IsFramework*/ false ,
903- /* IsExplicit*/ true , NumCreatedModules++);
914+ auto *Result = new (ModulesAlloc. Allocate ()) Module (
915+ ModuleConstructorTag{}, " <private>" , Loc, Parent, /* IsFramework= */ false ,
916+ /* IsExplicit= */ true , NumCreatedModules++);
904917 Result->Kind = Module::PrivateModuleFragment;
905918 return Result;
906919}
907920
908921Module *ModuleMap::createModuleUnitWithKind (SourceLocation Loc, StringRef Name,
909922 Module::ModuleKind Kind) {
910- auto *Result =
911- new Module (Name, Loc, nullptr , /* IsFramework*/ false ,
912- /* IsExplicit*/ false , NumCreatedModules++);
923+ auto *Result = new (ModulesAlloc. Allocate ())
924+ Module (ModuleConstructorTag{}, Name, Loc, nullptr , /* IsFramework= */ false ,
925+ /* IsExplicit= */ false , NumCreatedModules++);
913926 Result->Kind = Kind;
914927
915928 // Reparent any current global module fragment as a submodule of this module.
916- for (auto &Submodule : PendingSubmodules) {
929+ for (auto &Submodule : PendingSubmodules)
917930 Submodule->setParent (Result);
918- Submodule.release (); // now owned by parent
919- }
920931 PendingSubmodules.clear ();
921932 return Result;
922933}
@@ -968,8 +979,9 @@ Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name,
968979 assert (LangOpts.CurrentModule == Name && " module name mismatch" );
969980 assert (!Modules[Name] && " redefining existing module" );
970981
971- auto *Result = new Module (Name, Loc, nullptr , /* IsFramework*/ false ,
972- /* IsExplicit*/ false , NumCreatedModules++);
982+ auto *Result = new (ModulesAlloc.Allocate ())
983+ Module (ModuleConstructorTag{}, Name, Loc, nullptr , /* IsFramework=*/ false ,
984+ /* IsExplicit=*/ false , NumCreatedModules++);
973985 Result->Kind = Module::ModuleHeaderUnit;
974986 Modules[Name] = SourceModule = Result;
975987 addHeader (Result, H, NormalHeader);
@@ -1082,9 +1094,9 @@ Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
10821094 if (!UmbrellaHeader)
10831095 return nullptr ;
10841096
1085- Module *Result = new Module (ModuleName, SourceLocation (), Parent,
1086- /* IsFramework= */ true , /* IsExplicit= */ false ,
1087- NumCreatedModules++);
1097+ Module *Result = new (ModulesAlloc. Allocate ())
1098+ Module (ModuleConstructorTag{}, ModuleName, SourceLocation (), Parent ,
1099+ /* IsFramework= */ true , /* IsExplicit= */ false , NumCreatedModules++);
10881100 InferredModuleAllowedBy[Result] = ModuleMapFID;
10891101 Result->IsInferred = true ;
10901102 if (!Parent) {
@@ -1173,9 +1185,9 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
11731185 Module *ShadowingModule) {
11741186
11751187 // Create a new module with this name.
1176- Module *Result =
1177- new Module (Name, SourceLocation (), /* Parent=*/ nullptr , IsFramework ,
1178- /* IsExplicit=*/ false , NumCreatedModules++);
1188+ Module *Result = new (ModulesAlloc. Allocate ())
1189+ Module (ModuleConstructorTag{}, Name, SourceLocation (), /* Parent=*/ nullptr ,
1190+ IsFramework, /* IsExplicit=*/ false , NumCreatedModules++);
11791191 Result->ShadowingModule = ShadowingModule;
11801192 Result->markUnavailable (/* Unimportable*/ true );
11811193 ModuleScopeIDs[Result] = CurrentModuleScopeID;
0 commit comments