mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge pull request #34231 from CodaFi/skippy
Skip Merge-Modules When We Can
This commit is contained in:
@@ -446,7 +446,7 @@ namespace driver {
|
||||
|
||||
std::vector<const Job*>
|
||||
reloadAndRemarkDeps(const Job *FinishedCmd, int ReturnCode,
|
||||
const bool forRanges) {
|
||||
const bool forRanges) {
|
||||
const CommandOutput &Output = FinishedCmd->getOutput();
|
||||
StringRef DependenciesFile =
|
||||
Output.getAdditionalOutputForType(file_types::TY_SwiftDeps);
|
||||
@@ -458,7 +458,8 @@ namespace driver {
|
||||
// coarse dependencies that always affect downstream nodes), but we're
|
||||
// not using either of those right now, and this logic should probably
|
||||
// be revisited when we are.
|
||||
assert(FinishedCmd->getCondition() == Job::Condition::Always);
|
||||
assert(isa<MergeModuleJobAction>(FinishedCmd->getSource()) ||
|
||||
FinishedCmd->getCondition() == Job::Condition::Always);
|
||||
return {};
|
||||
}
|
||||
const bool compileExitedNormally =
|
||||
@@ -907,6 +908,7 @@ namespace driver {
|
||||
return everyIncrementalJob;
|
||||
};
|
||||
|
||||
const Job *mergeModulesJob = nullptr;
|
||||
CommandSet jobsToSchedule;
|
||||
CommandSet initialCascadingCommands;
|
||||
for (const Job *cmd : Comp.getJobs()) {
|
||||
@@ -915,6 +917,11 @@ namespace driver {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isa<MergeModuleJobAction>(cmd->getSource())) {
|
||||
assert(!mergeModulesJob && "multiple scheduled merge-modules jobs?");
|
||||
mergeModulesJob = cmd;
|
||||
}
|
||||
|
||||
const Optional<std::pair<bool, bool>> shouldSchedAndIsCascading =
|
||||
computeShouldInitiallyScheduleJobAndDependendents(cmd, forRanges);
|
||||
if (!shouldSchedAndIsCascading)
|
||||
@@ -936,6 +943,15 @@ namespace driver {
|
||||
collectIncrementalExternallyDependentJobsFromDependencyGraph(
|
||||
forRanges))
|
||||
jobsToSchedule.insert(cmd);
|
||||
|
||||
// The merge-modules job is special: it *must* be scheduled if any other
|
||||
// job has been scheduled because any other job can influence the
|
||||
// structure of the resulting module. Additionally, the initial scheduling
|
||||
// predicate above is only aware of intra-module changes. External
|
||||
// dependencies changing *must* cause merge-modules to be scheduled.
|
||||
if (!jobsToSchedule.empty() && mergeModulesJob) {
|
||||
jobsToSchedule.insert(mergeModulesJob);
|
||||
}
|
||||
return jobsToSchedule;
|
||||
}
|
||||
|
||||
@@ -1031,6 +1047,13 @@ namespace driver {
|
||||
/// But returns None if there was a dependency read error.
|
||||
Optional<std::pair<Job::Condition, bool>>
|
||||
loadDependenciesAndComputeCondition(const Job *const Cmd, bool forRanges) {
|
||||
// merge-modules Jobs do not have .swiftdeps files associated with them,
|
||||
// however, their compilation condition is computed as a function of their
|
||||
// inputs, so their condition can be used as normal.
|
||||
if (isa<MergeModuleJobAction>(Cmd->getSource())) {
|
||||
return std::make_pair(Cmd->getCondition(), true);
|
||||
}
|
||||
|
||||
// Try to load the dependencies file for this job. If there isn't one, we
|
||||
// always have to run the job, but it doesn't affect any other jobs. If
|
||||
// there should be one but it's not present or can't be loaded, we have to
|
||||
@@ -1163,7 +1186,12 @@ namespace driver {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Can we run a cross-module incremental build at all? If not, fallback.
|
||||
// Is this module out of date? If not, just keep searching.
|
||||
if (Comp.getLastBuildTime() >= depStatus.getLastModificationTime())
|
||||
continue;
|
||||
|
||||
// Can we run a cross-module incremental build at all?
|
||||
// If not, fall back.
|
||||
if (!Comp.getEnableCrossModuleIncrementalBuild()) {
|
||||
fallbackToExternalBehavior(external);
|
||||
continue;
|
||||
@@ -1609,8 +1637,8 @@ namespace driver {
|
||||
CompileJobAction::InputInfo info;
|
||||
info.previousModTime = entry.first->getInputModTime();
|
||||
info.status = entry.second ?
|
||||
CompileJobAction::InputInfo::NeedsCascadingBuild :
|
||||
CompileJobAction::InputInfo::NeedsNonCascadingBuild;
|
||||
CompileJobAction::InputInfo::Status::NeedsCascadingBuild :
|
||||
CompileJobAction::InputInfo::Status::NeedsNonCascadingBuild;
|
||||
inputs[&inputFile->getInputArg()] = info;
|
||||
}
|
||||
}
|
||||
@@ -1627,7 +1655,7 @@ namespace driver {
|
||||
|
||||
CompileJobAction::InputInfo info;
|
||||
info.previousModTime = entry->getInputModTime();
|
||||
info.status = CompileJobAction::InputInfo::UpToDate;
|
||||
info.status = CompileJobAction::InputInfo::Status::UpToDate;
|
||||
inputs[&inputFile->getInputArg()] = info;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user