OpenJDK / amber / amber
changeset 56843:970adfac768d
8225573: Shenandoah: Enhance ShenandoahVerifier to ensure roots to-space invariant
Reviewed-by: shade
author | zgu |
---|---|
date | Tue, 18 Jun 2019 17:58:07 -0400 |
parents | c439c469e803 |
children | aa800530fb49 |
files | src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp |
diffstat | 3 files changed, 44 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Jun 18 17:50:33 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Tue Jun 18 17:58:07 2019 -0400 @@ -2178,6 +2178,11 @@ concurrent_mark()->update_thread_roots(ShenandoahPhaseTimings::final_update_refs_roots); } + // Has to be done before cset is clear + if (ShenandoahVerify) { + verifier()->verify_roots_in_to_space(); + } + ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle); trash_cset_regions(); @@ -2185,7 +2190,6 @@ set_update_refs_in_progress(false); if (ShenandoahVerify) { - verifier()->verify_roots_no_forwarded(); verifier()->verify_after_updaterefs(); }
--- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Tue Jun 18 17:50:33 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Tue Jun 18 17:58:07 2019 -0400 @@ -964,6 +964,44 @@ void do_oop(oop* p) { do_oop_work(p); } }; +class ShenandoahVerifyInToSpaceClosure : public OopClosure { +private: + template <class T> + void do_oop_work(T* p) { + T o = RawAccess<>::oop_load(p); + if (!CompressedOops::is_null(o)) { + oop obj = CompressedOops::decode_not_null(o); + ShenandoahHeap* heap = ShenandoahHeap::heap_no_check(); + + if (!heap->marking_context()->is_marked(obj)) { + ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL, + "Verify Roots In To-Space", "Should be marked", __FILE__, __LINE__); + } + + if (heap->in_collection_set(obj)) { + ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL, + "Verify Roots In To-Space", "Should not be in collection set", __FILE__, __LINE__); + } + + oop fwd = (oop) ShenandoahForwarding::get_forwardee_raw_unchecked(obj); + if (!oopDesc::equals_raw(obj, fwd)) { + ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL, + "Verify Roots In To-Space", "Should not be forwarded", __FILE__, __LINE__); + } + } + } + +public: + void do_oop(narrowOop* p) { do_oop_work(p); } + void do_oop(oop* p) { do_oop_work(p); } +}; + +void ShenandoahVerifier::verify_roots_in_to_space() { + ShenandoahRootVerifier verifier; + ShenandoahVerifyInToSpaceClosure cl; + verifier.oops_do(&cl); +} + void ShenandoahVerifier::verify_roots_no_forwarded() { ShenandoahRootVerifier verifier; ShenandoahVerifyNoForwared cl;
--- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp Tue Jun 18 17:50:33 2019 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp Tue Jun 18 17:58:07 2019 -0400 @@ -189,6 +189,7 @@ void verify_generic(VerifyOption option); // Roots should only contain to-space oops + void verify_roots_in_to_space(); void verify_roots_no_forwarded(); void verify_roots_no_forwarded_except(ShenandoahRootVerifier::RootTypes types); };