131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/safepoint-table.h"
8c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disasm.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h"
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
18c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
19c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgbool SafepointEntry::HasRegisters() const {
20e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_valid());
21e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte));
22c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2;
23c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  for (int i = 0; i < num_reg_bytes; i++) {
24c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    if (bits_[i] != SafepointTable::kNoRegisters) return true;
25c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
26c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return false;
27c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
28c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
29c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
30c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgbool SafepointEntry::HasRegisterAt(int reg_index) const {
31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_valid());
32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(reg_index >= 0 && reg_index < kNumSafepointRegisters);
33c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int byte_index = reg_index >> kBitsPerByteLog2;
34c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int bit_index = reg_index & (kBitsPerByte - 1);
35c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return (bits_[byte_index] & (1 << bit_index)) != 0;
36c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
37c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
38c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgSafepointTable::SafepointTable(Code* code) {
40e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(code->is_crankshafted());
41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  code_ = code;
4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  Address header = code->instruction_start() + code->safepoint_table_offset();
43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  length_ = Memory::uint32_at(header + kLengthOffset);
44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  entry_size_ = Memory::uint32_at(header + kEntrySizeOffset);
45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  pc_and_deoptimization_indexes_ = header + kHeaderSize;
469e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  entries_ = pc_and_deoptimization_indexes_ +
479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org             (length_ * kPcAndDeoptimizationIndexSize);
48e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(entry_size_ > 0);
4983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  STATIC_ASSERT(SafepointEntry::DeoptimizationIndexField::kMax ==
5083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org                Safepoint::kNoDeoptimizationIndex);
51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
54c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgSafepointEntry SafepointTable::FindEntry(Address pc) const {
55c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start());
56c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  for (unsigned i = 0; i < length(); i++) {
57c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    // TODO(kasperl): Replace the linear search with binary search.
58c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    if (GetPcOffset(i) == pc_offset) return GetEntry(i);
59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
60c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return SafepointEntry();
61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
64f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgvoid SafepointTable::PrintEntry(unsigned index, OStream& os) const {  // NOLINT
65a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  disasm::NameConverter converter;
66c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SafepointEntry entry = GetEntry(index);
67c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  uint8_t* bits = entry.bits();
68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
69a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Print the stack slot bits.
70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (entry_size_ > 0) {
71e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte));
72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    const int first = kNumSafepointRegisters >> kBitsPerByteLog2;
73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    int last = entry_size_ - 1;
74f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    for (int i = first; i < last; i++) PrintBits(os, bits[i], kBitsPerByte);
75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    int last_bits = code_->stack_slots() - ((last - first) * kBitsPerByte);
76f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    PrintBits(os, bits[last], last_bits);
77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Print the registers (if any).
79c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    if (!entry.HasRegisters()) return;
80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < kNumSafepointRegisters; j++) {
81c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      if (entry.HasRegisterAt(j)) {
82f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        os << " | " << converter.NameOfCPURegister(j);
83a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
86a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
87a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
88a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
89f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgvoid SafepointTable::PrintBits(OStream& os,  // NOLINT
90f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org                               uint8_t byte, int digits) {
91e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(digits >= 0 && digits <= kBitsPerByte);
92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < digits; i++) {
93f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << (((byte & (1 << i)) == 0) ? "0" : "1");
94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid Safepoint::DefinePointerRegister(Register reg, Zone* zone) {
997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  registers_->Add(reg.code(), zone);
100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
103378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgSafepoint SafepointTableBuilder::DefineSafepoint(
10427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    Assembler* assembler,
10527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    Safepoint::Kind kind,
10627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    int arguments,
10727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    Safepoint::DeoptMode deopt_mode) {
108e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(arguments >= 0);
10927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  DeoptimizationInfo info;
11027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  info.pc = assembler->pc_offset();
11127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  info.arguments = arguments;
11227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  info.has_doubles = (kind & Safepoint::kWithDoubles);
1137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  deoptimization_info_.Add(info, zone_);
1147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  deopt_index_list_.Add(Safepoint::kNoDeoptimizationIndex, zone_);
11527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  if (deopt_mode == Safepoint::kNoLazyDeopt) {
11627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    last_lazy_safepoint_ = deopt_index_list_.length();
11727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  }
1187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  indexes_.Add(new(zone_) ZoneList<int>(8, zone_), zone_);
119378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  registers_.Add((kind & Safepoint::kWithRegisters)
1207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      ? new(zone_) ZoneList<int>(4, zone_)
1217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      : NULL,
1227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      zone_);
1239e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  return Safepoint(indexes_.last(), registers_.last());
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
12727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgvoid SafepointTableBuilder::RecordLazyDeoptimizationIndex(int index) {
12827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  while (last_lazy_safepoint_ < deopt_index_list_.length()) {
12927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    deopt_index_list_[last_lazy_safepoint_++] = index;
13027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  }
13127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org}
13227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org
133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgunsigned SafepointTableBuilder::GetCodeOffset() const {
134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(emitted_);
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return offset_;
136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) {
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Make sure the safepoint table is properly aligned. Pad with nops.
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assembler->Align(kIntSize);
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assembler->RecordComment(";;; Safepoint table.");
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  offset_ = assembler->pc_offset();
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Take the register bits into account.
146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bits_per_entry += kNumSafepointRegisters;
147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Compute the number of bytes per safepoint entry.
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int bytes_per_entry =
150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      RoundUp(bits_per_entry, kBitsPerByte) >> kBitsPerByteLog2;
151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Emit the table header.
153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int length = deoptimization_info_.length();
154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assembler->dd(length);
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  assembler->dd(bytes_per_entry);
156a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // Emit sorted table of pc offsets together with deoptimization indexes.
158a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < length; i++) {
159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    assembler->dd(deoptimization_info_[i].pc);
16027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org    assembler->dd(EncodeExceptPC(deoptimization_info_[i],
16127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                 deopt_index_list_[i]));
162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Emit table of bitmaps.
1657028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneList<uint8_t> bits(bytes_per_entry, zone_);
166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < length; i++) {
167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ZoneList<int>* indexes = indexes_[i];
168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ZoneList<int>* registers = registers_[i];
169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    bits.Clear();
1707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    bits.AddBlock(0, bytes_per_entry, zone_);
171a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Run through the registers (if any).
173e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte));
174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (registers == NULL) {
175a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2;
176a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      for (int j = 0; j < num_reg_bytes; j++) {
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        bits[j] = SafepointTable::kNoRegisters;
178a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      for (int j = 0; j < registers->length(); j++) {
181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        int index = registers->at(j);
182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(index >= 0 && index < kNumSafepointRegisters);
183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        int byte_index = index >> kBitsPerByteLog2;
184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        int bit_index = index & (kBitsPerByte - 1);
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        bits[byte_index] |= (1 << bit_index);
186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Run through the indexes and build a bitmap.
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < indexes->length(); j++) {
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      int index = bits_per_entry - 1 - indexes->at(j);
192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      int byte_index = index >> kBitsPerByteLog2;
193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      int bit_index = index & (kBitsPerByte - 1);
194a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      bits[byte_index] |= (1U << bit_index);
195a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
196a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Emit the bitmap for the current entry.
198a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int k = 0; k < bytes_per_entry; k++) {
199a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      assembler->db(bits[k]);
200a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
201a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
202a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  emitted_ = true;
203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
205a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
20627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orguint32_t SafepointTableBuilder::EncodeExceptPC(const DeoptimizationInfo& info,
20727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                               unsigned index) {
208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index);
209c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  encoding |= SafepointEntry::ArgumentsField::encode(info.arguments);
210c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles);
211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return encoding;
212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
21583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
217