From fb365b17ca339a25688ff61918280a46d64943b9 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Mon, 15 Jan 2024 10:06:48 +0100 Subject: Analysed target: keep track of implied export targets ... that are eligible for caching. In this way, we can accurately keep track of the dependencies between target-level cache entries. Note that it is enough to track the export targets eligible for caching, as no target depending on an ineligible export target can be eligible. --- .../analysed_target/analysed_target.hpp | 10 +++++++ .../build_engine/base_maps/source_map.cpp | 1 + .../build_engine/target_map/absent_target_map.cpp | 1 + .../build_engine/target_map/built_in_rules.cpp | 33 +++++++++++++++++++++- src/buildtool/build_engine/target_map/export.cpp | 9 ++++++ .../build_engine/target_map/target_map.cpp | 12 ++++++++ src/buildtool/main/analyse.cpp | 1 + 7 files changed, 66 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.hpp b/src/buildtool/build_engine/analysed_target/analysed_target.hpp index b661e24a..5867e77e 100644 --- a/src/buildtool/build_engine/analysed_target/analysed_target.hpp +++ b/src/buildtool/build_engine/analysed_target/analysed_target.hpp @@ -37,6 +37,7 @@ class AnalysedTarget { std::vector trees, std::unordered_set vars, std::set tainted, + std::set implied_export_targets, TargetGraphInformation graph_information) : result_{std::move(result)}, actions_{std::move(actions)}, @@ -44,6 +45,7 @@ class AnalysedTarget { trees_{std::move(trees)}, vars_{std::move(vars)}, tainted_{std::move(tainted)}, + implied_export_targets_{std::move(implied_export_targets)}, graph_information_{std::move(graph_information)} {} [[nodiscard]] auto Actions() const& noexcept @@ -100,6 +102,13 @@ class AnalysedTarget { [[nodiscard]] auto Tainted() && noexcept -> std::set { return std::move(tainted_); } + [[nodiscard]] auto ImpliedExport() const& noexcept + -> std::set const& { + return implied_export_targets_; + } + [[nodiscard]] auto ImpliedExport() && noexcept -> std::set { + return std::move(implied_export_targets_); + } [[nodiscard]] auto Result() const& noexcept -> TargetResult const& { return result_; } @@ -125,6 +134,7 @@ class AnalysedTarget { std::vector trees_; std::unordered_set vars_; std::set tainted_; + std::set implied_export_targets_; TargetGraphInformation graph_information_; }; diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp index 0453657a..242e546a 100644 --- a/src/buildtool/build_engine/base_maps/source_map.cpp +++ b/src/buildtool/build_engine/base_maps/source_map.cpp @@ -39,6 +39,7 @@ auto as_target(const BuildMaps::Base::EntityName& key, ExpressionPtr artifact) std::vector{}, std::unordered_set{}, std::set{}, + std::set{}, TargetGraphInformation::kSource); } diff --git a/src/buildtool/build_engine/target_map/absent_target_map.cpp b/src/buildtool/build_engine/target_map/absent_target_map.cpp index 6ccf1672..1aac6443 100644 --- a/src/buildtool/build_engine/target_map/absent_target_map.cpp +++ b/src/buildtool/build_engine/target_map/absent_target_map.cpp @@ -120,6 +120,7 @@ auto BuildMaps::Target::CreateAbsentTargetMap( std::unordered_set{flexible_vars->begin(), flexible_vars->end()}, std::set{}, + entry.ToImplied(), deps_info); analysis_result = result_map->Add(key.target, diff --git a/src/buildtool/build_engine/target_map/built_in_rules.cpp b/src/buildtool/build_engine/target_map/built_in_rules.cpp index 6732fd1e..19a12105 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -171,6 +171,12 @@ void BlobGenRuleWithDeps( } } + std::set implied_export{}; + for (auto const& dep : dependency_values) { + implied_export.insert((*dep)->ImpliedExport().begin(), + (*dep)->ImpliedExport().end()); + } + auto name_exp = desc->ReadOptionalExpression( "name", ExpressionPtr{std::string{"out.txt"}}); if (not name_exp) { @@ -233,6 +239,7 @@ void BlobGenRuleWithDeps( std::vector{}, std::move(vars_set), std::move(tainted), + std::move(implied_export), std::move(deps_info)); analysis_result = result_map->Add(key.target, effective_conf, std::move(analysis_result)); @@ -399,6 +406,12 @@ void TreeRuleWithDeps( } } + std::set implied_export{}; + for (auto const& dep : dependency_values) { + implied_export.insert((*dep)->ImpliedExport().begin(), + (*dep)->ImpliedExport().end()); + } + auto vars_set = std::unordered_set{}; vars_set.insert(param_vars->begin(), param_vars->end()); for (auto const& dep : dependency_values) { @@ -460,6 +473,7 @@ void TreeRuleWithDeps( std::move(trees), std::move(vars_set), std::move(tainted), + std::move(implied_export), std::move(deps_info)); analysis_result = result_map->Add(key.target, effective_conf, std::move(analysis_result)); @@ -616,6 +630,13 @@ void InstallRuleWithDeps( } } + // Compute implied export targets + std::set implied_export{}; + for (auto const& dep : dependency_values) { + implied_export.insert((*dep)->ImpliedExport().begin(), + (*dep)->ImpliedExport().end()); + } + // Stage deps (runfiles only) auto stage = ExpressionPtr{Expression::map_t{}}; for (auto const& dep : deps) { @@ -700,6 +721,7 @@ void InstallRuleWithDeps( std::vector{}, std::move(effective_vars), std::move(tainted), + std::move(implied_export), std::move(deps_info)); result = result_map->Add(key.target, effective_conf, std::move(result)); @@ -951,6 +973,13 @@ void GenericRuleWithDeps( } } + // Compute implied export targets + std::set implied_export{}; + for (auto const& dep : dependency_values) { + implied_export.insert((*dep)->ImpliedExport().begin(), + (*dep)->ImpliedExport().end()); + } + // Evaluate cmd, outs, env auto string_fields_fcts = FunctionMap::MakePtr(FunctionMap::underlying_map_t{ @@ -1277,6 +1306,7 @@ void GenericRuleWithDeps( std::vector{}, std::move(effective_vars), std::move(tainted), + std::move(implied_export), std::move(deps_info)); result = result_map->Add(key.target, effective_conf, std::move(result)); @@ -1487,7 +1517,8 @@ void ConfigureRule( std::vector{}, std::vector{}, std::move(vars_set), - std::set{}, + tainted, + configured_target->ImpliedExport(), std::move(deps_info)); analysis_result = result_map->Add(key.target, std::move(effective_conf), diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp index 50238b26..a2215411 100644 --- a/src/buildtool/build_engine/target_map/export.cpp +++ b/src/buildtool/build_engine/target_map/export.cpp @@ -65,6 +65,13 @@ void FinalizeExport( std::unordered_set vars_set{}; vars_set.insert(vars.begin(), vars.end()); + std::set implied{}; + if (target_cache_key) { + implied.insert((*value)->ImpliedExport().begin(), + (*value)->ImpliedExport().end()); + implied.insert(target_cache_key->Id().digest.hash()); + } + auto analysis_result = std::make_shared( TargetResult{.artifact_stage = (*value)->Artifacts(), .provides = provides, @@ -74,6 +81,7 @@ void FinalizeExport( std::vector{}, std::move(vars_set), std::set{}, + std::move(implied), std::move(deps_info)); analysis_result = result_map->Add(target, effective_config, @@ -151,6 +159,7 @@ void ExportRule( std::unordered_set{flexible_vars->begin(), flexible_vars->end()}, std::set{}, + entry.ToImplied(), deps_info); analysis_result = result_map->Add(key.target, diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index ebb07a91..5ca46c93 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -297,6 +297,13 @@ void withDependencies( } } + // Compute implied export targets + std::set implied_export{}; + for (auto const& dep : dependency_values) { + implied_export.insert((*dep)->ImpliedExport().begin(), + (*dep)->ImpliedExport().end()); + } + // Evaluate string parameters auto string_fields_fcts = FunctionMap::MakePtr(FunctionMap::underlying_map_t{ @@ -849,6 +856,7 @@ void withDependencies( std::move(trees), std::move(effective_vars), std::move(tainted), + std::move(implied_export), deps_info); analysis_result = result_map->Add(key.target, effective_conf, std::move(analysis_result)); @@ -1371,6 +1379,7 @@ void withTargetNode( {}, {}, {}, + {}, TargetGraphInformation::kSource})); } else { @@ -1472,6 +1481,7 @@ void TreeTarget( std::vector{}, std::unordered_set{}, std::set{}, + std::set{}, TargetGraphInformation::kSource); analysis_result = result_map->Add(key.target, {}, std::move(analysis_result)); @@ -1557,6 +1567,7 @@ void TreeTarget( std::vector{tree}, std::unordered_set{}, std::set{}, + std::set{}, TargetGraphInformation::kSource); analysis_result = result_map->Add( key.target, {}, std::move(analysis_result)); @@ -1590,6 +1601,7 @@ void GlobResult(const std::vector& values, std::vector{}, std::unordered_set{}, std::set{}, + std::set{}, TargetGraphInformation::kSource); (*setter)(std::move(target)); } diff --git a/src/buildtool/main/analyse.cpp b/src/buildtool/main/analyse.cpp index 8b69daeb..19656b81 100644 --- a/src/buildtool/main/analyse.cpp +++ b/src/buildtool/main/analyse.cpp @@ -126,6 +126,7 @@ void DetectAndReportPending(std::string const& name, target->Trees(), target->Vars(), target->Tainted(), + target->ImpliedExport(), target->GraphInformation()); } -- cgit v1.2.3