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