This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG5984ea216d2a: [clang] Prevent creation of new submodules in ASTWriter (authored by benlangmuir).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D150151/new/ https://reviews.llvm.org/D150151 Files: clang/include/clang/Lex/HeaderSearch.h clang/include/clang/Lex/ModuleMap.h clang/lib/Lex/HeaderSearch.cpp clang/lib/Lex/ModuleMap.cpp clang/lib/Serialization/ASTWriter.cpp Index: clang/lib/Serialization/ASTWriter.cpp =================================================================== --- clang/lib/Serialization/ASTWriter.cpp +++ clang/lib/Serialization/ASTWriter.cpp @@ -185,7 +185,8 @@ if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader)) continue; - for (const auto &KH : HS.findAllModulesForHeader(File)) { + for (const auto &KH : + HS.findAllModulesForHeader(File, /*AllowCreation=*/false)) { if (!KH.getModule()) continue; ModulesToProcess.push_back(KH.getModule()); Index: clang/lib/Lex/ModuleMap.cpp =================================================================== --- clang/lib/Lex/ModuleMap.cpp +++ clang/lib/Lex/ModuleMap.cpp @@ -683,12 +683,12 @@ } ArrayRef<ModuleMap::KnownHeader> -ModuleMap::findAllModulesForHeader(const FileEntry *File) { +ModuleMap::findAllModulesForHeader(const FileEntry *File, bool AllowCreation) { HeadersMap::iterator Known = findKnownHeader(File); if (Known != Headers.end()) return Known->second; - if (findOrCreateModuleForHeaderInUmbrellaDir(File)) + if (AllowCreation && findOrCreateModuleForHeaderInUmbrellaDir(File)) return Headers.find(File)->second; return std::nullopt; Index: clang/lib/Lex/HeaderSearch.cpp =================================================================== --- clang/lib/Lex/HeaderSearch.cpp +++ clang/lib/Lex/HeaderSearch.cpp @@ -1565,13 +1565,14 @@ } ArrayRef<ModuleMap::KnownHeader> -HeaderSearch::findAllModulesForHeader(const FileEntry *File) const { +HeaderSearch::findAllModulesForHeader(const FileEntry *File, + bool AllowCreation) const { if (ExternalSource) { // Make sure the external source has handled header info about this file, // which includes whether the file is part of a module. (void)getExistingFileInfo(File); } - return ModMap.findAllModulesForHeader(File); + return ModMap.findAllModulesForHeader(File, AllowCreation); } static bool suggestModule(HeaderSearch &HS, const FileEntry *File, Index: clang/include/clang/Lex/ModuleMap.h =================================================================== --- clang/include/clang/Lex/ModuleMap.h +++ clang/include/clang/Lex/ModuleMap.h @@ -448,9 +448,13 @@ /// and does not consult the external source. (Those checks are the /// responsibility of \ref HeaderSearch.) /// + /// \param AllowCreation Whether to allow inference of a new submodule, or to + /// only return existing known modules. + /// /// Typically, \ref findModuleForHeader should be used instead, as it picks /// the preferred module for the header. - ArrayRef<KnownHeader> findAllModulesForHeader(const FileEntry *File); + ArrayRef<KnownHeader> findAllModulesForHeader(const FileEntry *File, + bool AllowCreation = true); /// Like \ref findAllModulesForHeader, but do not attempt to infer module /// ownership from umbrella headers if we've not already done so. Index: clang/include/clang/Lex/HeaderSearch.h =================================================================== --- clang/include/clang/Lex/HeaderSearch.h +++ clang/include/clang/Lex/HeaderSearch.h @@ -665,9 +665,13 @@ /// Retrieve all the modules corresponding to the given file. /// + /// \param AllowCreation Whether to allow inference of a new submodule, or to + /// only return existing known modules. + /// /// \ref findModuleForHeader should typically be used instead of this. ArrayRef<ModuleMap::KnownHeader> - findAllModulesForHeader(const FileEntry *File) const; + findAllModulesForHeader(const FileEntry *File, + bool AllowCreation = true) const; /// Read the contents of the given module map file. ///
Index: clang/lib/Serialization/ASTWriter.cpp =================================================================== --- clang/lib/Serialization/ASTWriter.cpp +++ clang/lib/Serialization/ASTWriter.cpp @@ -185,7 +185,8 @@ if (!HFI || (HFI->isModuleHeader && !HFI->isCompilingModuleHeader)) continue; - for (const auto &KH : HS.findAllModulesForHeader(File)) { + for (const auto &KH : + HS.findAllModulesForHeader(File, /*AllowCreation=*/false)) { if (!KH.getModule()) continue; ModulesToProcess.push_back(KH.getModule()); Index: clang/lib/Lex/ModuleMap.cpp =================================================================== --- clang/lib/Lex/ModuleMap.cpp +++ clang/lib/Lex/ModuleMap.cpp @@ -683,12 +683,12 @@ } ArrayRef<ModuleMap::KnownHeader> -ModuleMap::findAllModulesForHeader(const FileEntry *File) { +ModuleMap::findAllModulesForHeader(const FileEntry *File, bool AllowCreation) { HeadersMap::iterator Known = findKnownHeader(File); if (Known != Headers.end()) return Known->second; - if (findOrCreateModuleForHeaderInUmbrellaDir(File)) + if (AllowCreation && findOrCreateModuleForHeaderInUmbrellaDir(File)) return Headers.find(File)->second; return std::nullopt; Index: clang/lib/Lex/HeaderSearch.cpp =================================================================== --- clang/lib/Lex/HeaderSearch.cpp +++ clang/lib/Lex/HeaderSearch.cpp @@ -1565,13 +1565,14 @@ } ArrayRef<ModuleMap::KnownHeader> -HeaderSearch::findAllModulesForHeader(const FileEntry *File) const { +HeaderSearch::findAllModulesForHeader(const FileEntry *File, + bool AllowCreation) const { if (ExternalSource) { // Make sure the external source has handled header info about this file, // which includes whether the file is part of a module. (void)getExistingFileInfo(File); } - return ModMap.findAllModulesForHeader(File); + return ModMap.findAllModulesForHeader(File, AllowCreation); } static bool suggestModule(HeaderSearch &HS, const FileEntry *File, Index: clang/include/clang/Lex/ModuleMap.h =================================================================== --- clang/include/clang/Lex/ModuleMap.h +++ clang/include/clang/Lex/ModuleMap.h @@ -448,9 +448,13 @@ /// and does not consult the external source. (Those checks are the /// responsibility of \ref HeaderSearch.) /// + /// \param AllowCreation Whether to allow inference of a new submodule, or to + /// only return existing known modules. + /// /// Typically, \ref findModuleForHeader should be used instead, as it picks /// the preferred module for the header. - ArrayRef<KnownHeader> findAllModulesForHeader(const FileEntry *File); + ArrayRef<KnownHeader> findAllModulesForHeader(const FileEntry *File, + bool AllowCreation = true); /// Like \ref findAllModulesForHeader, but do not attempt to infer module /// ownership from umbrella headers if we've not already done so. Index: clang/include/clang/Lex/HeaderSearch.h =================================================================== --- clang/include/clang/Lex/HeaderSearch.h +++ clang/include/clang/Lex/HeaderSearch.h @@ -665,9 +665,13 @@ /// Retrieve all the modules corresponding to the given file. /// + /// \param AllowCreation Whether to allow inference of a new submodule, or to + /// only return existing known modules. + /// /// \ref findModuleForHeader should typically be used instead of this. ArrayRef<ModuleMap::KnownHeader> - findAllModulesForHeader(const FileEntry *File) const; + findAllModulesForHeader(const FileEntry *File, + bool AllowCreation = true) const; /// Read the contents of the given module map file. ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits