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