104 for (
int index = 0; index <
length_; index++) {
107 << std::setw(6) << std::hex << entry.
pc() << std::dec;
110 os <<
" slots (sp->fp): ";
114 os << ((bits >> bit) & 1);
126 os <<
" registers: ";
129 for (
int j = bits - 1; j >= 0; --j) {
130 os << ((register_bits >> j) & 1);
136 <<
" trampoline: " << std::setw(6) << std::hex
166 DCHECK_LT(max_stack_index_, stack_slot_count);
170 int last_trampoline = -1;
177 DCHECK_LT(last_trampoline, entry.trampoline);
179 last_trampoline = entry.trampoline;
193#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64
200 assembler->RecordComment(
";;; Safepoint table.");
204 int used_register_indexes = 0;
210 used_register_indexes |= entry.register_indexes;
211 max_pc = std::max(max_pc, std::max(entry.pc, entry.trampoline));
212 max_deopt_index = std::max(max_deopt_index, entry.deopt_index);
216 auto value_to_bytes = [](
int value) {
218 if (value == 0)
return 0;
219 if (value <= 0xff)
return 1;
220 if (value <= 0xffff)
return 2;
221 if (value <= 0xffffff)
return 3;
224 bool has_deopt_data = max_deopt_index != -1;
225 int register_indexes_size = value_to_bytes(used_register_indexes);
230 int pc_size = value_to_bytes(max_pc + 1);
231 int deopt_index_size = value_to_bytes(max_deopt_index + 1);
232 int tagged_slots_bytes =
238 register_indexes_size));
243 uint32_t entry_configuration =
251 static_assert(SafepointTable::kStackSlotsOffset == 0 *
kIntSize);
252 static_assert(SafepointTable::kLengthOffset == 1 *
kIntSize);
253 static_assert(SafepointTable::kEntryConfigurationOffset == 2 *
kIntSize);
254 static_assert(SafepointTable::kHeaderSize == 3 *
kIntSize);
255 int length =
static_cast<int>(
entries_.size());
256 assembler->dd(stack_slot_count);
257 assembler->dd(length);
258 assembler->dd(entry_configuration);
262 for (; bytes > 0; --bytes, value >>= 8) assembler->db(value);
267 emit_bytes(entry.pc, pc_size);
268 if (has_deopt_data) {
273 emit_bytes(entry.deopt_index + 1, deopt_index_size);
274 emit_bytes(entry.trampoline + 1, pc_size);
276 emit_bytes(entry.register_indexes, register_indexes_size);
284 std::fill(bits.begin(), bits.end(), 0);
287 for (
int idx : *entry.stack_indexes) {
291 DCHECK_GT(tagged_slots_size, adjusted_idx);
292 int index = tagged_slots_size - 1 - adjusted_idx;
295 bits[byte_index] |= (1u << bit_index);
299 for (uint8_t
byte : bits) assembler->db(
byte);
static constexpr int kNoDeoptIndex
bool has_deoptimization_index() const
int deoptimization_index() const
int trampoline_pc() const
static constexpr int kNoTrampolinePC
base::Vector< const uint8_t > tagged_slots() const
uint32_t tagged_register_indexes() const
GrowableBitVector * stack_indexes