| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_LIVE_RANGE_BUILDER_H_ |
| #define V8_LIVE_RANGE_BUILDER_H_ |
| |
| #include "src/compiler/register-allocator.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| |
| // Utility offering shorthand syntax for building up a range by providing its ID |
| // and pairs (start, end) specifying intervals. Circumvents current incomplete |
| // support for C++ features such as instantiation lists, on OS X and Android. |
| class TestRangeBuilder { |
| public: |
| explicit TestRangeBuilder(Zone* zone) |
| : id_(-1), pairs_(), uses_(), zone_(zone) {} |
| |
| TestRangeBuilder& Id(int id) { |
| id_ = id; |
| return *this; |
| } |
| TestRangeBuilder& Add(int start, int end) { |
| pairs_.push_back({start, end}); |
| return *this; |
| } |
| |
| TestRangeBuilder& AddUse(int pos) { |
| uses_.insert(pos); |
| return *this; |
| } |
| |
| TopLevelLiveRange* Build(int start, int end) { |
| return Add(start, end).Build(); |
| } |
| |
| TopLevelLiveRange* Build() { |
| TopLevelLiveRange* range = |
| new (zone_) TopLevelLiveRange(id_, MachineRepresentation::kTagged); |
| // Traverse the provided interval specifications backwards, because that is |
| // what LiveRange expects. |
| for (int i = static_cast<int>(pairs_.size()) - 1; i >= 0; --i) { |
| Interval pair = pairs_[i]; |
| LifetimePosition start = LifetimePosition::FromInt(pair.first); |
| LifetimePosition end = LifetimePosition::FromInt(pair.second); |
| CHECK(start < end); |
| range->AddUseInterval(start, end, zone_); |
| } |
| for (int pos : uses_) { |
| UsePosition* use_position = |
| new (zone_) UsePosition(LifetimePosition::FromInt(pos), nullptr, |
| nullptr, UsePositionHintType::kNone); |
| range->AddUsePosition(use_position); |
| } |
| |
| pairs_.clear(); |
| return range; |
| } |
| |
| private: |
| typedef std::pair<int, int> Interval; |
| typedef std::vector<Interval> IntervalList; |
| int id_; |
| IntervalList pairs_; |
| std::set<int> uses_; |
| Zone* zone_; |
| }; |
| |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_LIVE_RANGE_BUILDER_H_ |