@@ -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) &&
@@ -840,6 +835,22 @@ Module *ModuleMap::findModule(StringRef Name) const {
840835 return nullptr ;
841836}
842837
838+ Module *ModuleMap::findOrInferSubmodule (Module *Parent, StringRef Name) {
839+ if (Module *SubM = Parent->findSubmodule (Name))
840+ return SubM;
841+ if (!Parent->InferSubmodules )
842+ return nullptr ;
843+ Module *Result = new (ModulesAlloc.Allocate ())
844+ Module (ModuleConstructorTag{}, Name, SourceLocation (), Parent, false ,
845+ Parent->InferExplicitSubmodules , 0 );
846+ Result->InferExplicitSubmodules = Parent->InferExplicitSubmodules ;
847+ Result->InferSubmodules = Parent->InferSubmodules ;
848+ Result->InferExportWildcard = Parent->InferExportWildcard ;
849+ if (Result->InferExportWildcard )
850+ Result->Exports .push_back (Module::ExportDecl (nullptr , true ));
851+ return Result;
852+ }
853+
843854Module *ModuleMap::lookupModuleUnqualified (StringRef Name,
844855 Module *Context) const {
845856 for (; Context; Context = Context->Parent ) {
@@ -866,8 +877,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
866877 return std::make_pair (Sub, false );
867878
868879 // Create a new module with this name.
869- Module *Result = new Module (Name, SourceLocation (), Parent, IsFramework,
870- IsExplicit, NumCreatedModules++);
880+ Module *Result = new (ModulesAlloc.Allocate ())
881+ Module (ModuleConstructorTag{}, Name, SourceLocation (), Parent,
882+ IsFramework, IsExplicit, NumCreatedModules++);
871883 if (!Parent) {
872884 if (LangOpts.CurrentModule == Name)
873885 SourceModule = Result;
@@ -879,8 +891,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
879891
880892Module *ModuleMap::createGlobalModuleFragmentForModuleUnit (SourceLocation Loc,
881893 Module *Parent) {
882- auto *Result = new Module (" <global>" , Loc, Parent, /* IsFramework*/ false ,
883- /* IsExplicit*/ true , NumCreatedModules++);
894+ auto *Result = new (ModulesAlloc.Allocate ()) Module (
895+ ModuleConstructorTag{}, " <global>" , Loc, Parent, /* IsFramework=*/ false ,
896+ /* IsExplicit=*/ true , NumCreatedModules++);
884897 Result->Kind = Module::ExplicitGlobalModuleFragment;
885898 // If the created module isn't owned by a parent, send it to PendingSubmodules
886899 // to wait for its parent.
@@ -897,35 +910,33 @@ ModuleMap::createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
897910 // Note: Here the `IsExplicit` parameter refers to the semantics in clang
898911 // modules. All the non-explicit submodules in clang modules will be exported
899912 // too. Here we simplify the implementation by using the concept.
900- auto *Result =
901- new Module (" <implicit global>" , Loc, Parent, /* IsFramework= */ false ,
902- /* IsExplicit=*/ false , NumCreatedModules++);
913+ auto *Result = new (ModulesAlloc. Allocate ())
914+ Module (ModuleConstructorTag{}, " <implicit global>" , Loc, Parent,
915+ /* IsFramework= */ false , /* IsExplicit=*/ false , NumCreatedModules++);
903916 Result->Kind = Module::ImplicitGlobalModuleFragment;
904917 return Result;
905918}
906919
907920Module *
908921ModuleMap::createPrivateModuleFragmentForInterfaceUnit (Module *Parent,
909922 SourceLocation Loc) {
910- auto *Result =
911- new Module ( " <private>" , Loc, Parent, /* IsFramework*/ false ,
912- /* IsExplicit*/ true , NumCreatedModules++);
923+ auto *Result = new (ModulesAlloc. Allocate ()) Module (
924+ ModuleConstructorTag{}, " <private>" , Loc, Parent, /* IsFramework= */ false ,
925+ /* IsExplicit= */ true , NumCreatedModules++);
913926 Result->Kind = Module::PrivateModuleFragment;
914927 return Result;
915928}
916929
917930Module *ModuleMap::createModuleUnitWithKind (SourceLocation Loc, StringRef Name,
918931 Module::ModuleKind Kind) {
919- auto *Result =
920- new Module (Name, Loc, nullptr , /* IsFramework*/ false ,
921- /* IsExplicit*/ false , NumCreatedModules++);
932+ auto *Result = new (ModulesAlloc. Allocate ())
933+ Module (ModuleConstructorTag{}, Name, Loc, nullptr , /* IsFramework= */ false ,
934+ /* IsExplicit= */ false , NumCreatedModules++);
922935 Result->Kind = Kind;
923936
924937 // Reparent any current global module fragment as a submodule of this module.
925- for (auto &Submodule : PendingSubmodules) {
938+ for (auto &Submodule : PendingSubmodules)
926939 Submodule->setParent (Result);
927- Submodule.release (); // now owned by parent
928- }
929940 PendingSubmodules.clear ();
930941 return Result;
931942}
@@ -977,8 +988,9 @@ Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name,
977988 assert (LangOpts.CurrentModule == Name && " module name mismatch" );
978989 assert (!Modules[Name] && " redefining existing module" );
979990
980- auto *Result = new Module (Name, Loc, nullptr , /* IsFramework*/ false ,
981- /* IsExplicit*/ false , NumCreatedModules++);
991+ auto *Result = new (ModulesAlloc.Allocate ())
992+ Module (ModuleConstructorTag{}, Name, Loc, nullptr , /* IsFramework=*/ false ,
993+ /* IsExplicit=*/ false , NumCreatedModules++);
982994 Result->Kind = Module::ModuleHeaderUnit;
983995 Modules[Name] = SourceModule = Result;
984996 addHeader (Result, H, NormalHeader);
@@ -1091,9 +1103,9 @@ Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
10911103 if (!UmbrellaHeader)
10921104 return nullptr ;
10931105
1094- Module *Result = new Module (ModuleName, SourceLocation (), Parent,
1095- /* IsFramework= */ true , /* IsExplicit= */ false ,
1096- NumCreatedModules++);
1106+ Module *Result = new (ModulesAlloc. Allocate ())
1107+ Module (ModuleConstructorTag{}, ModuleName, SourceLocation (), Parent ,
1108+ /* IsFramework= */ true , /* IsExplicit= */ false , NumCreatedModules++);
10971109 InferredModuleAllowedBy[Result] = ModuleMapFID;
10981110 Result->IsInferred = true ;
10991111 if (!Parent) {
@@ -1181,9 +1193,9 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
11811193 Module *ShadowingModule) {
11821194
11831195 // Create a new module with this name.
1184- Module *Result =
1185- new Module (Name, SourceLocation (), /* Parent=*/ nullptr , IsFramework ,
1186- /* IsExplicit=*/ false , NumCreatedModules++);
1196+ Module *Result = new (ModulesAlloc. Allocate ())
1197+ Module (ModuleConstructorTag{}, Name, SourceLocation (), /* Parent=*/ nullptr ,
1198+ IsFramework, /* IsExplicit=*/ false , NumCreatedModules++);
11871199 Result->ShadowingModule = ShadowingModule;
11881200 Result->markUnavailable (/* Unimportable*/ true );
11891201 ModuleScopeIDs[Result] = CurrentModuleScopeID;
0 commit comments