@@ -2094,14 +2094,15 @@ namespace {
20942094 llvm::PointerIntPair<Module *, 2 , ModuleMap::ModuleHeaderRole>;
20952095
20962096 struct data_type {
2097- data_type (const HeaderFileInfo &HFI, bool AlreadyIncluded,
2097+ data_type (const HeaderFileInfo &HFI,
2098+ const std::vector<const Module *> &Includers,
20982099 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
20992100 UnresolvedModule Unresolved)
2100- : HFI(HFI), AlreadyIncluded(AlreadyIncluded ),
2101- KnownHeaders (KnownHeaders), Unresolved(Unresolved) {}
2101+ : HFI(HFI), Includers(Includers), KnownHeaders(KnownHeaders ),
2102+ Unresolved (Unresolved) {}
21022103
21032104 HeaderFileInfo HFI;
2104- bool AlreadyIncluded ;
2105+ std::vector< const Module *> Includers ;
21052106 SmallVector<ModuleMap::KnownHeader, 1 > KnownHeaders;
21062107 UnresolvedModule Unresolved;
21072108 };
@@ -2124,6 +2125,12 @@ namespace {
21242125 EmitKeyDataLength (raw_ostream& Out, key_type_ref key, data_type_ref Data) {
21252126 unsigned KeyLen = key.Filename .size () + 1 + 8 + 8 ;
21262127 unsigned DataLen = 1 + sizeof (IdentifierID);
2128+
2129+ DataLen += 4 ;
2130+ for (const Module *M : Data.Includers )
2131+ if (!M || Writer.getLocalOrImportedSubmoduleID (M))
2132+ DataLen += 4 ;
2133+
21272134 for (auto ModInfo : Data.KnownHeaders )
21282135 if (Writer.getLocalOrImportedSubmoduleID (ModInfo.getModule ()))
21292136 DataLen += 4 ;
@@ -2150,8 +2157,7 @@ namespace {
21502157 endian::Writer LE (Out, llvm::endianness::little);
21512158 uint64_t Start = Out.tell (); (void )Start;
21522159
2153- unsigned char Flags = (Data.AlreadyIncluded << 6 )
2154- | (Data.HFI .isImport << 5 )
2160+ unsigned char Flags = (Data.HFI .isImport << 5 )
21552161 | (Writer.isWritingStdCXXNamedModules () ? 0 :
21562162 Data.HFI .isPragmaOnce << 4 )
21572163 | (Data.HFI .DirInfo << 1 );
@@ -2163,6 +2169,14 @@ namespace {
21632169 LE.write <IdentifierID>(
21642170 Writer.getIdentifierRef (Data.HFI .LazyControllingMacro .getPtr ()));
21652171
2172+ LE.write <uint32_t >(Data.Includers .size ());
2173+ for (const Module *M : Data.Includers ) {
2174+ if (!M)
2175+ LE.write <uint32_t >(0 );
2176+ else if (uint32_t ModID = Writer.getLocalOrImportedSubmoduleID (M))
2177+ LE.write <uint32_t >(ModID);
2178+ }
2179+
21662180 auto EmitModule = [&](Module *M, ModuleMap::ModuleHeaderRole Role) {
21672181 if (uint32_t ModID = Writer.getLocalOrImportedSubmoduleID (M)) {
21682182 uint32_t Value = (ModID << 3 ) | (unsigned )Role;
@@ -2234,7 +2248,7 @@ void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) {
22342248 HeaderFileInfoTrait::key_type Key = {
22352249 FilenameDup, *U.Size , IncludeTimestamps ? *U.ModTime : 0 };
22362250 HeaderFileInfoTrait::data_type Data = {
2237- Empty, false , {}, {M, ModuleMap::headerKindToRole (U.Kind )}};
2251+ Empty, {} , {}, {M, ModuleMap::headerKindToRole (U.Kind )}};
22382252 // FIXME: Deal with cases where there are multiple unresolved header
22392253 // directives in different submodules for the same header.
22402254 Generator.insert (Key, Data, GeneratorTrait);
@@ -2274,13 +2288,27 @@ void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) {
22742288 SavedStrings.push_back (Filename.data ());
22752289 }
22762290
2277- bool Included = HFI->IsLocallyIncluded || PP->alreadyIncluded (*File);
2291+ std::vector<const Module *> Includers;
2292+ if (WritingModule) {
2293+ llvm::DenseSet<const Module *> Seen;
2294+ std::function<void (const Module *)> Visit = [&](const Module *M) {
2295+ if (!Seen.insert (M).second )
2296+ return ;
2297+ if (M->Includes .contains (*File))
2298+ Includers.push_back (M);
2299+ for (const Module *SubM : M->submodules ())
2300+ Visit (SubM);
2301+ };
2302+ Visit (WritingModule);
2303+ } else if (PP->getTopLevelIncludes ().contains (*File)) {
2304+ Includers.push_back (nullptr );
2305+ }
22782306
22792307 HeaderFileInfoTrait::key_type Key = {
22802308 Filename, File->getSize (), getTimestampForOutput (*File)
22812309 };
22822310 HeaderFileInfoTrait::data_type Data = {
2283- *HFI, Included , HS.getModuleMap ().findResolvedModulesForHeader (*File), {}
2311+ *HFI, Includers , HS.getModuleMap ().findResolvedModulesForHeader (*File), {}
22842312 };
22852313 Generator.insert (Key, Data, GeneratorTrait);
22862314 ++NumHeaderSearchEntries;
0 commit comments