};
llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;
- /// For module code-gen cases, this is the top-level module we are building.
- Module *TopLevelModule = nullptr;
+ /// For module code-gen cases, this is the top-level (C++20) Named module
+ /// we are building.
+ Module *TopLevelCXXNamedModule = nullptr;
static constexpr unsigned ConstantArrayTypesLog2InitSize = 8;
static constexpr unsigned GeneralTypesLog2InitSize = 9;
ArrayRef<Decl*> getModuleInitializers(Module *M);
/// Set the (C++20) module we are building.
- void setModuleForCodeGen(Module *M) { TopLevelModule = M; }
+ void setNamedModuleForCodeGen(Module *M) { TopLevelCXXNamedModule = M; }
/// Get module under construction, nullptr if this is not a C++20 module.
- Module *getModuleForCodeGen() const { return TopLevelModule; }
+ Module *getNamedModuleForCodeGen() const { return TopLevelCXXNamedModule; }
TranslationUnitDecl *getTranslationUnitDecl() const {
return TUDecl->getMostRecentDecl();
// and makes sure these symbols appear lexicographically behind the symbols
// with priority emitted above.
llvm::Function *Fn;
- if (CXX20ModuleInits && getContext().getModuleForCodeGen()) {
+ if (CXX20ModuleInits && getContext().getNamedModuleForCodeGen()) {
SmallString<256> InitFnName;
llvm::raw_svector_ostream Out(InitFnName);
cast<ItaniumMangleContext>(getCXXABI().getMangleContext())
- .mangleModuleInitializer(getContext().getModuleForCodeGen(), Out);
+ .mangleModuleInitializer(getContext().getNamedModuleForCodeGen(), Out);
Fn = CreateGlobalInitOrCleanUpFunction(
FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false,
llvm::GlobalVariable::ExternalLinkage);
}
void CodeGenModule::Release() {
- Module *Primary = getContext().getModuleForCodeGen();
+ Module *Primary = getContext().getNamedModuleForCodeGen();
if (CXX20ModuleInits && Primary && !Primary->isHeaderLikeModule())
EmitModuleInitializers(Primary);
EmitDeferred();
PP.setCounterValue(Counter);
+ Module *M = HeaderInfo.lookupModule(AST->getLangOpts().CurrentModule);
+ if (M && AST->getLangOpts().isCompilingModule() && M->isModulePurview())
+ AST->Ctx->setNamedModuleForCodeGen(M);
+
// Create an AST consumer, even though it isn't used.
if (ToLoad >= LoadASTOnly)
AST->Consumer.reset(new ASTConsumer);
for (Decl *D : S.WeakTopLevelDecls())
Consumer->HandleTopLevelDecl(DeclGroupRef(D));
- // For C++20 modules, the codegen for module initializers needs to be altered
- // and to be able to use a name based on the module name.
-
- // At this point, we should know if we are building a non-header C++20 module.
- if (S.getLangOpts().CPlusPlusModules) {
- // If we are building the module from source, then the top level module
- // will be here.
- Module *CodegenModule = S.getCurrentModule();
- bool Interface = true;
- if (CodegenModule)
- // We only use module initializers for importable module (including
- // partition implementation units).
- Interface = S.currentModuleIsInterface();
- else if (S.getLangOpts().isCompilingModuleInterface())
- // If we are building the module from a PCM file, then the module can be
- // found here.
- CodegenModule = S.getPreprocessor().getCurrentModule();
-
- if (Interface && CodegenModule)
- S.getASTContext().setModuleForCodeGen(CodegenModule);
- }
Consumer->HandleTranslationUnit(S.getASTContext());
// Finalize the template instantiation observer chain.
return ConvertDeclToDeclGroup(Import);
}
+ getASTContext().setNamedModuleForCodeGen(Mod);
+
// FIXME: Create a ModuleDecl.
return nullptr;
}