diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 0238371927e09f..006063e21eb3d2 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -447,8 +447,9 @@ class ASTContext : public RefCountedBase { }; llvm::DenseMap 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; @@ -1051,10 +1052,10 @@ class ASTContext : public RefCountedBase { ArrayRef 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(); diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index dcd811ea257b34..416859668af987 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -880,11 +880,11 @@ CodeGenModule::EmitCXXGlobalInitFunc() { // 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(getCXXABI().getMangleContext()) - .mangleModuleInitializer(getContext().getModuleForCodeGen(), Out); + .mangleModuleInitializer(getContext().getNamedModuleForCodeGen(), Out); Fn = CreateGlobalInitOrCleanUpFunction( FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false, llvm::GlobalVariable::ExternalLinkage); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 71ec831435356c..71a2f61ea955f3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -509,7 +509,7 @@ static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, } void CodeGenModule::Release() { - Module *Primary = getContext().getModuleForCodeGen(); + Module *Primary = getContext().getNamedModuleForCodeGen(); if (CXX20ModuleInits && Primary && !Primary->isHeaderLikeModule()) EmitModuleInitializers(Primary); EmitDeferred(); diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 3b4f25182ac954..f2939a2e8f0ef4 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -877,6 +877,10 @@ std::unique_ptr ASTUnit::LoadFromASTFile( 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); diff --git a/clang/lib/Parse/ParseAST.cpp b/clang/lib/Parse/ParseAST.cpp index f442b6213836dc..04b3f0460bf3eb 100644 --- a/clang/lib/Parse/ParseAST.cpp +++ b/clang/lib/Parse/ParseAST.cpp @@ -172,27 +172,6 @@ void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) { 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. diff --git a/clang/lib/Sema/SemaModule.cpp b/clang/lib/Sema/SemaModule.cpp index 194239ab0e1007..8f38dc86fea08f 100644 --- a/clang/lib/Sema/SemaModule.cpp +++ b/clang/lib/Sema/SemaModule.cpp @@ -409,6 +409,8 @@ Sema::ActOnModuleDecl(SourceLocation StartLoc, SourceLocation ModuleLoc, return ConvertDeclToDeclGroup(Import); } + getASTContext().setNamedModuleForCodeGen(Mod); + // FIXME: Create a ModuleDecl. return nullptr; }