Skip to content

Commit bb1fcb2

Browse files
[ScanDependency] Move binary module validation into scanner
Improve swift dependency scanner by validating and selecting dependency module into scanner. This provides benefits that: * Build system does not need to schedule interface compilation task if the candidate module is picked, it can just use the candidate module directly. * There is no need for forwarding module in the explicit module build. Since the build system is coordinating the build, there is no need for the forwarding module in the module cache to avoid duplicated work, * This also correctly supports all the module loading modes in the dependency scanner. This is achieved by only adding validate and up-to-date binary module as the candidate module for swift interface module dependency. This allows caching build to construct the correct dependency in the CAS. If there is a candidate module for the interface module, dependency scanner will return a binary module dependency in the dependency graph. The legacy behavior is preserved with a hidden frontend flag `-legacy-scanner-behavior`, while the output is mostly interchangeable with new scanner behavior with `prefer-interface` module loading mode except the candidate module will not be returned. rdar://123711823
1 parent 315a763 commit bb1fcb2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+291
-218
lines changed

include/swift/AST/ModuleDependencies.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,12 @@ class ModuleDependenciesCache {
11151115
std::optional<const ModuleDependencyInfo *>
11161116
findDependency(StringRef moduleName) const;
11171117

1118+
/// Look for known existing dependencies.
1119+
///
1120+
/// \returns the cached result.
1121+
const ModuleDependencyInfo &
1122+
findKnownDependency(const ModuleDependencyID &moduleID) const;
1123+
11181124
/// Record dependencies for the given module.
11191125
void recordDependency(StringRef moduleName,
11201126
ModuleDependencyInfo dependencies);

include/swift/AST/ModuleLoader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ struct SubCompilerInstanceInfo {
190190
/// Abstract interface for a checker of module interfaces and prebuilt modules.
191191
class ModuleInterfaceChecker {
192192
public:
193-
virtual std::vector<std::string>
194-
getCompiledModuleCandidatesForInterface(StringRef moduleName,
193+
virtual std::optional<std::string>
194+
getCompiledModuleCandidateForInterface(StringRef moduleName,
195195
StringRef interfacePath) = 0;
196196

197197
/// Given a list of potential ready-to-use compiled modules for \p interfacePath,

include/swift/AST/SearchPathOptions.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ enum class ModuleSearchPathKind {
3838
RuntimeLibrary,
3939
};
4040

41+
/// Specifies how to load modules when both a module interface and serialized
42+
/// AST are present, or whether to disallow one format or the other altogether.
43+
enum class ModuleLoadingMode {
44+
PreferInterface,
45+
PreferSerialized,
46+
OnlyInterface,
47+
OnlySerialized
48+
};
49+
4150
/// A single module search path that can come from different sources, e.g.
4251
/// framework search paths, import search path etc.
4352
class ModuleSearchPath : public llvm::RefCountedBase<ModuleSearchPath> {
@@ -499,6 +508,12 @@ class SearchPathOptions {
499508
/// original form.
500509
PathObfuscator DeserializedPathRecoverer;
501510

511+
/// Specify the module loading behavior of the compilation.
512+
ModuleLoadingMode ModuleLoadMode = ModuleLoadingMode::PreferSerialized;
513+
514+
/// Legacy scanner search behavior.
515+
bool UseLegacyScannerBehavior = false;
516+
502517
/// Return all module search paths that (non-recursively) contain a file whose
503518
/// name is in \p Filenames.
504519
SmallVector<const ModuleSearchPath *, 4>
@@ -546,7 +561,9 @@ class SearchPathOptions {
546561
RuntimeResourcePath,
547562
hash_combine_range(RuntimeLibraryImportPaths.begin(),
548563
RuntimeLibraryImportPaths.end()),
549-
DisableModulesValidateSystemDependencies);
564+
DisableModulesValidateSystemDependencies,
565+
UseLegacyScannerBehavior,
566+
ModuleLoadMode);
550567
}
551568

552569
/// Return a hash code of any components from these options that should

include/swift/Frontend/ModuleInterfaceLoader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,8 @@ class ModuleInterfaceCheckerImpl: public ModuleInterfaceChecker {
527527
RequireNoncopyableGenerics_t requireNCGenerics):
528528
ModuleInterfaceCheckerImpl(Ctx, cacheDir, prebuiltCacheDir, StringRef(),
529529
opts, requiresOSSAModules, requireNCGenerics) {}
530-
std::vector<std::string>
531-
getCompiledModuleCandidatesForInterface(StringRef moduleName,
530+
std::optional<std::string>
531+
getCompiledModuleCandidateForInterface(StringRef moduleName,
532532
StringRef interfacePath) override;
533533

534534
/// Given a list of potential ready-to-use compiled modules for \p interfacePath,

include/swift/Option/FrontendOptions.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,4 +1332,10 @@ def disable_experimental_parser_round_trip : Flag<["-"],
13321332
"disable-experimental-parser-round-trip">,
13331333
HelpText<"Disable round trip through the new swift parser">;
13341334

1335+
def legacy_scanner_behavior: Flag<["-"], "legacy-scanner-behavior">,
1336+
HelpText<"Use legacy scanner behavior">;
1337+
def module_load_mode: Separate<["-"], "module-load-mode">,
1338+
MetaVarName<"only-interface|prefer-interface|prefer-serialized|only-serialized">,
1339+
HelpText<"Module loading mode">;
1340+
13351341
} // end let Flags = [FrontendOption, NoDriverOption, HelpHidden]

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "swift/AST/FileUnit.h"
1717
#include "swift/AST/Module.h"
1818
#include "swift/AST/ModuleLoader.h"
19+
#include "swift/AST/SearchPathOptions.h"
1920
#include "llvm/Support/MemoryBuffer.h"
2021
#include "llvm/Support/PrefixMapper.h"
2122
#include "llvm/TargetParser/Triple.h"
@@ -28,15 +29,6 @@ namespace file_types {
2829
enum ID : uint8_t;
2930
}
3031

31-
/// Specifies how to load modules when both a module interface and serialized
32-
/// AST are present, or whether to disallow one format or the other altogether.
33-
enum class ModuleLoadingMode {
34-
PreferInterface,
35-
PreferSerialized,
36-
OnlyInterface,
37-
OnlySerialized
38-
};
39-
4032
/// How a dependency should be loaded.
4133
///
4234
/// \sa getTransitiveLoadingBehavior

lib/AST/ModuleDependencies.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,13 @@ ModuleDependenciesCache::findDependency(StringRef moduleName) const {
736736
return std::nullopt;
737737
}
738738

739+
const ModuleDependencyInfo &ModuleDependenciesCache::findKnownDependency(
740+
const ModuleDependencyID &moduleID) const {
741+
auto dep = findDependency(moduleID);
742+
assert(dep && "dependency unknown");
743+
return **dep;
744+
}
745+
739746
bool ModuleDependenciesCache::hasDependency(const ModuleDependencyID &moduleID) const {
740747
return hasDependency(moduleID.ModuleName, moduleID.Kind);
741748
}

lib/DependencyScan/ModuleDependencyScanner.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ ModuleDependencyScanningWorker::ModuleDependencyScanningWorker(
175175
ScanASTContext,
176176
*static_cast<ModuleInterfaceCheckerImpl *>(
177177
ScanASTContext.getModuleInterfaceChecker()),
178-
&DependencyTracker, ModuleLoadingMode::OnlyInterface);
178+
&DependencyTracker,
179+
ScanCompilerInvocation.getSearchPathOptions().ModuleLoadMode);
179180
}
180181

181182
ModuleDependencyVector

0 commit comments

Comments
 (0)