--- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -35,6 +35,7 @@
#include "memory/iterator.inline.hpp"
#include "memory/resourceArea.hpp"
#include "oops/compressedOops.inline.hpp"
+#include "utilities/align.hpp"
// Avoid name collision on verify_oop (defined in macroAssembler_arm.hpp)
#ifdef verify_oop
@@ -98,7 +99,7 @@
check(ShenandoahAsserts::_safe_unknown, obj, _heap->is_in(obj),
"oop must be in heap");
- check(ShenandoahAsserts::_safe_unknown, obj, check_obj_alignment(obj),
+ check(ShenandoahAsserts::_safe_unknown, obj, is_object_aligned(obj),
"oop must be aligned");
ShenandoahHeapRegion *obj_reg = _heap->heap_region_containing(obj);
@@ -153,12 +154,12 @@
ShenandoahHeapRegion* fwd_reg = NULL;
- if (!oopDesc::equals_raw(obj, fwd)) {
+ if (obj != fwd) {
check(ShenandoahAsserts::_safe_oop, obj, _heap->is_in(fwd),
"Forwardee must be in heap");
check(ShenandoahAsserts::_safe_oop, obj, !CompressedOops::is_null(fwd),
"Forwardee is set");
- check(ShenandoahAsserts::_safe_oop, obj, check_obj_alignment(fwd),
+ check(ShenandoahAsserts::_safe_oop, obj, is_object_aligned(fwd),
"Forwardee must be aligned");
// Do this before touching fwd->size()
@@ -183,7 +184,7 @@
"Forwardee end should be within the region");
oop fwd2 = (oop) ShenandoahForwarding::get_forwardee_raw_unchecked(fwd);
- check(ShenandoahAsserts::_safe_oop, obj, oopDesc::equals_raw(fwd, fwd2),
+ check(ShenandoahAsserts::_safe_oop, obj, (fwd == fwd2),
"Double forwarding");
} else {
fwd_reg = obj_reg;
@@ -212,12 +213,12 @@
// skip
break;
case ShenandoahVerifier::_verify_forwarded_none: {
- check(ShenandoahAsserts::_safe_all, obj, oopDesc::equals_raw(obj, fwd),
+ check(ShenandoahAsserts::_safe_all, obj, (obj == fwd),
"Should not be forwarded");
break;
}
case ShenandoahVerifier::_verify_forwarded_allow: {
- if (!oopDesc::equals_raw(obj, fwd)) {
+ if (obj != fwd) {
check(ShenandoahAsserts::_safe_all, obj, obj_reg != fwd_reg,
"Forwardee should be in another region");
}
@@ -237,7 +238,7 @@
break;
case ShenandoahVerifier::_verify_cset_forwarded:
if (_heap->in_collection_set(obj)) {
- check(ShenandoahAsserts::_safe_all, obj, !oopDesc::equals_raw(obj, fwd),
+ check(ShenandoahAsserts::_safe_all, obj, (obj != fwd),
"Object in collection set, should have forwardee");
}
break;
@@ -685,13 +686,17 @@
_heap->heap_region_iterate(&cl);
size_t heap_used = _heap->used();
guarantee(cl.used() == heap_used,
- "%s: heap used size must be consistent: heap-used = " SIZE_FORMAT "K, regions-used = " SIZE_FORMAT "K",
- label, heap_used/K, cl.used()/K);
+ "%s: heap used size must be consistent: heap-used = " SIZE_FORMAT "%s, regions-used = " SIZE_FORMAT "%s",
+ label,
+ byte_size_in_proper_unit(heap_used), proper_unit_for_byte_size(heap_used),
+ byte_size_in_proper_unit(cl.used()), proper_unit_for_byte_size(cl.used()));
size_t heap_committed = _heap->committed();
guarantee(cl.committed() == heap_committed,
- "%s: heap committed size must be consistent: heap-committed = " SIZE_FORMAT "K, regions-committed = " SIZE_FORMAT "K",
- label, heap_committed/K, cl.committed()/K);
+ "%s: heap committed size must be consistent: heap-committed = " SIZE_FORMAT "%s, regions-committed = " SIZE_FORMAT "%s",
+ label,
+ byte_size_in_exact_unit(heap_committed), proper_unit_for_byte_size(heap_committed),
+ byte_size_in_exact_unit(cl.committed()), proper_unit_for_byte_size(cl.committed()));
}
// Internal heap region checks
@@ -952,7 +957,7 @@
if (!CompressedOops::is_null(o)) {
oop obj = CompressedOops::decode_not_null(o);
oop fwd = (oop) ShenandoahForwarding::get_forwardee_raw_unchecked(obj);
- if (!oopDesc::equals_raw(obj, fwd)) {
+ if (obj != fwd) {
ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL,
"Verify Roots", "Should not be forwarded", __FILE__, __LINE__);
}
@@ -964,15 +969,51 @@
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 (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() {
- guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
ShenandoahRootVerifier verifier;
ShenandoahVerifyNoForwared cl;
verifier.oops_do(&cl);
}
void ShenandoahVerifier::verify_roots_no_forwarded_except(ShenandoahRootVerifier::RootTypes types) {
- guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
ShenandoahRootVerifier verifier;
verifier.excludes(types);
ShenandoahVerifyNoForwared cl;