v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
visitors.h
Go to the documentation of this file.
1// Copyright 2017 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_OBJECTS_VISITORS_H_
6#define V8_OBJECTS_VISITORS_H_
7
10#include "src/objects/code.h"
13#include "src/objects/slots.h"
14
15namespace v8 {
16namespace internal {
17
18class Code;
19
20#define ROOT_ID_LIST(V) \
21 V(kBootstrapper, "(Bootstrapper)") \
22 V(kBuiltins, "(Builtins)") \
23 V(kClientHeap, "(Client heap)") \
24 V(kCodeFlusher, "(Code flusher)") \
25 V(kCompilationCache, "(Compilation cache)") \
26 V(kDebug, "(Debugger)") \
27 V(kExtensions, "(Extensions)") \
28 V(kEternalHandles, "(Eternal handles)") \
29 V(kExternalStringsTable, "(External strings)") \
30 V(kGlobalHandles, "(Global handles)") \
31 V(kHandleScope, "(Handle scope)") \
32 V(kMicroTasks, "(Micro tasks)") \
33 V(kReadOnlyRootList, "(Read-only roots)") \
34 V(kRelocatable, "(Relocatable)") \
35 V(kRetainMaps, "(Retain maps)") \
36 V(kSharedHeapObjectCache, "(Shareable object cache)") \
37 V(kSharedStructTypeRegistry, "(SharedStruct type registry)") \
38 V(kSmiRootList, "(Smi roots)") \
39 V(kStackRoots, "(Stack roots)") \
40 V(kStartupObjectCache, "(Startup object cache)") \
41 V(kStringTable, "(Internalized strings)") \
42 V(kStrongRootList, "(Strong root list)") \
43 V(kStrongRoots, "(Strong roots)") \
44 V(kThreadManager, "(Thread manager)") \
45 V(kTracedHandles, "(Traced handles)") \
46 V(kWeakRoots, "(Weak roots)") \
47 V(kWriteBarrier, "(Write barrier)")
48
50 public:
51#define DECLARE_ENUM(enum_item, ignore) enum_item,
52 enum SyncTag { ROOT_ID_LIST(DECLARE_ENUM) kNumberOfSyncTags };
53#undef DECLARE_ENUM
54};
55
56enum class Root {
57#define DECLARE_ENUM(enum_item, ignore) enum_item,
59#undef DECLARE_ENUM
61};
62
63// Abstract base class for visiting, and optionally modifying, the
64// pointers contained in roots. Used in GC and serialization/deserialization.
66 public:
67 virtual ~RootVisitor() = default;
68
69 // Visits a contiguous arrays of pointers in the half-open range
70 // [start, end). Any or all of the values may be modified on return.
71 virtual void VisitRootPointers(Root root, const char* description,
73
74 // Handy shorthand for visiting a single pointer.
75 virtual void VisitRootPointer(Root root, const char* description,
77 VisitRootPointers(root, description, p, p + 1);
78 }
79
80 // Visits a contiguous arrays of off-heap pointers in the half-open range
81 // [start, end). Any or all of the values may be modified on return.
82 //
83 // This should be implemented for any visitor that visits off-heap data
84 // structures, of which there are currently only two: the string table and the
85 // shared struct type registry. Visitors for those structures are limited in
86 // scope.
87 //
88 // If we ever add new off-heap data structures that we want to walk as roots
89 // using this function, we should make it generic, by
90 //
91 // 1) Making this function pure virtual, and
92 // 2) Implementing it for all visitors.
93 virtual void VisitRootPointers(Root root, const char* description,
97 }
98
99 // Visits a running Code object and potentially its associated
100 // InstructionStream from the execution stack.
101 virtual void VisitRunningCode(FullObjectSlot code_slot,
102 FullObjectSlot istream_or_smi_zero_slot) {
103 // For most visitors, currently running code is no different than any other
104 // on-stack pointer.
105 VisitRootPointer(Root::kStackRoots, nullptr, istream_or_smi_zero_slot);
106 VisitRootPointer(Root::kStackRoots, nullptr, code_slot);
107 }
108
109 // Intended for serialization/deserialization checking: insert, or
110 // check for the presence of, a tag at this position in the stream.
111 // Also used for marking up GC roots in heap snapshots.
113
114 static const char* RootName(Root root);
115
116 // The type of collector that invokes this visitor. This is used by the
117 // ConservativeStackVisitor to determine which root pointers on the stack
118 // to follow, during conservative stack scanning. For MARK_COMPACTOR (the
119 // default) all pointers are followed, whereas for young generation
120 // collectors only pointers to objects in the young generation are followed.
124};
125
126class RelocIterator;
127
128// Abstract base class for visiting, and optionally modifying, the
129// pointers contained in Objects. Used in GC and serialization/deserialization.
131 public:
132 virtual ~ObjectVisitor() = default;
133
134 // Visits a contiguous arrays of pointers in the half-open range
135 // [start, end). Any or all of the values may be modified on return.
137 ObjectSlot end) = 0;
139 MaybeObjectSlot end) = 0;
140 // When V8_EXTERNAL_CODE_SPACE is enabled, visits an InstructionStream pointer
141 // slot. The values may be modified on return. Not used when
142 // V8_EXTERNAL_CODE_SPACE is not enabled (the InstructionStream pointer slots
143 // are visited as a part of on-heap slot visitation - via VisitPointers()).
145 InstructionStreamSlot slot) = 0;
146
147 // Custom weak pointers must be ignored by the GC but not other
148 // visitors. They're used for e.g., lists that are recreated after GC. The
149 // default implementation treats them as strong pointers. Visitors who want to
150 // ignore them must override this function with empty.
155
156 // Handy shorthand for visiting a single pointer.
158 VisitPointers(host, p, p + 1);
159 }
161 VisitPointers(host, p, p + 1);
162 }
164 VisitCustomWeakPointers(host, p, p + 1);
165 }
166
167 virtual void VisitEphemeron(Tagged<HeapObject> host, int index,
168 ObjectSlot key, ObjectSlot value) {
169 VisitPointer(host, key);
170 VisitPointer(host, value);
171 }
172
173 // Visits the relocation info using the given iterator.
175
177 RelocInfo* rinfo) {}
184 // TODO(ishell): rename to VisitBuiltinEntry.
186 RelocInfo* rinfo) {}
187
190
191 // Same as `VisitExternalPointer` with the difference that the slot's contents
192 // are known to be managed by `CppHeap`.
195
199
204
207
210
212};
213
214// Helper version of ObjectVisitor that also takes care of caching base values
215// of the main pointer compression cage and for the code cage.
217 public:
220 inline explicit ObjectVisitorWithCageBases(Isolate* isolate);
221 inline explicit ObjectVisitorWithCageBases(Heap* heap);
222
223 // The pointer compression cage base value used for decompression of all
224 // tagged values except references to InstructionStream objects.
226#ifdef V8_COMPRESS_POINTERS
227 return cage_base_;
228#else
229 return PtrComprCageBase{};
230#endif // V8_COMPRESS_POINTERS
231 }
232
233 // The pointer compression cage base value used for decompression of
234 // references to InstructionStream objects.
236#ifdef V8_EXTERNAL_CODE_SPACE
237 return code_cage_base_;
238#else
239 return cage_base();
240#endif // V8_EXTERNAL_CODE_SPACE
241 }
242
243 private:
244#ifdef V8_COMPRESS_POINTERS
245 const PtrComprCageBase cage_base_;
246#ifdef V8_EXTERNAL_CODE_SPACE
247 const PtrComprCageBase code_cage_base_;
248#endif // V8_EXTERNAL_CODE_SPACE
249#endif // V8_COMPRESS_POINTERS
250};
251
252// A wrapper class for root visitors that are used by client isolates during a
253// shared garbage collection. The wrapped visitor only visits heap objects in
254// the shared spaces and ignores everything else. The type parameter `Visitor`
255// should be a subclass of `RootVisitor`, or a similar class that provides the
256// required interface.
257template <typename Visitor = RootVisitor>
258class ClientRootVisitor final : public RootVisitor {
259 public:
260 explicit ClientRootVisitor(Visitor* actual_visitor)
261 : actual_visitor_(actual_visitor) {}
262
263 void VisitRootPointers(Root root, const char* description,
265 for (FullObjectSlot p = start; p < end; ++p) {
266 Tagged<Object> object = *p;
267#ifdef V8_ENABLE_DIRECT_HANDLE
268 if (object.ptr() == ValueHelper::kTaggedNullAddress) continue;
269#endif
270 if (!IsSharedHeapObject(object)) continue;
271 actual_visitor_->VisitRootPointer(root, description, p);
272 }
273 }
274
275 void VisitRootPointers(Root root, const char* description,
277 actual_visitor_->VisitRootPointers(root, description, start, end);
278 }
279
280 inline void VisitRunningCode(FullObjectSlot code_slot,
281 FullObjectSlot maybe_istream_slot) final;
282
284 actual_visitor_->Synchronize(tag);
285 }
286
287 private:
288 V8_INLINE static bool IsSharedHeapObject(Tagged<Object> object);
289
290 Visitor* const actual_visitor_;
291};
292
293// A wrapper class for object visitors that are used by client isolates during a
294// shared garbage collection. The wrapped visitor only visits heap objects in
295// the shared spaces and ignores everything else. The type parameter `Visitor`
296// should be a subclass of `ObjectVisitorWithCageBases`, or a similar class that
297// provides the required interface.
298template <typename Visitor = ObjectVisitorWithCageBases>
300 public:
301 explicit ClientObjectVisitor(Visitor* actual_visitor)
302 : ObjectVisitorWithCageBases(actual_visitor->cage_base(),
303 actual_visitor->code_cage_base()),
304 actual_visitor_(actual_visitor) {}
305
307 if (!IsSharedHeapObject(p.load(cage_base()))) return;
308 actual_visitor_->VisitPointer(host, p);
309 }
310
311 inline void VisitMapPointer(Tagged<HeapObject> host) final;
312
314 ObjectSlot end) final {
315 for (ObjectSlot p = start; p < end; ++p) {
316 // The map slot should be handled in VisitMapPointer.
317 DCHECK_NE(host->map_slot(), p);
319 VisitPointer(host, p);
320 }
321 }
322
324 InstructionStreamSlot slot) final;
325
327 MaybeObjectSlot end) final {
328 // At the moment, custom roots cannot contain weak pointers.
329 UNREACHABLE();
330 }
331
333 RelocInfo* rinfo) final;
334
336 RelocInfo* rinfo) final;
337
338 private:
339 V8_INLINE static bool IsSharedHeapObject(Tagged<Object> object);
340
341 Visitor* const actual_visitor_;
342};
343
344} // namespace internal
345} // namespace v8
346
347#endif // V8_OBJECTS_VISITORS_H_
void VisitInstructionStreamPointer(Tagged< Code > host, InstructionStreamSlot slot) final
ClientObjectVisitor(Visitor *actual_visitor)
Definition visitors.h:301
void VisitPointer(Tagged< HeapObject > host, ObjectSlot p) final
Definition visitors.h:306
void VisitMapPointer(Tagged< HeapObject > host) final
void VisitEmbeddedPointer(Tagged< InstructionStream > host, RelocInfo *rinfo) final
void VisitPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end) final
Definition visitors.h:313
void VisitCodeTarget(Tagged< InstructionStream > host, RelocInfo *rinfo) final
static V8_INLINE bool IsSharedHeapObject(Tagged< Object > object)
void VisitPointers(Tagged< HeapObject > host, MaybeObjectSlot start, MaybeObjectSlot end) final
Definition visitors.h:326
ClientRootVisitor(Visitor *actual_visitor)
Definition visitors.h:260
static V8_INLINE bool IsSharedHeapObject(Tagged< Object > object)
void VisitRunningCode(FullObjectSlot code_slot, FullObjectSlot maybe_istream_slot) final
void VisitRootPointers(Root root, const char *description, OffHeapObjectSlot start, OffHeapObjectSlot end) final
Definition visitors.h:275
void Synchronize(VisitorSynchronization::SyncTag tag) final
Definition visitors.h:283
void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end) final
Definition visitors.h:263
PtrComprCageBase code_cage_base() const
Definition visitors.h:235
PtrComprCageBase cage_base() const
Definition visitors.h:225
ObjectVisitorWithCageBases(PtrComprCageBase cage_base, PtrComprCageBase code_cage_base)
virtual void VisitProtectedPointer(Tagged< TrustedObject > host, ProtectedPointerSlot slot)
Definition visitors.h:200
virtual void VisitEmbeddedPointer(Tagged< InstructionStream > host, RelocInfo *rinfo)
Definition visitors.h:178
virtual void VisitExternalReference(Tagged< InstructionStream > host, RelocInfo *rinfo)
Definition visitors.h:180
virtual void VisitCodeTarget(Tagged< InstructionStream > host, RelocInfo *rinfo)
Definition visitors.h:176
virtual void VisitTrustedPointerTableEntry(Tagged< HeapObject > host, IndirectPointerSlot slot)
Definition visitors.h:205
virtual void VisitOffHeapTarget(Tagged< InstructionStream > host, RelocInfo *rinfo)
Definition visitors.h:185
virtual void VisitIndirectPointer(Tagged< HeapObject > host, IndirectPointerSlot slot, IndirectPointerMode mode)
Definition visitors.h:196
virtual void VisitExternalPointer(Tagged< HeapObject > host, ExternalPointerSlot slot)
Definition visitors.h:188
virtual void VisitMapPointer(Tagged< HeapObject > host)
Definition visitors.h:211
virtual void VisitCppHeapPointer(Tagged< HeapObject > host, CppHeapPointerSlot slot)
Definition visitors.h:193
virtual void VisitCustomWeakPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end)
Definition visitors.h:151
virtual void VisitProtectedPointer(Tagged< TrustedObject > host, ProtectedMaybeObjectSlot slot)
Definition visitors.h:202
virtual void VisitPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end)=0
virtual void VisitJSDispatchTableEntry(Tagged< HeapObject > host, JSDispatchHandle handle)
Definition visitors.h:208
virtual void VisitEphemeron(Tagged< HeapObject > host, int index, ObjectSlot key, ObjectSlot value)
Definition visitors.h:167
virtual void VisitPointers(Tagged< HeapObject > host, MaybeObjectSlot start, MaybeObjectSlot end)=0
virtual void VisitPointer(Tagged< HeapObject > host, MaybeObjectSlot p)
Definition visitors.h:160
virtual void VisitCustomWeakPointer(Tagged< HeapObject > host, ObjectSlot p)
Definition visitors.h:163
virtual void VisitPointer(Tagged< HeapObject > host, ObjectSlot p)
Definition visitors.h:157
virtual ~ObjectVisitor()=default
virtual void VisitInternalReference(Tagged< InstructionStream > host, RelocInfo *rinfo)
Definition visitors.h:182
virtual void VisitInstructionStreamPointer(Tagged< Code > host, InstructionStreamSlot slot)=0
void VisitRelocInfo(Tagged< InstructionStream > host, RelocIterator *it)
Definition visitors.cc:30
virtual ~RootVisitor()=default
virtual void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end)=0
static const char * RootName(Root root)
Definition visitors.cc:17
virtual void VisitRunningCode(FullObjectSlot code_slot, FullObjectSlot istream_or_smi_zero_slot)
Definition visitors.h:101
virtual void Synchronize(VisitorSynchronization::SyncTag tag)
Definition visitors.h:112
virtual GarbageCollector collector() const
Definition visitors.h:121
virtual void VisitRootPointers(Root root, const char *description, OffHeapObjectSlot start, OffHeapObjectSlot end)
Definition visitors.h:93
virtual void VisitRootPointer(Root root, const char *description, FullObjectSlot p)
Definition visitors.h:75
int start
int end
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
static V8_INLINE bool HasWeakHeapObjectTag(const Tagged< Object > value)
Definition objects.h:653
DECLARE_ENUM(enum_item, ignore)
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define V8_INLINE
Definition v8config.h:500
#define ROOT_ID_LIST(V)
Definition visitors.h:20