30 Address safepoint_table_address)
32 safepoint_table_address_(safepoint_table_address),
34 safepoint_table_address + kStackSlotsOffset)),
35 length_(
base::Memory<int>(safepoint_table_address + kLengthOffset)),
36 entry_configuration_(
base::Memory<uint32_t>(safepoint_table_address +
37 kEntryConfigurationOffset)),
38 num_tagged_slots_(
base::Memory<uint32_t>(safepoint_table_address +
39 kNumTaggedSlotsOffset)) {}
148 int last_trampoline = -1;
155 DCHECK_LT(last_trampoline, entry.trampoline);
157 last_trampoline = entry.trampoline;
165#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64
172 assembler->RecordComment(
";;; Maglev safepoint table.");
176 int used_register_indexes = 0;
182 used_register_indexes |= entry.tagged_register_indexes;
183 max_pc = std::max(max_pc, std::max(entry.pc, entry.trampoline));
184 max_deopt_index = std::max(max_deopt_index, entry.deopt_index);
188 auto value_to_bytes = [](
int value) {
190 if (value == 0)
return 0;
191 if (value <= 0xff)
return 1;
192 if (value <= 0xffff)
return 2;
193 if (value <= 0xffffff)
return 3;
196 bool has_deopt_data = max_deopt_index != -1;
197 int register_indexes_size = value_to_bytes(used_register_indexes);
202 int pc_size = value_to_bytes(max_pc + 1);
203 int deopt_index_size = value_to_bytes(max_deopt_index + 1);
208 register_indexes_size));
212 uint32_t entry_configuration =
215 register_indexes_size) |
220 static_assert(MaglevSafepointTable::kStackSlotsOffset == 0 *
kIntSize);
221 static_assert(MaglevSafepointTable::kLengthOffset == 1 *
kIntSize);
222 static_assert(MaglevSafepointTable::kEntryConfigurationOffset ==
224 static_assert(MaglevSafepointTable::kNumTaggedSlotsOffset == 3 *
kIntSize);
225 static_assert(MaglevSafepointTable::kHeaderSize == 4 *
kIntSize);
226 int length =
static_cast<int>(
entries_.size());
228 assembler->dd(length);
229 assembler->dd(entry_configuration);
234 for (; bytes > 0; --bytes, value >>= 8) assembler->db(value);
239 emit_bytes(entry.pc, pc_size);
240 if (has_deopt_data) {
245 emit_bytes(entry.deopt_index + 1, deopt_index_size);
246 emit_bytes(entry.trampoline + 1, pc_size);
248 assembler->db(entry.num_extra_spill_slots);
249 emit_bytes(entry.tagged_register_indexes, register_indexes_size);
uint32_t tagged_register_indexes() const
static constexpr int kNoDeoptIndex
uint8_t num_extra_spill_slots() const
static constexpr int kNoTrampolinePC
bool has_deoptimization_index() const
int deoptimization_index() const
int trampoline_pc() const