OpenJDK / jdk / jdk
changeset 57741:5e65bea99d1f
8237543: Shenandoah: More asserts around code roots
Reviewed-by: zgu
author | rkennke |
---|---|
date | Mon, 20 Jan 2020 18:03:31 +0100 |
parents | 67e7f7e8284a |
children | 76b9822d2e65 |
files | src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp |
diffstat | 3 files changed, 37 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp Mon Jan 20 16:24:05 2020 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp Mon Jan 20 18:03:31 2020 +0100 @@ -145,11 +145,16 @@ continue; } - if (r->oop_value() != NULL) { + oop value = r->oop_value(); + if (value != NULL) { + oop* addr = r->oop_addr(); + shenandoah_assert_correct(addr, value); + shenandoah_assert_not_in_cset_except(addr, value, ShenandoahHeap::heap()->cancelled_gc()); + shenandoah_assert_not_forwarded(addr, value); // Non-NULL immediate oop found. NULL oops can safely be // ignored since the method will be re-registered if they // are later patched to be non-NULL. - oops.push(r->oop_addr()); + oops.push(addr); } } }
--- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Mon Jan 20 16:24:05 2020 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp Mon Jan 20 18:03:31 2020 +0100 @@ -668,6 +668,11 @@ if (ShenandoahVerify) { _heap->verifier()->verify_after_traversal(); } +#ifdef ASSERT + else { + verify_roots_after_gc(); + } +#endif if (VerifyAfterGC) { Universe::verify(); @@ -675,6 +680,30 @@ } } +class ShenandoahVerifyAfterGC : 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); + shenandoah_assert_correct(p, obj); + shenandoah_assert_not_in_cset_except(p, obj, ShenandoahHeap::heap()->cancelled_gc()); + shenandoah_assert_not_forwarded(p, obj); + } + } + +public: + void do_oop(narrowOop* p) { do_oop_work(p); } + void do_oop(oop* p) { do_oop_work(p); } +}; + +void ShenandoahTraversalGC::verify_roots_after_gc() { + ShenandoahRootVerifier verifier; + ShenandoahVerifyAfterGC cl; + verifier.oops_do(&cl); +} + class ShenandoahTraversalFixRootsClosure : public OopClosure { private: template <class T>
--- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp Mon Jan 20 16:24:05 2020 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp Mon Jan 20 18:03:31 2020 +0100 @@ -69,6 +69,7 @@ void weak_refs_work_doit(); void fixup_roots(); + void verify_roots_after_gc(); }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP