[PATCH] D150151: [clang] Prevent creation of new submodules in ASTWriter
Ben Langmuir via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 8 16:04:12 PDT 2023
benlangmuir created this revision.
benlangmuir added a reviewer: jansvoboda11.
Herald added a project: All.
benlangmuir requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Avoid inferring new submodules for headers in ASTWriter's collection of affecting modulemap files, since we don't want to pick up dependencies that didn't actually exist during parsing.
rdar://108681805
Repository:
rG LLVM Github Monorepo
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.
///
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150151.520505.patch
Type: text/x-patch
Size: 3817 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230508/22dee6f8/attachment-0001.bin>
More information about the cfe-commits
mailing list