11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_SAFEPOINT_TABLE_H_
29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_SAFEPOINT_TABLE_H_
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
32b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "heap.h"
3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "v8memory.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone.h"
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
39b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochstruct Register;
40b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
41b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass SafepointEntry BASE_EMBEDDED {
42b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
43b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SafepointEntry() : info_(0), bits_(NULL) {}
44b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
45b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SafepointEntry(unsigned info, uint8_t* bits) : info_(info), bits_(bits) {
46b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(is_valid());
47b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool is_valid() const { return bits_ != NULL; }
50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
51b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool Equals(const SafepointEntry& other) const {
52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return info_ == other.info_ && bits_ == other.bits_;
53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void Reset() {
56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    info_ = 0;
57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    bits_ = NULL;
58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int deoptimization_index() const {
61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(is_valid());
62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return DeoptimizationIndexField::decode(info_);
63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
652b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  static const int kArgumentsFieldBits = 3;
662b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  static const int kSaveDoublesFieldBits = 1;
672b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  static const int kDeoptIndexBits =
682b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch      32 - kArgumentsFieldBits - kSaveDoublesFieldBits;
692b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  class DeoptimizationIndexField:
702b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    public BitField<int, 0, kDeoptIndexBits> {};  // NOLINT
712b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  class ArgumentsField:
722b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    public BitField<unsigned,
732b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch                    kDeoptIndexBits,
742b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch                    kArgumentsFieldBits> {};  // NOLINT
752b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  class SaveDoublesField:
762b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    public BitField<bool,
772b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch                    kDeoptIndexBits + kArgumentsFieldBits,
782b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch                    kSaveDoublesFieldBits> { }; // NOLINT
79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int argument_count() const {
81b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(is_valid());
82b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return ArgumentsField::decode(info_);
83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool has_doubles() const {
86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(is_valid());
87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return SaveDoublesField::decode(info_);
88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  uint8_t* bits() {
91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(is_valid());
92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return bits_;
93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool HasRegisters() const;
96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool HasRegisterAt(int reg_index) const;
97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  unsigned info_;
100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  uint8_t* bits_;
101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass SafepointTable BASE_EMBEDDED {
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit SafepointTable(Code* code);
107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int size() const {
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kHeaderSize +
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           (length_ * (kPcAndDeoptimizationIndexSize + entry_size_)); }
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned length() const { return length_; }
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned entry_size() const { return entry_size_; }
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned GetPcOffset(unsigned index) const {
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(index < length_);
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Memory::uint32_at(GetPcOffsetLocation(index));
117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SafepointEntry GetEntry(unsigned index) const {
120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(index < length_);
121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned info = Memory::uint32_at(GetInfoLocation(index));
122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    uint8_t* bits = &Memory::uint8_at(entries_ + (index * entry_size_));
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return SafepointEntry(info, bits);
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Returns the entry for the given pc.
127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SafepointEntry FindEntry(Address pc) const;
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void PrintEntry(unsigned index) const;
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const uint8_t kNoRegisters = 0xFF;
133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kLengthOffset = 0;
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kEntrySizeOffset = kLengthOffset + kIntSize;
136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kHeaderSize = kEntrySizeOffset + kIntSize;
137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kPcSize = kIntSize;
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kDeoptimizationIndexSize = kIntSize;
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kPcAndDeoptimizationIndexSize =
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      kPcSize + kDeoptimizationIndexSize;
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Address GetPcOffsetLocation(unsigned index) const {
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return pc_and_deoptimization_indexes_ +
145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           (index * kPcAndDeoptimizationIndexSize);
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Address GetInfoLocation(unsigned index) const {
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return GetPcOffsetLocation(index) + kPcSize;
150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static void PrintBits(uint8_t byte, int digits);
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  AssertNoAllocation no_allocation_;
155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Code* code_;
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned length_;
157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned entry_size_;
158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Address pc_and_deoptimization_indexes_;
160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Address entries_;
161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  friend class SafepointTableBuilder;
163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  friend class SafepointEntry;
164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SafepointTable);
166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Safepoint BASE_EMBEDDED {
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  typedef enum {
1721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kSimple = 0,
1731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kWithRegisters = 1 << 0,
1741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kWithDoubles = 1 << 1,
1751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kWithRegistersAndDoubles = kWithRegisters | kWithDoubles
1761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } Kind;
1771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1782b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  enum DeoptMode {
1792b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    kNoLazyDeopt,
1802b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    kLazyDeopt
1812b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  };
1822b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch
183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  static const int kNoDeoptimizationIndex =
184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      (1 << (SafepointEntry::kDeoptIndexBits)) - 1;
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void DefinePointerSlot(int index) { indexes_->Add(index); }
187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void DefinePointerRegister(Register reg);
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Safepoint(ZoneList<int>* indexes, ZoneList<int>* registers) :
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      indexes_(indexes), registers_(registers) { }
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int>* indexes_;
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int>* registers_;
194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  friend class SafepointTableBuilder;
196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass SafepointTableBuilder BASE_EMBEDDED {
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SafepointTableBuilder()
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : deoptimization_info_(32),
2032b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch        deopt_index_list_(32),
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        indexes_(32),
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        registers_(32),
2062b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch        emitted_(false),
2072b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch        last_lazy_safepoint_(0) { }
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Get the offset of the emitted safepoint table in the code.
210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned GetCodeOffset() const;
211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Define a new safepoint for the current position in the body.
2131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Safepoint DefineSafepoint(Assembler* assembler,
2141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                            Safepoint::Kind kind,
2151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                            int arguments,
2162b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch                            Safepoint::DeoptMode mode);
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2182b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  // Record deoptimization index for lazy deoptimization for the last
2192b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  // outstanding safepoints.
2202b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  void RecordLazyDeoptimizationIndex(int index);
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Emit the safepoint table after the body. The number of bits per
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // entry must be enough to hold all the pointer indexes.
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Emit(Assembler* assembler, int bits_per_entry);
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  struct DeoptimizationInfo {
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    unsigned pc;
230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned arguments;
231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    bool has_doubles;
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2342b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  uint32_t EncodeExceptPC(const DeoptimizationInfo& info, unsigned index);
235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<DeoptimizationInfo> deoptimization_info_;
2372b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  ZoneList<unsigned> deopt_index_list_;
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<ZoneList<int>*> indexes_;
239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<ZoneList<int>*> registers_;
240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned offset_;
2421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool emitted_;
2432b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch  int last_lazy_safepoint_;
244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SafepointTableBuilder);
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_SAFEPOINT_TABLE_H_
251