aboutsummaryrefslogtreecommitdiff
path: root/build2/target.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-11-01 13:00:16 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-11-01 13:00:16 +0200
commiteacf7f7ccd40a56d1fe761d3d30ced6c6acd58da (patch)
tree841a87d57720704654e8e8fa94cecd05c17b6cfa /build2/target.cxx
parent8ba507252cb932023d16e5d4dfef267c039feb78 (diff)
Add support for rule-specific variables, use to fix cc.type data race
Diffstat (limited to 'build2/target.cxx')
-rw-r--r--build2/target.cxx27
1 files changed, 27 insertions, 0 deletions
diff --git a/build2/target.cxx b/build2/target.cxx
index 5d11337..20b9fd6 100644
--- a/build2/target.cxx
+++ b/build2/target.cxx
@@ -192,6 +192,31 @@ namespace build2
return r;
}
+ pair<lookup, size_t> target::opstate::
+ find_original (const variable& var, bool target_only) const
+ {
+ pair<lookup, size_t> r (lookup (), 0);
+
+ ++r.second;
+ {
+ auto p (vars.find (var));
+ if (p.first != nullptr)
+ r.first = lookup (*p.first, p.second, vars);
+ }
+
+ // Delegate to target's find_original().
+ //
+ if (!r.first)
+ {
+ auto p (target_->find_original (var, target_only));
+
+ r.first = move (p.first);
+ r.second = r.first ? r.second + p.second : p.second;
+ }
+
+ return r;
+ }
+
optional<string> target::
split_name (string& v, const location& loc)
{
@@ -366,6 +391,8 @@ namespace build2
{
t->ext_ = &i->first.ext;
t->implied = implied;
+ t->state.data[0].target_ = t;
+ t->state.data[1].target_ = t;
return pair<target&, ulock> (*t, move (ul));
}