131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
2a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Redistribution and use in source and binary forms, with or without
3a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// modification, are permitted provided that the following conditions are
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// met:
5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions of source code must retain the above copyright
7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
8a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions in binary form must reproduce the above
9a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       copyright notice, this list of conditions and the following
10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       with the distribution.
12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       contributors may be used to endorse or promote products derived
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       from this software without specific prior written permission.
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
28a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifndef V8_SAFEPOINT_TABLE_H_
29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define V8_SAFEPOINT_TABLE_H_
30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h"
32c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#include "heap.h"
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "v8memory.h"
34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "zone.h"
35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
37a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
39c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgstruct Register;
40c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
41c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgclass SafepointEntry BASE_EMBEDDED {
42c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
43c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SafepointEntry() : info_(0), bits_(NULL) {}
44c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
45c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SafepointEntry(unsigned info, uint8_t* bits) : info_(info), bits_(bits) {
46c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(is_valid());
47c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
48c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
49c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool is_valid() const { return bits_ != NULL; }
50c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
51c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool Equals(const SafepointEntry& other) const {
52c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return info_ == other.info_ && bits_ == other.bits_;
53c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
54c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
55c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void Reset() {
56c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    info_ = 0;
57c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    bits_ = NULL;
58c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
59c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
60c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int deoptimization_index() const {
61c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(is_valid());
62c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return DeoptimizationIndexField::decode(info_);
63c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
64c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
6527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  static const int kArgumentsFieldBits = 3;
6627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  static const int kSaveDoublesFieldBits = 1;
6727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  static const int kDeoptIndexBits =
6827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org      32 - kArgumentsFieldBits - kSaveDoublesFieldBits;
6927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  class DeoptimizationIndexField:
7027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    public BitField<int, 0, kDeoptIndexBits> {};  // NOLINT
7127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  class ArgumentsField:
7227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    public BitField<unsigned,
7327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                    kDeoptIndexBits,
7427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                    kArgumentsFieldBits> {};  // NOLINT
7527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  class SaveDoublesField:
7627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    public BitField<bool,
7727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                    kDeoptIndexBits + kArgumentsFieldBits,
7827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                    kSaveDoublesFieldBits> { }; // NOLINT
79c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
80c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int argument_count() const {
81c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(is_valid());
82c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return ArgumentsField::decode(info_);
83c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
84c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
85c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool has_doubles() const {
86c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(is_valid());
87c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return SaveDoublesField::decode(info_);
88c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
89c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
90c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  uint8_t* bits() {
91c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(is_valid());
92c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return bits_;
93c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
94c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
95c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool HasRegisters() const;
96c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool HasRegisterAt(int reg_index) const;
97c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
98c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
99c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  unsigned info_;
100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  uint8_t* bits_;
101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass SafepointTable BASE_EMBEDDED {
105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  explicit SafepointTable(Code* code);
107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int size() const {
109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return kHeaderSize +
110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org           (length_ * (kPcAndDeoptimizationIndexSize + entry_size_)); }
111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned length() const { return length_; }
112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned entry_size() const { return entry_size_; }
113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned GetPcOffset(unsigned index) const {
115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(index < length_);
116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return Memory::uint32_at(GetPcOffsetLocation(index));
117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
119c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SafepointEntry GetEntry(unsigned index) const {
120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(index < length_);
121c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    unsigned info = Memory::uint32_at(GetInfoLocation(index));
122c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    uint8_t* bits = &Memory::uint8_at(entries_ + (index * entry_size_));
123c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return SafepointEntry(info, bits);
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
126c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Returns the entry for the given pc.
127c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SafepointEntry FindEntry(Address pc) const;
128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void PrintEntry(unsigned index) const;
130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private:
132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const uint8_t kNoRegisters = 0xFF;
133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kLengthOffset = 0;
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kEntrySizeOffset = kLengthOffset + kIntSize;
136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kHeaderSize = kEntrySizeOffset + kIntSize;
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kPcSize = kIntSize;
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kDeoptimizationIndexSize = kIntSize;
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static const int kPcAndDeoptimizationIndexSize =
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      kPcSize + kDeoptimizationIndexSize;
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Address GetPcOffsetLocation(unsigned index) const {
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return pc_and_deoptimization_indexes_ +
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org           (index * kPcAndDeoptimizationIndexSize);
146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
148c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Address GetInfoLocation(unsigned index) const {
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return GetPcOffsetLocation(index) + kPcSize;
150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static void PrintBits(uint8_t byte, int digits);
153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_allocation_;
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Code* code_;
156a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned length_;
157a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned entry_size_;
158a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Address pc_and_deoptimization_indexes_;
160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Address entries_;
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  friend class SafepointTableBuilder;
163c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  friend class SafepointEntry;
164c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
165c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(SafepointTable);
166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass Safepoint BASE_EMBEDDED {
170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
171378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  typedef enum {
172378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    kSimple = 0,
173378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    kWithRegisters = 1 << 0,
174378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    kWithDoubles = 1 << 1,
175378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    kWithRegistersAndDoubles = kWithRegisters | kWithDoubles
176378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  } Kind;
177378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
17827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  enum DeoptMode {
17927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    kNoLazyDeopt,
18027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    kLazyDeopt
18127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  };
18227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org
183c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  static const int kNoDeoptimizationIndex =
184c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      (1 << (SafepointEntry::kDeoptIndexBits)) - 1;
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
186400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  void DefinePointerSlot(int index, Zone* zone) { indexes_->Add(index, zone); }
1877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void DefinePointerRegister(Register reg, Zone* zone);
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private:
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Safepoint(ZoneList<int>* indexes, ZoneList<int>* registers) :
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      indexes_(indexes), registers_(registers) { }
192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<int>* indexes_;
193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<int>* registers_;
194a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
195a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  friend class SafepointTableBuilder;
196a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
198a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
199a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass SafepointTableBuilder BASE_EMBEDDED {
200a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
201400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  explicit SafepointTableBuilder(Zone* zone)
202400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org      : deoptimization_info_(32, zone),
203400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org        deopt_index_list_(32, zone),
204400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org        indexes_(32, zone),
205400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org        registers_(32, zone),
20627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org        emitted_(false),
207400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org        last_lazy_safepoint_(0),
208400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org        zone_(zone) { }
209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Get the offset of the emitted safepoint table in the code.
211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned GetCodeOffset() const;
212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Define a new safepoint for the current position in the body.
21431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  Safepoint DefineSafepoint(Assembler* assembler,
21531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                            Safepoint::Kind kind,
21631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                            int arguments,
21727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                            Safepoint::DeoptMode mode);
218a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
21927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // Record deoptimization index for lazy deoptimization for the last
22027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // outstanding safepoints.
22127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void RecordLazyDeoptimizationIndex(int index);
222eb96f4fd17b379ad2247264f82af1100f448779bricow@chromium.org
223a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Emit the safepoint table after the body. The number of bits per
224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // entry must be enough to hold all the pointer indexes.
225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void Emit(Assembler* assembler, int bits_per_entry);
226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
22783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private:
229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  struct DeoptimizationInfo {
230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    unsigned pc;
231c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    unsigned arguments;
232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    bool has_doubles;
233a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  };
234a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
23527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  uint32_t EncodeExceptPC(const DeoptimizationInfo& info, unsigned index);
236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<DeoptimizationInfo> deoptimization_info_;
23827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  ZoneList<unsigned> deopt_index_list_;
239a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<ZoneList<int>*> indexes_;
240a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<ZoneList<int>*> registers_;
241a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  unsigned offset_;
24383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  bool emitted_;
24427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  int last_lazy_safepoint_;
245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
246400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  Zone* zone_;
247400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org
248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  DISALLOW_COPY_AND_ASSIGN(SafepointTableBuilder);
249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
251a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
253a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif  // V8_SAFEPOINT_TABLE_H_
254