11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/safepoint-table.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/deoptimizer.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disasm.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/frames-inl.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h" 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool SafepointEntry::HasRegisters() const { 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_valid()); 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; 21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < num_reg_bytes; i++) { 22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (bits_[i] != SafepointTable::kNoRegisters) return true; 23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return false; 25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 26b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 27b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 28b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool SafepointEntry::HasRegisterAt(int reg_index) const { 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_valid()); 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg_index >= 0 && reg_index < kNumSafepointRegisters); 31b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int byte_index = reg_index >> kBitsPerByteLog2; 32b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int bit_index = reg_index & (kBitsPerByte - 1); 33b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return (bits_[byte_index] & (1 << bit_index)) != 0; 34b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 35b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 36b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochSafepointTable::SafepointTable(Code* code) { 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code->is_crankshafted()); 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch code_ = code; 401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Address header = code->instruction_start() + code->safepoint_table_offset(); 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length_ = Memory::uint32_at(header + kLengthOffset); 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch entry_size_ = Memory::uint32_at(header + kEntrySizeOffset); 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pc_and_deoptimization_indexes_ = header + kHeaderSize; 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch entries_ = pc_and_deoptimization_indexes_ + 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (length_ * kPcAndDeoptimizationIndexSize); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_size_ > 0); 47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch STATIC_ASSERT(SafepointEntry::DeoptimizationIndexField::kMax == 48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Safepoint::kNoDeoptimizationIndex); 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochSafepointEntry SafepointTable::FindEntry(Address pc) const { 53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start()); 54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (unsigned i = 0; i < length(); i++) { 55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // TODO(kasperl): Replace the linear search with binary search. 56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (GetPcOffset(i) == pc_offset) return GetEntry(i); 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return SafepointEntry(); 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid SafepointTable::PrintEntry(unsigned index, 63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ostream& os) const { // NOLINT 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch disasm::NameConverter converter; 65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SafepointEntry entry = GetEntry(index); 66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch uint8_t* bits = entry.bits(); 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Print the stack slot bits. 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (entry_size_ > 0) { 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const int first = kNumSafepointRegisters >> kBitsPerByteLog2; 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int last = entry_size_ - 1; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = first; i < last; i++) PrintBits(os, bits[i], kBitsPerByte); 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int last_bits = code_->stack_slots() - ((last - first) * kBitsPerByte); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintBits(os, bits[last], last_bits); 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Print the registers (if any). 78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!entry.HasRegisters()) return; 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int j = 0; j < kNumSafepointRegisters; j++) { 80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (entry.HasRegisterAt(j)) { 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " | " << converter.NameOfCPURegister(j); 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid SafepointTable::PrintBits(std::ostream& os, // NOLINT 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t byte, int digits) { 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(digits >= 0 && digits <= kBitsPerByte); 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < digits; i++) { 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << (((byte & (1 << i)) == 0) ? "0" : "1"); 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Safepoint::DefinePointerRegister(Register reg, Zone* zone) { 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch registers_->Add(reg.code(), zone); 99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1021e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSafepoint SafepointTableBuilder::DefineSafepoint( 1032b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch Assembler* assembler, 1042b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch Safepoint::Kind kind, 1052b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch int arguments, 1062b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch Safepoint::DeoptMode deopt_mode) { 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(arguments >= 0); 1082b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch DeoptimizationInfo info; 1092b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch info.pc = assembler->pc_offset(); 1102b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch info.arguments = arguments; 1112b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch info.has_doubles = (kind & Safepoint::kWithDoubles); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deoptimization_info_.Add(info, zone_); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deopt_index_list_.Add(Safepoint::kNoDeoptimizationIndex, zone_); 1142b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch if (deopt_mode == Safepoint::kNoLazyDeopt) { 1152b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch last_lazy_safepoint_ = deopt_index_list_.length(); 1162b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch } 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch indexes_.Add(new(zone_) ZoneList<int>(8, zone_), zone_); 1181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block registers_.Add((kind & Safepoint::kWithRegisters) 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? new(zone_) ZoneList<int>(4, zone_) 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : NULL, 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_); 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Safepoint(indexes_.last(), registers_.last()); 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1262b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdochvoid SafepointTableBuilder::RecordLazyDeoptimizationIndex(int index) { 1272b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch while (last_lazy_safepoint_ < deopt_index_list_.length()) { 1282b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch deopt_index_list_[last_lazy_safepoint_++] = index; 1292b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch } 1302b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch} 1312b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochunsigned SafepointTableBuilder::GetCodeOffset() const { 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(emitted_); 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return offset_; 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) { 139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Make sure the safepoint table is properly aligned. Pad with nops. 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->Align(kIntSize); 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->RecordComment(";;; Safepoint table."); 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_ = assembler->pc_offset(); 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Take the register bits into account. 145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bits_per_entry += kNumSafepointRegisters; 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Compute the number of bytes per safepoint entry. 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int bytes_per_entry = 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RoundUp(bits_per_entry, kBitsPerByte) >> kBitsPerByteLog2; 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Emit the table header. 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length = deoptimization_info_.length(); 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->dd(length); 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->dd(bytes_per_entry); 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1562b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch // Emit sorted table of pc offsets together with deoptimization indexes. 157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < length; i++) { 158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->dd(deoptimization_info_[i].pc); 1592b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch assembler->dd(EncodeExceptPC(deoptimization_info_[i], 1602b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch deopt_index_list_[i])); 161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Emit table of bitmaps. 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<uint8_t> bits(bytes_per_entry, zone_); 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < length; i++) { 166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int>* indexes = indexes_[i]; 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int>* registers = registers_[i]; 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bits.Clear(); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bits.AddBlock(0, bytes_per_entry, zone_); 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Run through the registers (if any). 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (registers == NULL) { 174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int j = 0; j < num_reg_bytes; j++) { 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bits[j] = SafepointTable::kNoRegisters; 177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int j = 0; j < registers->length(); j++) { 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int index = registers->at(j); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index >= 0 && index < kNumSafepointRegisters); 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int byte_index = index >> kBitsPerByteLog2; 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int bit_index = index & (kBitsPerByte - 1); 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bits[byte_index] |= (1 << bit_index); 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Run through the indexes and build a bitmap. 189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int j = 0; j < indexes->length(); j++) { 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int index = bits_per_entry - 1 - indexes->at(j); 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int byte_index = index >> kBitsPerByteLog2; 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int bit_index = index & (kBitsPerByte - 1); 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bits[byte_index] |= (1U << bit_index); 194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Emit the bitmap for the current entry. 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int k = 0; k < bytes_per_entry; k++) { 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assembler->db(bits[k]); 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emitted_ = true; 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2052b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdochuint32_t SafepointTableBuilder::EncodeExceptPC(const DeoptimizationInfo& info, 2062b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch unsigned index) { 207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index); 208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch encoding |= SafepointEntry::ArgumentsField::encode(info.arguments); 209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles); 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return encoding; 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 216