5#ifndef V8_HEAP_CONSERVATIVE_STACK_VISITOR_INL_H_
6#define V8_HEAP_CONSERVATIVE_STACK_VISITOR_INL_H_
22#ifdef V8_COMPRESS_POINTERS
29template <
typename ConcreteVisitor>
32 : cage_base_(isolate),
33#ifdef V8_EXTERNAL_CODE_SPACE
34 code_cage_base_(isolate->code_cage_base()),
35 code_address_region_(isolate->
heap()->code_region()),
37#ifdef V8_ENABLE_SANDBOX
38 trusted_cage_base_(isolate->isolate_data()->trusted_cage_base_address()),
44#ifdef V8_COMPRESS_POINTERS
45template <
typename ConcreteVisitor>
48 if (cage_base == cage_base_) {
51#ifdef V8_EXTERNAL_CODE_SPACE
52 if (cage_base == code_cage_base_) {
56#ifdef V8_ENABLE_SANDBOX
57 if (cage_base == trusted_cage_base_) {
65template <
typename ConcreteVisitor>
68#ifdef V8_COMPRESS_POINTERS
69 DCHECK(IsInterestingCage(cage_base));
75 allocator_->LookupChunkContainingAddressInSafepoint(maybe_inner_ptr);
76 if (chunk ==
nullptr) {
82 if (!ConcreteVisitor::FilterPage(chunk)) {
93 return (!ConcreteVisitor::FilterLargeObject(obj, map_word) ||
111 if (!ConcreteVisitor::FilterNormalObject(obj, map_word, bitmap)) {
114 const int size = obj->SizeFromMap(map_word.
ToMap());
116 if (maybe_inner_ptr < base_ptr + size) {
117 ConcreteVisitor::HandleObjectFound(obj, size, bitmap);
118 return IsFreeSpaceOrFiller(obj, cage_base) ?
kNullAddress : base_ptr;
125template <
typename ConcreteVisitor>
127 const void* pointer) {
128 auto address =
reinterpret_cast<Address>(
const_cast<void*
>(pointer));
129#ifdef V8_COMPRESS_POINTERS
132 [
this](
Address ptr) { VisitConservativelyIfPointer(ptr, cage_base_); });
133 if constexpr (ConcreteVisitor::kOnlyVisitMainV8Cage) {
136#ifdef V8_EXTERNAL_CODE_SPACE
137 ExternalCodeCompressionScheme::ProcessIntermediatePointers(
138 code_cage_base_, address, [
this](
Address ptr) {
139 VisitConservativelyIfPointer(ptr, code_cage_base_);
142#ifdef V8_ENABLE_SANDBOX
144 trusted_cage_base_, address, [
this](
Address ptr) {
145 VisitConservativelyIfPointer(ptr, trusted_cage_base_);
149 VisitConservativelyIfPointer(address);
153template <
typename ConcreteVisitor>
155 ConcreteVisitor>::VisitConservativelyIfPointer(
Address address) {
156#ifdef V8_COMPRESS_POINTERS
160 cage_base_.address()) {
161 VisitConservativelyIfPointer(address, cage_base_);
162 }
else if constexpr (ConcreteVisitor::kOnlyVisitMainV8Cage) {
164#ifdef V8_EXTERNAL_CODE_SPACE
165 }
else if (code_address_region_.contains(address)) {
166 VisitConservativelyIfPointer(address, code_cage_base_);
169#ifdef V8_ENABLE_SANDBOX
171 trusted_cage_base_.address()) {
172 VisitConservativelyIfPointer(address, trusted_cage_base_);
176 VisitConservativelyIfPointer(address, cage_base_);
180template <
typename ConcreteVisitor>
182 ConcreteVisitor>::VisitConservativelyIfPointer(
Address address,
186 if (
allocator_->IsOutsideAllocatedSpace(address)) {
188 allocator_->LookupChunkContainingAddressInSafepoint(address));
192 Address base_ptr = FindBasePtr(address, cage_base);
RegisterAllocator * allocator_
Address FindBasePtr(Address maybe_inner_ptr, PtrComprCageBase cage_base) const
ConservativeStackVisitorBase(Isolate *isolate, RootVisitor *root_visitor)
void VisitPointer(const void *pointer) final
static Tagged< HeapObject > FromAddress(Address address)
Tagged< Map > ToMap() const
static Address FindPreviousValidObject(const PageMetadata *page, Address maybe_inner_ptr)
V8_INLINE MemoryChunkMetadata * Metadata()
static V8_INLINE void ProcessIntermediatePointers(PtrComprCageBase cage_base, Address raw_value, ProcessPointerCallback callback)
static V8_INLINE constexpr Address GetPtrComprCageBaseAddress(Address on_heap_addr)
#define ALIGN_TO_ALLOCATION_ALIGNMENT(value)
GraphBuildingRootVisitor & root_visitor_
V8_INLINE constexpr bool IsFreeSpaceOrFiller(InstanceType instance_type)
static constexpr Address kNullAddress
static constexpr RelaxedLoadTag kRelaxedLoad
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)