@@ -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) &&
@@ -831,6 +826,22 @@ Module *ModuleMap::findModule(StringRef Name) const {
831
826
return nullptr ;
832
827
}
833
828
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
+
834
845
Module *ModuleMap::lookupModuleUnqualified (StringRef Name,
835
846
Module *Context) const {
836
847
for (; Context; Context = Context->Parent ) {
@@ -857,8 +868,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
857
868
return std::make_pair (Sub, false );
858
869
859
870
// 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++);
862
874
if (!Parent) {
863
875
if (LangOpts.CurrentModule == Name)
864
876
SourceModule = Result;
@@ -870,8 +882,9 @@ std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
870
882
871
883
Module *ModuleMap::createGlobalModuleFragmentForModuleUnit (SourceLocation Loc,
872
884
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++);
875
888
Result->Kind = Module::ExplicitGlobalModuleFragment;
876
889
// If the created module isn't owned by a parent, send it to PendingSubmodules
877
890
// to wait for its parent.
@@ -888,35 +901,33 @@ ModuleMap::createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc,
888
901
// Note: Here the `IsExplicit` parameter refers to the semantics in clang
889
902
// modules. All the non-explicit submodules in clang modules will be exported
890
903
// 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++);
894
907
Result->Kind = Module::ImplicitGlobalModuleFragment;
895
908
return Result;
896
909
}
897
910
898
911
Module *
899
912
ModuleMap::createPrivateModuleFragmentForInterfaceUnit (Module *Parent,
900
913
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++);
904
917
Result->Kind = Module::PrivateModuleFragment;
905
918
return Result;
906
919
}
907
920
908
921
Module *ModuleMap::createModuleUnitWithKind (SourceLocation Loc, StringRef Name,
909
922
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++);
913
926
Result->Kind = Kind;
914
927
915
928
// Reparent any current global module fragment as a submodule of this module.
916
- for (auto &Submodule : PendingSubmodules) {
929
+ for (auto &Submodule : PendingSubmodules)
917
930
Submodule->setParent (Result);
918
- Submodule.release (); // now owned by parent
919
- }
920
931
PendingSubmodules.clear ();
921
932
return Result;
922
933
}
@@ -968,8 +979,9 @@ Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name,
968
979
assert (LangOpts.CurrentModule == Name && " module name mismatch" );
969
980
assert (!Modules[Name] && " redefining existing module" );
970
981
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++);
973
985
Result->Kind = Module::ModuleHeaderUnit;
974
986
Modules[Name] = SourceModule = Result;
975
987
addHeader (Result, H, NormalHeader);
@@ -1082,9 +1094,9 @@ Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir,
1082
1094
if (!UmbrellaHeader)
1083
1095
return nullptr ;
1084
1096
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++);
1088
1100
InferredModuleAllowedBy[Result] = ModuleMapFID;
1089
1101
Result->IsInferred = true ;
1090
1102
if (!Parent) {
@@ -1173,9 +1185,9 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
1173
1185
Module *ShadowingModule) {
1174
1186
1175
1187
// 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++);
1179
1191
Result->ShadowingModule = ShadowingModule;
1180
1192
Result->markUnavailable (/* Unimportable*/ true );
1181
1193
ModuleScopeIDs[Result] = CurrentModuleScopeID;
0 commit comments