22using namespace detail;
61 *--
pos_ =
static_cast<uint8_t
>(number);
70 uint8_t* begin_pos =
pos_;
98 last_pc_ =
reinterpret_cast<uint8_t*
>(rinfo->
pc());
104template <
typename RelocInfoT>
113template <
typename RelocInfoT>
123template <
typename RelocInfoT>
125 uint8_t unsigned_b = *
pos_;
126 rinfo_.data_ = unsigned_b;
129template <
typename RelocInfoT>
138 int tag = AdvanceGetTag();
152 AdvanceReadLongPCJump();
157 if (SetMode(rmode)) {
166 if (SetMode(rmode)) {
187 istream->unchecked_relocation_info()->
end(),
188 istream->unchecked_relocation_info()->begin(), mode_mask) {}
193 code_reference.relocation_end(),
194 code_reference.relocation_start(), kAllModesMask) {}
198 :
RelocIterator(embedded_data->InstructionStartOf(code->builtin_id()),
200 code->relocation_start(), mode_mask) {}
204 Address const_pool,
int mode_mask)
206 reloc_info.begin() + reloc_info.size(), reloc_info.begin(),
210 const uint8_t*
pos,
const uint8_t*
end,
223 istream->unchecked_relocation_info()->
end(),
224 istream->unchecked_relocation_info()->begin(), mode_mask) {}
232 reinterpret_cast<
Address>(instructions.begin()),
234 reloc_info.begin() + reloc_info.size(), reloc_info.begin(),
242#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_ARM64) || \
243 defined(V8_TARGET_ARCH_X64)
245#elif defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_MIPS64) || \
246 defined(V8_TARGET_ARCH_PPC64) || defined(V8_TARGET_ARCH_S390X) || \
247 defined(V8_TARGET_ARCH_RISCV64) || defined(V8_TARGET_ARCH_LOONG64) || \
248 defined(V8_TARGET_ARCH_RISCV32)
327#if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X64)
328 static constexpr int kTargetAddressAddressModeMask =
334 static constexpr int kTargetAddressAddressModeMask =
342#ifdef ENABLE_DISASSEMBLER
348 return "compressed embedded object";
350 return "full embedded object";
352 return "code target";
354 return "relative code target";
356 return "external reference";
358 return "internal reference";
360 return "encoded internal reference";
362 return "js dispatch handle";
364 return "off heap target";
366 return "near builtin entry";
368 return "deopt script offset";
370 return "deopt inlining id";
372 return "deopt reason";
374 return "deopt index";
376 return "deopt node id";
378 return "constant pool";
380 return "veneer pool";
382 return "internal wasm call";
384 return "wasm stub call";
386 return "wasm canonical signature id";
388 return "wasm code pointer table entry";
393 return "unknown relocation type";
396void RelocInfo::Print(Isolate* isolate, std::ostream& os) {
397 os << reinterpret_cast<const void*>(
pc_) <<
" " << RelocModeName(
rmode_);
401 os <<
" (" <<
data() <<
")";
412 os <<
" (" << Brief(
target_object(isolate)) <<
" compressed)";
416 ExternalReferenceEncoder ref_encoder(isolate);
425#ifdef V8_ENABLE_LEAPTIERING
447 os <<
") (" <<
reinterpret_cast<const void*
>(
target_address()) <<
")";
449 os <<
" (size " <<
static_cast<int>(
data_) <<
")";
453 if (isolate !=
nullptr) {
460 os << reinterpret_cast<const void*>(addr) <<
")";
469void RelocInfo::Verify(Isolate* isolate) {
486 isolate->heap()->FindCodeForInnerPointer(addr);
487 CHECK_EQ(code.address(), lookup_result->instruction_stream().address());
494 Tagged<Code> lookup_result = isolate->heap()->FindCodeForInnerPointer(
pc);
495 CHECK_GE(target, lookup_result->instruction_start());
496 CHECK_LT(target, lookup_result->instruction_end());
500#ifdef V8_ENABLE_LEAPTIERING
501 JSDispatchTable::Space* space =
502 isolate->heap()->js_dispatch_table_space();
503 JSDispatchTable::Space* ro_space =
504 isolate->read_only_heap()->js_dispatch_table_space();
static void set_uint32_constant_at(Address pc, Address constant_pool, uint32_t new_constant, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
static V8_INLINE void set_target_address_at(Address pc, Address constant_pool, Address target, WritableJitAllocation *jit_allocation, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
static V8_INLINE Address target_address_at(Address pc, Address constant_pool)
static uint32_t uint32_constant_at(Address pc, Address constant_pool)
static constexpr bool IsBuiltinId(Builtin builtin)
static bool IsBuiltin(const Tagged< Code > code)
static V8_EXPORT_PRIVATE const char * name(Builtin builtin)
static Tagged< Code > FromTargetAddress(Address address)
static Tagged< InstructionStream > FromTargetAddress(Address address)
static IsolateGroup * current()
static Builtin TryLookupCode(Isolate *isolate, Address address)
void WriteShortData(uint8_t data_delta)
void WriteModeAndPC(uint32_t pc_delta, RelocInfo::Mode rmode)
void WriteIntData(int data_delta)
void WriteMode(RelocInfo::Mode rmode)
void WriteShortTaggedPC(uint32_t pc_delta, int tag)
void Write(const RelocInfo *rinfo)
static constexpr int kMaxSize
uint32_t WriteLongPCJump(uint32_t pc_delta)
static constexpr bool IsDeoptReason(Mode mode)
V8_INLINE Address target_internal_reference()
static constexpr bool IsConstPool(Mode mode)
static constexpr bool IsDeoptNodeId(Mode mode)
void set_off_heap_target_address(Address target, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
static constexpr bool IsCodeTargetMode(Mode mode)
static constexpr int ModeMask(Mode mode)
V8_INLINE Address target_address()
static constexpr bool IsNearBuiltinEntry(Mode mode)
static constexpr int kMaxCallSize
V8_EXPORT_PRIVATE uint32_t wasm_canonical_sig_id() const
V8_INLINE Address target_internal_reference_address()
static constexpr bool IsWasmCall(Mode mode)
static constexpr bool IsDeoptId(Mode mode)
V8_INLINE Address target_off_heap_target()
static constexpr bool IsWasmStubCall(Mode mode)
static constexpr bool IsJSDispatchHandle(Mode mode)
V8_INLINE Address target_external_reference()
V8_INLINE Tagged< HeapObject > target_object(PtrComprCageBase cage_base)
Address wasm_call_address() const
static bool OffHeapTargetIsCodedSpecially()
V8_INLINE JSDispatchHandle js_dispatch_handle()
@ WASM_CODE_POINTER_TABLE_ENTRY
@ COMPRESSED_EMBEDDED_OBJECT
@ INTERNAL_REFERENCE_ENCODED
bool HasTargetAddressAddress() const
static constexpr bool IsVeneerPool(Mode mode)
static constexpr bool IsDeoptPosition(Mode mode)
Address wasm_stub_call_address() const
void AdvanceReadLongPCJump()
RelocIterator(Tagged< InstructionStream > istream, int mode_mask)
void set_wasm_call_address(Address)
void set_js_dispatch_handle(Tagged< InstructionStream > host, JSDispatchHandle handle, WriteBarrierMode write_barrier_mode=UPDATE_WRITE_BARRIER, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
void set_wasm_stub_call_address(Address)
void set_target_address(Tagged< InstructionStream > host, Address target, WriteBarrierMode write_barrier_mode=UPDATE_WRITE_BARRIER, ICacheFlushMode icache_flush_mode=FLUSH_ICACHE_IF_NEEDED)
WritableJitAllocation & jit_allocation_
void set_wasm_canonical_sig_id(uint32_t)
WritableRelocIterator(WritableJitAllocation &jit_allocation, Tagged< InstructionStream > istream, Address constant_pool, int mode_mask)
static void ForJSDispatchHandle(Tagged< HeapObject > host, JSDispatchHandle handle, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void ForRelocInfo(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
const v8::base::TimeTicks end_
#define EXPORT_TEMPLATE_DEFINE(export)
uint32_t VLQDecodeUnsigned(GetNextFunction &&get_next)
void VLQEncodeUnsigned(Function &&process_byte, uint32_t value)
constexpr int kDefaultTag
constexpr int kCodeTargetTag
constexpr int kWasmStubCallTag
constexpr int kSmallPCDeltaMask
constexpr int kLongTagBits
constexpr int kEmbeddedObjectTag
constexpr int kSmallPCDeltaBits
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr int kBitsPerByte
const char * CodeKindToString(CodeKind kind)
Tagged(T object) -> Tagged< T >
char const * DeoptimizeReasonToString(DeoptimizeReason reason)
constexpr JSDispatchHandle kNullJSDispatchHandle(0)
V8_EXPORT_PRIVATE FlagValues v8_flags
static constexpr Address kNullAddress
constexpr bool is_uintn(int64_t x, unsigned n)
#define DCHECK_LE(v1, v2)
#define CHECK_GE(lhs, rhs)
#define CHECK_LT(lhs, rhs)
#define CHECK_NE(lhs, rhs)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
#define V8_EXPORT_PRIVATE