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