@@ -411,6 +411,23 @@ bool ModuleDependenciesCacheDeserializer::readGraph(
411411 break ;
412412 }
413413
414+ case VISIBLE_MODULES_NODE: {
415+ uint64_t identifierID;
416+ uint64_t valueArrayID;
417+ VisibleModulesLayout::readRecord (Scratch, identifierID, valueArrayID);
418+ auto moduleName = getIdentifier (identifierID);
419+ if (!moduleName)
420+ llvm::report_fatal_error (
421+ " Bad visible modules info: no module name" );
422+ auto values = getStringArray (valueArrayID);
423+ if (!values)
424+ llvm::report_fatal_error (
425+ " Bad visible modules info: modules" );
426+
427+ cache.clangModulesVisibleFromNamedLookup [moduleName.value ()] = values.value ();
428+ break ;
429+ }
430+
414431 case IMPORT_STATEMENT_NODE: {
415432 unsigned importIdentifierID, bufferIdentifierID;
416433 unsigned lineNumber, columnNumber;
@@ -1056,6 +1073,7 @@ enum ModuleIdentifierArrayKind : uint8_t {
10561073 BridgingHeaderBuildCommandLine,
10571074 NonPathCommandLine,
10581075 FileDependencies,
1076+ VisibleClangModulesFromLookup,
10591077 LastArrayKind
10601078};
10611079
@@ -1166,6 +1184,7 @@ class ModuleDependenciesCacheSerializer {
11661184 unsigned writeSearchPaths (const SwiftBinaryModuleDependencyStorage &dependencyInfo);
11671185 void writeSearchPathsArray (unsigned startIndex, unsigned count);
11681186
1187+ void writeVisibleClangModuleInfo (const ModuleDependenciesCache &cache);
11691188 void writeImportStatementInfos (const ModuleDependenciesCache &cache);
11701189 unsigned writeImportStatementInfos (const ModuleDependencyInfo &dependencyInfo,
11711190 bool optional);
@@ -1435,6 +1454,21 @@ void ModuleDependenciesCacheSerializer::writeSearchPathsArray(unsigned startInde
14351454 Out, ScratchRecord, AbbrCodes[SearchPathArrayLayout::Code], vec);
14361455}
14371456
1457+ void ModuleDependenciesCacheSerializer::writeVisibleClangModuleInfo (
1458+ const ModuleDependenciesCache &cache) {
1459+ using namespace graph_block ;
1460+ for (const auto &entry : cache.clangModulesVisibleFromNamedLookup ) {
1461+ auto moduleID =
1462+ ModuleDependencyID{entry.getKey ().str (), ModuleDependencyKind::Clang};
1463+ VisibleModulesLayout::emitRecord (
1464+ Out, ScratchRecord, AbbrCodes[VisibleModulesLayout::Code],
1465+ getIdentifier (moduleID.ModuleName ),
1466+ getIdentifierArrayID (
1467+ moduleID,
1468+ ModuleIdentifierArrayKind::VisibleClangModulesFromLookup));
1469+ }
1470+ }
1471+
14381472void ModuleDependenciesCacheSerializer::writeImportStatementInfos (
14391473 const ModuleDependenciesCache &cache) {
14401474 unsigned lastImportInfoIndex = 0 ;
@@ -1798,6 +1832,15 @@ unsigned ModuleDependenciesCacheSerializer::getOptionalImportStatementsArrayID(
17981832void ModuleDependenciesCacheSerializer::collectStringsAndArrays (
17991833 const ModuleDependenciesCache &cache) {
18001834 addIdentifier (cache.scannerContextHash );
1835+
1836+ for (const auto &entry : cache.clangModulesVisibleFromNamedLookup ) {
1837+ auto moduleName = entry.getKey ().str ();
1838+ addIdentifier (moduleName);
1839+ addStringArray ({moduleName, ModuleDependencyKind::Clang},
1840+ ModuleIdentifierArrayKind::VisibleClangModulesFromLookup,
1841+ entry.second );
1842+ }
1843+
18011844 for (auto kind = ModuleDependencyKind::FirstKind;
18021845 kind != ModuleDependencyKind::LastKind; ++kind) {
18031846 auto modMap = cache.getDependenciesMap (kind);
@@ -1973,6 +2016,7 @@ void ModuleDependenciesCacheSerializer::writeInterModuleDependenciesCache(
19732016 registerRecordAbbr<MacroDependencyArrayLayout>();
19742017 registerRecordAbbr<SearchPathLayout>();
19752018 registerRecordAbbr<SearchPathArrayLayout>();
2019+ registerRecordAbbr<VisibleModulesLayout>();
19762020 registerRecordAbbr<ImportStatementLayout>();
19772021 registerRecordAbbr<ImportStatementArrayLayout>();
19782022 registerRecordAbbr<OptionalImportStatementArrayLayout>();
@@ -1998,6 +2042,9 @@ void ModuleDependenciesCacheSerializer::writeInterModuleDependenciesCache(
19982042 // Write the arrays
19992043 writeArraysOfIdentifiers ();
20002044
2045+ // Write the cached sets of visible modules
2046+ writeVisibleClangModuleInfo (cache);
2047+
20012048 // Write all the import statement info
20022049 writeImportStatementInfos (cache);
20032050
0 commit comments