Skip to content

Commit 0ea2af8

Browse files
[clang][modules] HeaderSearch::MarkFileModuleHeader creates extra HeaderFileInfo, breaks PCM reuse
HeaderSearch::MarkFileModuleHeader is no longer properly checking for no-changes, and so creates a new HeaderFileInfo for every `textual header`, causes PCM use to go ballistic.
1 parent db2f64e commit 0ea2af8

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

clang/include/clang/Lex/HeaderSearch.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ struct HeaderFileInfo {
8484
LLVM_PREFERRED_TYPE(bool)
8585
unsigned isModuleHeader : 1;
8686

87-
/// Whether this header is a `textual header` in a module.
87+
/// Whether this header is a `textual header` in a module. If a header is
88+
/// textual in one module and normal in another module, this bit will not be
89+
/// set, only `isModuleHeader`.
8890
LLVM_PREFERRED_TYPE(bool)
8991
unsigned isTextualModuleHeader : 1;
9092

clang/lib/Lex/HeaderSearch.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,11 +1313,19 @@ OptionalFileEntryRef HeaderSearch::LookupSubframeworkHeader(
13131313
// File Info Management.
13141314
//===----------------------------------------------------------------------===//
13151315

1316+
static bool moduleMembershipNeedsMerge(const HeaderFileInfo *HFI,
1317+
ModuleMap::ModuleHeaderRole Role) {
1318+
if (ModuleMap::isModular(Role))
1319+
return !HFI->isModuleHeader || HFI->isTextualModuleHeader;
1320+
else if (!HFI->isModuleHeader && (Role & ModuleMap::TextualHeader))
1321+
return !HFI->isTextualModuleHeader;
1322+
else
1323+
return false;
1324+
}
1325+
13161326
static void mergeHeaderFileInfoModuleBits(HeaderFileInfo &HFI,
13171327
bool isModuleHeader,
13181328
bool isTextualModuleHeader) {
1319-
assert((!isModuleHeader || !isTextualModuleHeader) &&
1320-
"A header can't build with a module and be textual at the same time");
13211329
HFI.isModuleHeader |= isModuleHeader;
13221330
if (HFI.isModuleHeader)
13231331
HFI.isTextualModuleHeader = false;
@@ -1432,7 +1440,7 @@ void HeaderSearch::MarkFileModuleHeader(FileEntryRef FE,
14321440
if ((Role & ModuleMap::ExcludedHeader))
14331441
return;
14341442
auto *HFI = getExistingFileInfo(FE);
1435-
if (HFI && HFI->isModuleHeader)
1443+
if (HFI && !moduleMembershipNeedsMerge(HFI, Role))
14361444
return;
14371445
}
14381446

0 commit comments

Comments
 (0)