5#ifndef V8_HEAP_MARK_COMPACT_H_
6#define V8_HEAP_MARK_COMPACT_H_
24class HeapObjectVisitor;
25class LargeObjectSpace;
26class LargePageMetadata;
27class MainMarkingVisitor;
28class MarkCompactCollector;
29class RecordMigratedSlotVisitor;
117 std::shared_ptr<::heap::base::IncrementalMarkingSchedule>
schedule = {});
138 template <
typename THeapObjectSlot>
140 THeapObjectSlot slot,
142 template <
typename THeapObjectSlot>
144 THeapObjectSlot slot,
156 bool in_use() {
return state_ > PREPARE_GC; }
157 bool are_map_pointers_encoded() {
return state_ == UPDATE_POINTERS; }
162 void VerifyMarkbitsAreClean();
163 void VerifyMarkbitsAreClean(PagedSpaceBase* space);
164 void VerifyMarkbitsAreClean(NewSpace* space);
165 void VerifyMarkbitsAreClean(LargeObjectSpace* space);
198 int* target_fragmentation_percent,
199 size_t* max_evacuated_bytes);
306 bool bytecode_already_decompiled);
308#ifndef V8_ENABLE_LEAPTIERING
325 int num_transitions);
342 template <
typename TObjectAndSlot,
typename TMaybeSlot>
387 int descriptors_to_trim);
400 enum CollectorState{
IDLE,
404 ENCODE_FORWARDING_ADDRESSES,
440 std::vector<std::pair<Address, PageMetadata*>>
bool CompactTransitionArray(Tagged< Map > map, Tagged< TransitionArray > transitions, Tagged< DescriptorArray > descriptors)
std::vector< PageMetadata * > aborted_evacuation_candidates_due_to_flags_
KeyToValues key_to_values_
Heap::ResizeNewSpaceMode ResizeNewSpaceMode
bool is_compacting() const
std::pair< size_t, size_t > ProcessMarkingWorklist(v8::base::TimeDelta max_duration, size_t max_bytes_to_process)
void ReportAbortedEvacuationCandidateDueToOOM(Address failed_start, PageMetadata *page)
WeakObjects weak_objects_
void UpdatePointersAfterEvacuation()
void ClearPotentialSimpleMapTransition(Tagged< Map > dead_target)
void StartSweepNewSpace()
void ClearNonLiveReferences()
V8_INLINE void MarkObject(Tagged< HeapObject > host, Tagged< HeapObject > obj, MarkingHelper::WorklistTarget target_worklist)
void MarkTransitiveClosure()
void ResetAndRelinkBlackAllocatedPage(PagedSpace *, PageMetadata *)
void SweepLargeSpace(LargeObjectSpace *space)
void MarkRoots(RootVisitor *root_visitor)
bool use_background_threads_in_cycle_
size_t PostProcessAbortedEvacuationCandidates()
void StartMarking(std::shared_ptr<::heap::base::IncrementalMarkingSchedule > schedule={})
void TrimEnumCache(Tagged< Map > map, Tagged< DescriptorArray > descriptors)
base::EnumSet< CodeFlushMode > code_flush_mode_
void SweepArrayBufferExtensions()
void RecordStrongDescriptorArraysForWeakening(GlobalHandleVector< DescriptorArray > strong_descriptor_arrays)
bool MarkTransitiveClosureUntilFixpoint()
bool have_code_to_deoptimize_
void ProcessOldCodeCandidates()
bool SpecialClearMapSlot(Tagged< HeapObject > host, Tagged< Map > dead_target, HeapObjectSlot slot)
void AddEvacuationCandidate(PageMetadata *p)
NativeContextInferrer native_context_inferrer_
void CollectEvacuationCandidates(PagedSpace *space)
static bool IsUnmarkedSharedHeapObject(Heap *heap, FullObjectSlot p)
void FlushSFI(Tagged< SharedFunctionInfo > sfi, bool bytecode_already_decompiled)
void ClearTrivialWeakReferences()
std::vector< std::pair< Address, PageMetadata * > > aborted_evacuation_candidates_due_to_oom_
void StartSweepSpace(PagedSpace *space)
V8_INLINE void AddTransitionArray(Tagged< TransitionArray > array)
V8_INLINE void MarkRootObject(Root root, Tagged< HeapObject > obj, MarkingHelper::WorklistTarget target_worklist)
void UpdatePointersInClientHeaps()
base::Mutex strong_descriptor_arrays_mutex_
std::vector< GlobalHandleVector< DescriptorArray > > strong_descriptor_arrays_
const bool is_shared_space_isolate_
std::vector< PageMetadata * > evacuation_candidates_
void ComputeEvacuationHeuristics(size_t area_size, int *target_fragmentation_percent, size_t *max_evacuated_bytes)
MarkingWorklists * marking_worklists()
static bool IsOnEvacuationCandidate(Tagged< MaybeObject > obj)
void MarkDependentCodeForDeoptimization()
void WeakenStrongDescriptorArrays()
bool ProcessEphemeron(Tagged< HeapObject > key, Tagged< HeapObject > value)
void ClearWeakReferences(WeakObjects::WeakObjectWorklist< TObjectAndSlot >::Local &worklist, Tagged< HeapObjectReference > cleared_weak_ref)
void TrimDescriptorArray(Tagged< Map > map, Tagged< DescriptorArray > descriptors)
const bool uses_shared_heap_
std::unique_ptr< MarkingWorklists::Local > local_marking_worklists_
WeakObjects * weak_objects()
void EvacuatePagesInParallel()
MarkingWorklists marking_worklists_
bool TransitionArrayNeedsCompaction(Tagged< TransitionArray > transitions, int num_transitions)
@ kIncrementalMarkingStep
void ClearWeakCollections()
void UpdatePointersInPointerTables()
void ReportAbortedEvacuationCandidateDueToFlags(PageMetadata *page, MemoryChunk *chunk)
std::vector< PageMetadata * > new_space_evacuation_pages_
void ProcessFlushedBaselineCandidates()
void MaybeEnableBackgroundThreadsInCycle(CallOrigin origin)
MarkingState *const marking_state_
void ClearTrustedWeakReferences()
static V8_INLINE void RecordSlot(MemoryChunk *source_chunk, THeapObjectSlot slot, Tagged< HeapObject > target)
WeakObjects::Local * local_weak_objects()
void FinishConcurrentMarking()
int NumberOfParallelEphemeronVisitingTasks(size_t elements)
std::vector< PageMetadata * > empty_new_space_pages_to_be_swept_
void PerformWrapperTracing()
void RightTrimDescriptorArray(Tagged< DescriptorArray > array, int descriptors_to_trim)
bool UseBackgroundThreadsInCycle() const
static V8_INLINE void RecordSlot(Tagged< HeapObject > object, THeapObjectSlot slot, Tagged< HeapObject > target)
void MarkTransitiveClosureLinear()
void UpdatePointersInClientHeap(Isolate *client)
void ProcessTopOptimizedFrame(ObjectVisitor *visitor, Isolate *isolate)
EphemeronResult ApplyEphemeronSemantics(Tagged< HeapObject > key, Tagged< HeapObject > value)
void MarkObjectsFromClientHeap(Isolate *client)
void VerifyEphemeronMarking()
std::unique_ptr< WeakObjects::Local > local_weak_objects_
MarkingWorklistProcessingMode
@ kProcessRememberedEphemerons
bool StartCompaction(StartCompactionMode mode)
void ClearNonTrivialWeakReferences()
static bool IsUnmarkedHeapObject(Heap *heap, FullObjectSlot p)
void MarkObjectsFromClientHeaps()
static bool ShouldRecordRelocSlot(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > target)
bool ProcessOldBytecodeSFI(Tagged< SharedFunctionInfo > flushing_candidate)
void ClearFullMapTransitions()
void MarkRootsFromConservativeStack(RootVisitor *root_visitor)
bool ProcessOldBaselineSFI(Tagged< SharedFunctionInfo > flushing_candidate)
static const int kEphemeronChunkSize
static RecordRelocSlotInfo ProcessRelocInfo(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > target)
void PinPreciseRootsIfNeeded()
NativeContextStats native_context_stats_
void ReleaseEvacuationCandidates()
static void RecordRelocSlot(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > target)
void FilterNonTrivialWeakReferences()
base::Semaphore page_parallel_job_semaphore_
void ClearFlushedJsFunctions()
std::vector< LargePageMetadata * > promoted_large_pages_
std::unique_ptr< MainMarkingVisitor > marking_visitor_
MarkCompactCollector(Heap *heap)
std::vector< PageMetadata * > old_space_evacuation_pages_
NonAtomicMarkingState *const non_atomic_marking_state_
MarkingWorklists::Local * local_marking_worklists() const
void FlushBytecodeFromSFI(Tagged< SharedFunctionInfo > shared_info)
base::EnumSet< CodeFlushMode > code_flush_mode() const
bool IsEvacuationCandidate() const
static V8_INLINE MemoryChunk * FromAddress(Address addr)
RootMarkingVisitor(const RootMarkingVisitor &)=delete
MarkCompactCollector *const collector_
V8_INLINE void MarkObjectByPointer(Root root, FullObjectSlot p)
V8_INLINE void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end) final
RootMarkingVisitor & operator=(const RootMarkingVisitor &)=delete
V8_INLINE void VisitRootPointer(Root root, const char *description, FullObjectSlot p) final
void VisitRunningCode(FullObjectSlot code_slot, FullObjectSlot istream_or_smi_zero_slot) final
RootMarkingVisitor(MarkCompactCollector *collector)
virtual GarbageCollector collector() const
V8_INLINE constexpr StorageType ptr() const
enum v8::internal::@1270::DeoptimizableCodeIterator::@67 state_
refactor address components for immediate indexing make OptimizeMaglevOnNextCall optimize to turbofan instead of maglev filter for tracing turbofan compilation trace turbo cfg trace TurboFan s graph trimmer trace TurboFan s control equivalence trace TurboFan s register allocator trace stack load store counters for optimized code in run fuzzing &&concurrent_recompilation trace_turbo trace_turbo_scheduled trace_turbo_stack_accesses verify TurboFan machine graph of code stubs enable FixedArray bounds checks print TurboFan statistics of wasm compilations maximum cumulative size of bytecode considered for inlining scale factor of bytecode size used to calculate the inlining budget * KB
absl::flat_hash_map< Tagged< HeapObject >, base::SmallVector< Tagged< HeapObject >, 1 >, Object::Hasher, Object::KeyEqualSafe > KeyToValues
MutablePageMetadata * page_metadata