summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/evacuation-verifier.h
blob: 039d793f33db3790ec3b1b3bdbb6f0f1e3880447 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_HEAP_EVACUATION_VERIFIER_H_
#define V8_HEAP_EVACUATION_VERIFIER_H_

#include "src/heap/new-spaces.h"
#include "src/heap/paged-spaces.h"
#include "src/objects/map.h"
#include "src/objects/visitors.h"

namespace v8 {
namespace internal {

#ifdef VERIFY_HEAP

class EvacuationVerifier : public ObjectVisitorWithCageBases,
                           public RootVisitor {
 public:
  virtual void Run() = 0;

  void VisitPointers(HeapObject host, ObjectSlot start,
                     ObjectSlot end) override;

  void VisitPointers(HeapObject host, MaybeObjectSlot start,
                     MaybeObjectSlot end) override;

  void VisitCodePointer(Code host, CodeObjectSlot slot) override;

  void VisitRootPointers(Root root, const char* description,
                         FullObjectSlot start, FullObjectSlot end) override;

  void VisitMapPointer(HeapObject object) override;

 protected:
  explicit EvacuationVerifier(Heap* heap);

  inline Heap* heap() { return heap_; }

  virtual void VerifyMap(Map map) = 0;
  virtual void VerifyPointers(ObjectSlot start, ObjectSlot end) = 0;
  virtual void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) = 0;
  virtual void VerifyCodePointer(CodeObjectSlot slot) = 0;
  virtual void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) = 0;

  void VerifyRoots();
  void VerifyEvacuationOnPage(Address start, Address end);
  void VerifyEvacuation(NewSpace* new_space);
  void VerifyEvacuation(PagedSpaceBase* paged_space);

  Heap* heap_;
};

class FullEvacuationVerifier : public EvacuationVerifier {
 public:
  explicit FullEvacuationVerifier(Heap* heap);

  void Run() override;

 protected:
  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object);

  V8_INLINE bool ShouldVerifyObject(HeapObject heap_object);

  template <typename TSlot>
  void VerifyPointersImpl(TSlot start, TSlot end);

  void VerifyMap(Map map) override;
  void VerifyPointers(ObjectSlot start, ObjectSlot end) override;
  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override;
  void VerifyCodePointer(CodeObjectSlot slot) override;
  void VisitCodeTarget(RelocInfo* rinfo) override;
  void VisitEmbeddedPointer(RelocInfo* rinfo) override;
  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override;
};

class YoungGenerationEvacuationVerifier : public EvacuationVerifier {
 public:
  explicit YoungGenerationEvacuationVerifier(Heap* heap);

  void Run() override;

 protected:
  V8_INLINE void VerifyHeapObjectImpl(HeapObject heap_object);

  template <typename TSlot>
  void VerifyPointersImpl(TSlot start, TSlot end);

  void VerifyMap(Map map) override;
  void VerifyPointers(ObjectSlot start, ObjectSlot end) override;
  void VerifyPointers(MaybeObjectSlot start, MaybeObjectSlot end) override;
  void VerifyCodePointer(CodeObjectSlot slot) override;
  void VisitCodeTarget(RelocInfo* rinfo) override;
  void VisitEmbeddedPointer(RelocInfo* rinfo) override;
  void VerifyRootPointers(FullObjectSlot start, FullObjectSlot end) override;
};

#endif  // VERIFY_HEAP

}  // namespace internal
}  // namespace v8

#endif  // V8_HEAP_EVACUATION_VERIFIER_H_