iains created this revision. iains updated this revision to Diff 404485. iains added a comment. iains updated this revision to Diff 405596. iains updated this revision to Diff 408764. iains added reviewers: rsmith, urnathan, ChuanqiXu. iains published this revision for review. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Rebased onto dependent patch after changes iains added a comment. rebased onto import state machine. iains added a comment. Rebased onto other modules work. iains added a comment. patch 6 of 8 to implement basic C++20 module partition support. This is a small cache to avoid having to check both Exports and Imports. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D118589 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaModule.cpp Index: clang/lib/Sema/SemaModule.cpp =================================================================== --- clang/lib/Sema/SemaModule.cpp +++ clang/lib/Sema/SemaModule.cpp @@ -507,6 +507,11 @@ assert (ThisModule && "was expecting a module if building one"); } + // In some cases we need to know if an entity was present in a directly- + // imported module (as opposed to a transitive import). This avoids + // searching both Imports and Exports. + DirectModuleImports.insert(Mod); + return Import; } Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -2222,6 +2222,9 @@ /// The global module fragment of the current translation unit. clang::Module *GlobalModuleFragment = nullptr; + /// The modules we imported directly. + llvm::SmallPtrSet<clang::Module *, 8> DirectModuleImports; + /// Namespace definitions that we will export when they finish. llvm::SmallPtrSet<const NamespaceDecl*, 8> DeferredExportedNamespaces; @@ -2249,6 +2252,10 @@ return Entity->getOwningModule(); } + bool isModuleDirectlyImported(const Module *M) { + return DirectModuleImports.contains(M); + } + /// Make a merged definition of an existing hidden definition \p ND /// visible at the specified location. void makeMergedDefinitionVisible(NamedDecl *ND);
Index: clang/lib/Sema/SemaModule.cpp =================================================================== --- clang/lib/Sema/SemaModule.cpp +++ clang/lib/Sema/SemaModule.cpp @@ -507,6 +507,11 @@ assert (ThisModule && "was expecting a module if building one"); } + // In some cases we need to know if an entity was present in a directly- + // imported module (as opposed to a transitive import). This avoids + // searching both Imports and Exports. + DirectModuleImports.insert(Mod); + return Import; } Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -2222,6 +2222,9 @@ /// The global module fragment of the current translation unit. clang::Module *GlobalModuleFragment = nullptr; + /// The modules we imported directly. + llvm::SmallPtrSet<clang::Module *, 8> DirectModuleImports; + /// Namespace definitions that we will export when they finish. llvm::SmallPtrSet<const NamespaceDecl*, 8> DeferredExportedNamespaces; @@ -2249,6 +2252,10 @@ return Entity->getOwningModule(); } + bool isModuleDirectlyImported(const Module *M) { + return DirectModuleImports.contains(M); + } + /// Make a merged definition of an existing hidden definition \p ND /// visible at the specified location. void makeMergedDefinitionVisible(NamedDecl *ND);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits