@@ -362,12 +362,7 @@ ModuleMap::ModuleMap(SourceManager &SourceMgr, DiagnosticsEngine &Diags,
362
362
MMapLangOpts.LineComment = true ;
363
363
}
364
364
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 ;
371
366
372
367
void ModuleMap::setTarget (const TargetInfo &Target) {
373
368
assert ((!this ->Target || this ->Target == &Target) &&
@@ -840,6 +835,22 @@ Module *ModuleMap::findModule(StringRef Name) const {
840
835
return nullptr ;
841
836
}
842
837
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
+
843
854
Module *ModuleMap::lookupModuleUnqualified (StringRef Name,
844
855
Module *Context) const {
845
856
for (; Context; Context = Context->Parent ) {
@@ -866,8 +877,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
866
877
return std::make_pair (Sub, false );
867
878
868
879
// 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++);
871
883
if (!Parent) {
872
884
if (LangOpts.CurrentModule == Name)
873
885
SourceModule = Result;
@@ -879,8 +891,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
879
891
880
892
Module *ModuleMap::createGlobalModuleFragmentForModuleUnit (SourceLocation Loc,
881
893
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++);
884
897
Result->Kind = Module::ExplicitGlobalModuleFragment;
885
898
// If the created module isn't owned by a parent, send it to PendingSubmodules
886
899
// to wait for its parent.
@@ -897,35 +910,33 @@ ModuleMap::createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
897
910
// Note: Here the `IsExplicit` parameter refers to the semantics in clang
898
911
// modules. All the non-explicit submodules in clang modules will be exported
899
912
// 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++);
903
916
Result->Kind = Module::ImplicitGlobalModuleFragment;
904
917
return Result;
905
918
}
906
919
907
920
Module *
908
921
ModuleMap::createPrivateModuleFragmentForInterfaceUnit (Module *Parent,
909
922
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++);
913
926
Result->Kind = Module::PrivateModuleFragment;
914
927
return Result;
915
928
}
916
929
917
930
Module *ModuleMap::createModuleUnitWithKind (SourceLocation Loc, StringRef Name,
918
931
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++);
922
935
Result->Kind = Kind;
923
936
924
937
// Reparent any current global module fragment as a submodule of this module.
925
- for (auto &Submodule : PendingSubmodules) {
938
+ for (auto &Submodule : PendingSubmodules)
926
939
Submodule->setParent (Result);
927
- Submodule.release (); // now owned by parent
928
- }
929
940
PendingSubmodules.clear ();
930
941
return Result;
931
942
}
@@ -977,8 +988,9 @@ Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name,
977
988
assert (LangOpts.CurrentModule == Name && " module name mismatch" );
978
989
assert (!Modules[Name] && " redefining existing module" );
979
990
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++);
982
994
Result->Kind = Module::ModuleHeaderUnit;
983
995
Modules[Name] = SourceModule = Result;
984
996
addHeader (Result, H, NormalHeader);
@@ -1091,9 +1103,9 @@ Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
1091
1103
if (!UmbrellaHeader)
1092
1104
return nullptr ;
1093
1105
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++);
1097
1109
InferredModuleAllowedBy[Result] = ModuleMapFID;
1098
1110
Result->IsInferred = true ;
1099
1111
if (!Parent) {
@@ -1181,9 +1193,9 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
1181
1193
Module *ShadowingModule) {
1182
1194
1183
1195
// 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++);
1187
1199
Result->ShadowingModule = ShadowingModule;
1188
1200
Result->markUnavailable (/* Unimportable*/ true );
1189
1201
ModuleScopeIDs[Result] = CurrentModuleScopeID;
0 commit comments