1 /* 2 * Copyright (c) 2017, 2020, Red Hat, Inc. All rights reserved. 3 * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP 27 #define SHARE_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP 28 29 #include "gc/shared/markBitMap.hpp" 30 #include "gc/shenandoah/shenandoahRootVerifier.hpp" 31 #include "memory/allocation.hpp" 32 #include "oops/oopsHierarchy.hpp" 33 #include "utilities/stack.hpp" 34 35 class ShenandoahHeap; 36 class ShenandoahMarkingContext; 37 38 #ifdef _WINDOWS 39 #pragma warning( disable : 4522 ) 40 #endif 41 42 class ShenandoahVerifierTask { 43 public: 44 ShenandoahVerifierTask(oop o = nullptr, int idx = 0): _obj(o) { } 45 ShenandoahVerifierTask(oop o, size_t idx): _obj(o) { } 46 // Trivially copyable. 47 48 inline oop obj() const { return _obj; } 49 50 private: 51 oop _obj; 52 }; 53 54 typedef Stack<ShenandoahVerifierTask, mtGC> ShenandoahVerifierStack; 55 typedef volatile juint ShenandoahLivenessData; 56 57 class ShenandoahVerifier : public CHeapObj<mtGC> { 58 private: 59 ShenandoahHeap* _heap; 60 MarkBitMap* _verification_bit_map; 61 public: 62 typedef enum { 63 // Disable remembered set verification. 64 _verify_remembered_disable, 65 66 // Old objects should be registered and RS cards within *read-only* RS are dirty for all 67 // inter-generational pointers. 68 _verify_remembered_before_marking, 69 70 // Old objects should be registered and RS cards within *read-write* RS are dirty for all 71 // inter-generational pointers. 72 _verify_remembered_before_updating_references, 73 74 // Old objects should be registered and RS cards within *read-write* RS are dirty for all 75 // inter-generational pointers. Differs from previous verification modes by using top instead 76 // of update watermark and not using the marking context. 77 _verify_remembered_after_full_gc 78 } VerifyRememberedSet; 79 80 typedef enum { 81 // Disable marked objects verification. 82 _verify_marked_disable, 83 84 // Objects should be marked in "next" bitmap. 85 _verify_marked_incomplete, 86 87 // Objects should be marked in "complete" bitmap. 88 _verify_marked_complete, 89 90 // Objects should be marked in "complete" bitmap, except j.l.r.Reference referents, which 91 // may be dangling after marking but before conc-weakrefs-processing. 92 _verify_marked_complete_except_references, 93 94 // Objects should be marked in "complete" bitmap, except j.l.r.Reference referents, which 95 // may be dangling after marking but before conc-weakrefs-processing. All SATB buffers must 96 // be empty. 97 _verify_marked_complete_satb_empty, 98 } VerifyMarked; 99 100 typedef enum { 101 // Disable forwarded objects verification. 102 _verify_forwarded_disable, 103 104 // Objects should not have forwardees. 105 _verify_forwarded_none, 106 107 // Objects may have forwardees. 108 _verify_forwarded_allow 109 } VerifyForwarded; 110 111 typedef enum { 112 // Disable collection set verification. 113 _verify_cset_disable, 114 115 // Should have no references to cset. 116 _verify_cset_none, 117 118 // May have references to cset, all should be forwarded. 119 // Note: Allowing non-forwarded references to cset is equivalent 120 // to _verify_cset_disable. 121 _verify_cset_forwarded 122 } VerifyCollectionSet; 123 124 typedef enum { 125 // Disable liveness verification 126 _verify_liveness_disable, 127 128 // All objects should belong to live regions 129 _verify_liveness_conservative, 130 131 // All objects should belong to live regions, 132 // and liveness data should be accurate 133 _verify_liveness_complete 134 } VerifyLiveness; 135 136 typedef enum { 137 // Disable region verification 138 _verify_regions_disable, 139 140 // No trash regions allowed 141 _verify_regions_notrash, 142 143 // No collection set regions allowed 144 _verify_regions_nocset, 145 146 // No trash and no cset regions allowed 147 _verify_regions_notrash_nocset 148 } VerifyRegions; 149 150 typedef enum { 151 // Disable size verification 152 _verify_size_disable, 153 154 // Enforce exact consistency 155 _verify_size_exact, 156 157 // Expect promote-in-place adjustments: padding inserted to temporarily prevent further allocation in regular regions 158 _verify_size_adjusted_for_padding 159 } VerifySize; 160 161 typedef enum { 162 // Disable gc-state verification 163 _verify_gcstate_disable, 164 165 // Nothing is in progress, no forwarded objects 166 _verify_gcstate_stable, 167 168 // Nothing is in progress, no forwarded objects, weak roots handling 169 _verify_gcstate_stable_weakroots, 170 171 // Nothing is in progress, some objects are forwarded 172 _verify_gcstate_forwarded 173 } VerifyGCState; 174 175 struct VerifyOptions { 176 VerifyForwarded _verify_forwarded; 177 VerifyMarked _verify_marked; 178 VerifyCollectionSet _verify_cset; 179 VerifyLiveness _verify_liveness; 180 VerifyRegions _verify_regions; 181 VerifyGCState _verify_gcstate; 182 183 VerifyOptions(VerifyForwarded verify_forwarded, 184 VerifyMarked verify_marked, 185 VerifyCollectionSet verify_collection_set, 186 VerifyLiveness verify_liveness, 187 VerifyRegions verify_regions, 188 VerifyGCState verify_gcstate) : 189 _verify_forwarded(verify_forwarded), _verify_marked(verify_marked), 190 _verify_cset(verify_collection_set), 191 _verify_liveness(verify_liveness), _verify_regions(verify_regions), 192 _verify_gcstate(verify_gcstate) {} 193 }; 194 195 private: 196 void verify_at_safepoint(const char* label, 197 VerifyRememberedSet remembered, 198 VerifyForwarded forwarded, 199 VerifyMarked marked, 200 VerifyCollectionSet cset, 201 VerifyLiveness liveness, 202 VerifyRegions regions, 203 VerifySize sizeness, 204 VerifyGCState gcstate); 205 206 public: 207 ShenandoahVerifier(ShenandoahHeap* heap, MarkBitMap* verification_bitmap) : 208 _heap(heap), _verification_bit_map(verification_bitmap) {}; 209 210 void verify_before_concmark(); 211 void verify_after_concmark(); 212 void verify_after_concmark_with_promotions(); 213 void verify_before_evacuation(); 214 void verify_before_updaterefs(); 215 void verify_after_updaterefs(); 216 void verify_before_fullgc(); 217 void verify_after_fullgc(); 218 void verify_after_degenerated(); 219 void verify_generic(VerifyOption option); 220 221 // Roots should only contain to-space oops 222 void verify_roots_in_to_space(); 223 void verify_roots_no_forwarded(); 224 225 // Check that generation usages are accurate before rebuilding free set 226 void verify_before_rebuilding_free_set(); 227 private: 228 template<typename Scanner> 229 void help_verify_region_rem_set(Scanner* scanner, ShenandoahHeapRegion* r, ShenandoahMarkingContext* ctx, 230 HeapWord* update_watermark, const char* message); 231 232 void verify_rem_set_before_mark(); 233 void verify_rem_set_before_update_ref(); 234 void verify_rem_set_after_full_gc(); 235 236 ShenandoahMarkingContext* get_marking_context_for_old(); 237 }; 238 239 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP