Home | History | Annotate | Download | only in compiler
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_LIVE_RANGE_BUILDER_H_
      6 #define V8_LIVE_RANGE_BUILDER_H_
      7 
      8 #include "src/compiler/register-allocator.h"
      9 
     10 namespace v8 {
     11 namespace internal {
     12 namespace compiler {
     13 
     14 
     15 // Utility offering shorthand syntax for building up a range by providing its ID
     16 // and pairs (start, end) specifying intervals. Circumvents current incomplete
     17 // support for C++ features such as instantiation lists, on OS X and Android.
     18 class TestRangeBuilder {
     19  public:
     20   explicit TestRangeBuilder(Zone* zone)
     21       : id_(-1), pairs_(), uses_(), zone_(zone) {}
     22 
     23   TestRangeBuilder& Id(int id) {
     24     id_ = id;
     25     return *this;
     26   }
     27   TestRangeBuilder& Add(int start, int end) {
     28     pairs_.push_back({start, end});
     29     return *this;
     30   }
     31 
     32   TestRangeBuilder& AddUse(int pos) {
     33     uses_.insert(pos);
     34     return *this;
     35   }
     36 
     37   TopLevelLiveRange* Build(int start, int end) {
     38     return Add(start, end).Build();
     39   }
     40 
     41   TopLevelLiveRange* Build() {
     42     TopLevelLiveRange* range =
     43         new (zone_) TopLevelLiveRange(id_, MachineRepresentation::kTagged);
     44     // Traverse the provided interval specifications backwards, because that is
     45     // what LiveRange expects.
     46     for (int i = static_cast<int>(pairs_.size()) - 1; i >= 0; --i) {
     47       Interval pair = pairs_[i];
     48       LifetimePosition start = LifetimePosition::FromInt(pair.first);
     49       LifetimePosition end = LifetimePosition::FromInt(pair.second);
     50       CHECK(start < end);
     51       range->AddUseInterval(start, end, zone_);
     52     }
     53     for (int pos : uses_) {
     54       UsePosition* use_position =
     55           new (zone_) UsePosition(LifetimePosition::FromInt(pos), nullptr,
     56                                   nullptr, UsePositionHintType::kNone);
     57       range->AddUsePosition(use_position);
     58     }
     59 
     60     pairs_.clear();
     61     return range;
     62   }
     63 
     64  private:
     65   typedef std::pair<int, int> Interval;
     66   typedef std::vector<Interval> IntervalList;
     67   int id_;
     68   IntervalList pairs_;
     69   std::set<int> uses_;
     70   Zone* zone_;
     71 };
     72 
     73 
     74 }  // namespace compiler
     75 }  // namespace internal
     76 }  // namespace v8
     77 
     78 #endif  // V8_LIVE_RANGE_BUILDER_H_
     79