mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user