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