[Dependency Scanning] Record header dependencies of Binary Swift module dependencies

These are meant to capture paths to the PCH files that a given module was built with.
This commit is contained in:
Artem Chikin
2023-06-09 13:50:07 -07:00
parent 90a1bb812b
commit b974d97879
6 changed files with 97 additions and 51 deletions

View File

@@ -392,8 +392,8 @@ std::error_code SerializedModuleLoaderBase::openModuleFile(
return std::error_code();
}
llvm::ErrorOr<llvm::StringSet<>>
SerializedModuleLoaderBase::getModuleImportsOfModule(
llvm::ErrorOr<SerializedModuleLoaderBase::BinaryModuleImports>
SerializedModuleLoaderBase::getImportsOfModule(
Twine modulePath, ModuleLoadingBehavior transitiveBehavior,
bool isFramework, bool isRequiredOSSAModules, StringRef SDKName,
StringRef packageName, llvm::vfs::FileSystem *fileSystem,
@@ -403,6 +403,7 @@ SerializedModuleLoaderBase::getModuleImportsOfModule(
return moduleBuf.getError();
llvm::StringSet<> importedModuleNames;
llvm::StringSet<> importedHeaders;
// Load the module file without validation.
std::shared_ptr<const ModuleFileSharedCore> loadedModuleFile;
serialization::ValidationInfo loadInfo = ModuleFileSharedCore::load(
@@ -410,9 +411,10 @@ SerializedModuleLoaderBase::getModuleImportsOfModule(
isRequiredOSSAModules, SDKName, recoverer, loadedModuleFile);
for (const auto &dependency : loadedModuleFile->getDependencies()) {
// FIXME: Record header dependency?
if (dependency.isHeader())
if (dependency.isHeader()) {
importedHeaders.insert(dependency.RawPath);
continue;
}
ModuleLoadingBehavior dependencyTransitiveBehavior =
loadedModuleFile->getTransitiveLoadingBehavior(
@@ -433,17 +435,13 @@ SerializedModuleLoaderBase::getModuleImportsOfModule(
importedModuleNames.insert(moduleName);
}
return importedModuleNames;
return SerializedModuleLoaderBase::BinaryModuleImports{importedModuleNames, importedHeaders};
}
llvm::ErrorOr<ModuleDependencyInfo>
SerializedModuleLoaderBase::scanModuleFile(Twine modulePath, bool isFramework) {
const std::string moduleDocPath;
const std::string sourceInfoPath;
// Map the set of dependencies over to the "module dependencies".
auto dependencies = ModuleDependencyInfo::forSwiftBinaryModule(
modulePath.str(), moduleDocPath, sourceInfoPath, isFramework,
/*module-cache-key*/ "");
// Some transitive dependencies of binary modules are not required to be
// imported during normal builds.
// TODO: This is worth revisiting for debugger purposes where
@@ -452,18 +450,37 @@ SerializedModuleLoaderBase::scanModuleFile(Twine modulePath, bool isFramework) {
// optional.
ModuleLoadingBehavior transitiveLoadingBehavior =
ModuleLoadingBehavior::Required;
auto importedModuleNames = getModuleImportsOfModule(
auto binaryModuleImports = getImportsOfModule(
modulePath, transitiveLoadingBehavior, isFramework,
isRequiredOSSAModules(), Ctx.LangOpts.SDKName, Ctx.LangOpts.PackageName,
Ctx.SourceMgr.getFileSystem().get(),
Ctx.SearchPathOpts.DeserializedPathRecoverer);
if (!importedModuleNames)
return importedModuleNames.getError();
if (!binaryModuleImports)
return binaryModuleImports.getError();
llvm::StringSet<> addedModuleNames;
for (const auto &importedModuleName : *importedModuleNames)
dependencies.addModuleImport(importedModuleName.getKey(),
&addedModuleNames);
auto importedModuleSet = binaryModuleImports.get().moduleImports;
std::vector<std::string> importedModuleNames;
importedModuleNames.reserve(importedModuleSet.size());
llvm::transform(importedModuleSet.keys(),
std::back_inserter(importedModuleNames),
[](llvm::StringRef N) {
return N.str();
});
auto importedHeaderSet = binaryModuleImports.get().headerImports;
std::vector<std::string> importedHeaders;
importedHeaders.reserve(importedHeaderSet.size());
llvm::transform(importedHeaderSet.keys(),
std::back_inserter(importedHeaders),
[](llvm::StringRef N) {
return N.str();
});
// Map the set of dependencies over to the "module dependencies".
auto dependencies = ModuleDependencyInfo::forSwiftBinaryModule(
modulePath.str(), moduleDocPath, sourceInfoPath,
importedModuleNames, importedHeaders, isFramework,
/*module-cache-key*/ "");
return std::move(dependencies);
}