1 /* 2 * Copyright (c) 2017, 2020, Red Hat, Inc. 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_SHENANDOAH_SHENANDOAHVERIFIER_HPP 26 #define SHARE_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP 27 28 #include "gc/shared/markBitMap.hpp" 29 #include "gc/shenandoah/shenandoahRootVerifier.hpp" 30 #include "memory/allocation.hpp" 31 #include "oops/oopsHierarchy.hpp" 32 #include "utilities/stack.hpp" 33 34 class ShenandoahHeap; 35 36 #ifdef _WINDOWS 37 #pragma warning( disable : 4522 ) 38 #endif 39 40 class ShenandoahVerifierTask { 41 public: 42 ShenandoahVerifierTask(oop o = NULL, int idx = 0): _obj(o) { } 43 ShenandoahVerifierTask(oop o, size_t idx): _obj(o) { } 44 // Trivially copyable. 45 46 inline oop obj() const { return _obj; } 47 48 private: 49 oop _obj; 50 }; 51 52 typedef Stack<ShenandoahVerifierTask, mtGC> ShenandoahVerifierStack; 53 typedef volatile juint ShenandoahLivenessData; 54 55 class ShenandoahVerifier : public CHeapObj<mtGC> { 56 private: 57 ShenandoahHeap* _heap; 58 MarkBitMap* _verification_bit_map; 59 public: 60 typedef enum { 61 // Disable remembered set verification. 62 _verify_remembered_disable, 63 64 // Assure old objects are registered and remembered set cards within the read-only remembered set are dirty 65 // for every interesting pointer within each OLD ShenandoahHeapRegion between bottom() and top(). This is 66 // appropriate at the init_mark safepoint since all TLABS are retired before we reach this code. 67 _verify_remembered_for_marking, 68 69 // Assure old objects are registered and remembered set cards within the read-write remembered set are dirty 70 // for every interesting pointer within each OLD ShenandoahHeapRegion between bottom() and top(). 71 _verify_remembered_for_updating_references, 72 73 // Assure old objects are registered and remembered set cards within the read-write remembered set are dirty 74 // for every interesting pointer within each OLD ShenandoahHeapRegion between bottom() and top(). 75 _verify_remembered_after_full_gc 76 } VerifyRememberedSet; 77 78 typedef enum { 79 // Disable marked objects verification. 80 _verify_marked_disable, 81 82 // Objects should be marked in "next" bitmap. 83 _verify_marked_incomplete, 84 85 // Objects should be marked in "complete" bitmap. 86 _verify_marked_complete, 87 88 // Objects should be marked in "complete" bitmap, except j.l.r.Reference referents, which 89 // may be dangling after marking but before conc-weakrefs-processing. 90 _verify_marked_complete_except_references 91 } VerifyMarked; 92 93 typedef enum { 94 // Disable forwarded objects verification. 95 _verify_forwarded_disable, 96 97 // Objects should not have forwardees. 98 _verify_forwarded_none, 99 100 // Objects may have forwardees. 101 _verify_forwarded_allow 102 } VerifyForwarded; 103 104 typedef enum { 105 // Disable collection set verification. 106 _verify_cset_disable, 107 108 // Should have no references to cset. 109 _verify_cset_none, 110 111 // May have references to cset, all should be forwarded. 112 // Note: Allowing non-forwarded references to cset is equivalent 113 // to _verify_cset_disable. 114 _verify_cset_forwarded 115 } VerifyCollectionSet; 116 117 typedef enum { 118 // Disable liveness verification 119 _verify_liveness_disable, 120 121 // All objects should belong to live regions 122 _verify_liveness_conservative, 123 124 // All objects should belong to live regions, 125 // and liveness data should be accurate 126 _verify_liveness_complete 127 } VerifyLiveness; 128 129 typedef enum { 130 // Disable region verification 131 _verify_regions_disable, 132 133 // No trash regions allowed 134 _verify_regions_notrash, 135 136 // No collection set regions allowed 137 _verify_regions_nocset, 138 139 // No trash and no cset regions allowed 140 _verify_regions_notrash_nocset 141 } VerifyRegions; 142 143 typedef enum { 144 // Disable gc-state verification 145 _verify_gcstate_disable, 146 147 // Nothing is in progress, no forwarded objects 148 _verify_gcstate_stable, 149 150 // Nothing is in progress, no forwarded objects, weak roots handling 151 _verify_gcstate_stable_weakroots, 152 153 // Nothing is in progress, some objects are forwarded 154 _verify_gcstate_forwarded, 155 156 // Evacuation is in progress, some objects are forwarded 157 _verify_gcstate_evacuation, 158 159 // Evacuation is done, objects are forwarded, updating is in progress 160 _verify_gcstate_updating 161 } VerifyGCState; 162 163 struct VerifyOptions { 164 VerifyForwarded _verify_forwarded; 165 VerifyMarked _verify_marked; 166 VerifyCollectionSet _verify_cset; 167 VerifyLiveness _verify_liveness; 168 VerifyRegions _verify_regions; 169 VerifyGCState _verify_gcstate; 170 171 VerifyOptions(VerifyForwarded verify_forwarded, 172 VerifyMarked verify_marked, 173 VerifyCollectionSet verify_collection_set, 174 VerifyLiveness verify_liveness, 175 VerifyRegions verify_regions, 176 VerifyGCState verify_gcstate) : 177 _verify_forwarded(verify_forwarded), _verify_marked(verify_marked), 178 _verify_cset(verify_collection_set), 179 _verify_liveness(verify_liveness), _verify_regions(verify_regions), 180 _verify_gcstate(verify_gcstate) {} 181 }; 182 183 private: 184 void verify_at_safepoint(const char* label, 185 VerifyRememberedSet remembered, 186 VerifyForwarded forwarded, 187 VerifyMarked marked, 188 VerifyCollectionSet cset, 189 VerifyLiveness liveness, 190 VerifyRegions regions, 191 VerifyGCState gcstate); 192 193 public: 194 ShenandoahVerifier(ShenandoahHeap* heap, MarkBitMap* verification_bitmap) : 195 _heap(heap), _verification_bit_map(verification_bitmap) {}; 196 197 void verify_before_concmark(); 198 void verify_after_concmark(); 199 void verify_before_evacuation(); 200 void verify_during_evacuation(); 201 void verify_after_evacuation(); 202 void verify_before_updaterefs(); 203 void verify_after_updaterefs(); 204 void verify_before_fullgc(); 205 void verify_after_fullgc(); 206 void verify_after_generational_fullgc(); 207 void verify_after_degenerated(); 208 void verify_generic(VerifyOption option); 209 210 // Roots should only contain to-space oops 211 void verify_roots_in_to_space(); 212 213 void verify_roots_no_forwarded(); 214 }; 215 216 #endif // SHARE_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP