1/*
2 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_GC_G1_G1HEAPVERIFIER_HPP
26#define SHARE_GC_G1_G1HEAPVERIFIER_HPP
27
28#include "gc/g1/heapRegionSet.hpp"
29#include "gc/shared/verifyOption.hpp"
30#include "memory/allocation.hpp"
31#include "utilities/macros.hpp"
32
33class G1CollectedHeap;
34
35class G1HeapVerifier : public CHeapObj<mtGC> {
36private:
37 static int _enabled_verification_types;
38
39 G1CollectedHeap* _g1h;
40
41 void verify_region_sets();
42
43public:
44 enum G1VerifyType {
45 G1VerifyYoungNormal = 1, // -XX:VerifyGCType=young-normal
46 G1VerifyConcurrentStart = 2, // -XX:VerifyGCType=concurrent-start
47 G1VerifyMixed = 4, // -XX:VerifyGCType=mixed
48 G1VerifyRemark = 8, // -XX:VerifyGCType=remark
49 G1VerifyCleanup = 16, // -XX:VerifyGCType=cleanup
50 G1VerifyFull = 32, // -XX:VerifyGCType=full
51 G1VerifyAll = -1
52 };
53
54 G1HeapVerifier(G1CollectedHeap* heap) : _g1h(heap) {}
55
56 static void enable_verification_type(G1VerifyType type);
57 static bool should_verify(G1VerifyType type);
58
59 // Perform verification.
60
61 // vo == UsePrevMarking -> use "prev" marking information,
62 // vo == UseNextMarking -> use "next" marking information
63 // vo == UseFullMarking -> use "next" marking bitmap but no TAMS
64 //
65 // NOTE: Only the "prev" marking information is guaranteed to be
66 // consistent most of the time, so most calls to this should use
67 // vo == UsePrevMarking.
68 // Currently, there is only one case where this is called with
69 // vo == UseNextMarking, which is to verify the "next" marking
70 // information at the end of remark.
71 // Currently there is only one place where this is called with
72 // vo == UseFullMarking, which is to verify the marking during a
73 // full GC.
74 void verify(VerifyOption vo);
75
76 // verify_region_sets_optional() is planted in the code for
77 // list verification in debug builds.
78 void verify_region_sets_optional() { DEBUG_ONLY(verify_region_sets();) }
79
80 void prepare_for_verify();
81 double verify(G1VerifyType type, VerifyOption vo, const char* msg);
82 void verify_before_gc(G1VerifyType type);
83 void verify_after_gc(G1VerifyType type);
84
85#ifndef PRODUCT
86 // Make sure that the given bitmap has no marked objects in the
87 // range [from,limit). If it does, print an error message and return
88 // false. Otherwise, just return true. bitmap_name should be "prev"
89 // or "next".
90 bool verify_no_bits_over_tams(const char* bitmap_name, const G1CMBitMap* const bitmap,
91 HeapWord* from, HeapWord* limit);
92
93 // Verify that the prev / next bitmap range [tams,end) for the given
94 // region has no marks. Return true if all is well, false if errors
95 // are detected.
96 bool verify_bitmaps(const char* caller, HeapRegion* hr);
97#endif // PRODUCT
98
99 // If G1VerifyBitmaps is set, verify that the marking bitmaps for
100 // the given region do not have any spurious marks. If errors are
101 // detected, print appropriate error messages and crash.
102 void check_bitmaps(const char* caller, HeapRegion* hr) PRODUCT_RETURN;
103
104 // If G1VerifyBitmaps is set, verify that the marking bitmaps do not
105 // have any spurious marks. If errors are detected, print
106 // appropriate error messages and crash.
107 void check_bitmaps(const char* caller) PRODUCT_RETURN;
108
109 // Do sanity check on the contents of the in-cset fast test table.
110 bool check_region_attr_table() PRODUCT_RETURN_( return true; );
111
112 void verify_card_table_cleanup() PRODUCT_RETURN;
113
114 void verify_not_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
115 void verify_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
116 void verify_dirty_young_regions() PRODUCT_RETURN;
117
118 static void verify_ready_for_archiving();
119 static void verify_archive_regions();
120};
121
122#endif // SHARE_GC_G1_G1HEAPVERIFIER_HPP
123