# HG changeset patch # User mlarsson # Date 1411031040 -7200 # Node ID 5c67eb0c46bc21e085e61ff7f0083460e130f519 # Parent e67193c2ceda4825705dec97bf29fac65851c69b 8035729: Code using assert(is_oop_or_null) needs better error messages Summary: Modified error messages to include the oops Reviewed-by: stefank, tschatzl diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Sep 18 11:04:00 2014 +0200 @@ -4167,7 +4167,7 @@ // been published), so we do not need to check for // uninitialized objects before pushing here. void Par_ConcMarkingClosure::do_oop(oop obj) { - assert(obj->is_oop_or_null(true), "expected an oop or NULL"); + assert(obj->is_oop_or_null(true), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; // Check if oop points into the CMS generation // and is not marked @@ -7226,7 +7226,7 @@ // isMarked() query is "safe". bool ScanMarkedObjectsAgainClosure::do_object_bm(oop p, MemRegion mr) { // Ignore mark word because we are running concurrent with mutators - assert(p->is_oop_or_null(true), "expected an oop or null"); + assert(p->is_oop_or_null(true), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(p))); HeapWord* addr = (HeapWord*)p; assert(_span.contains(addr), "we are scanning the CMS generation"); bool is_obj_array = false; @@ -7666,7 +7666,7 @@ } void PushAndMarkVerifyClosure::do_oop(oop obj) { - assert(obj->is_oop_or_null(), "expected an oop or NULL"); + assert(obj->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; if (_span.contains(addr) && !_verification_bm->isMarked(addr)) { // Oop lies in _span and isn't yet grey or black @@ -7764,7 +7764,7 @@ void PushOrMarkClosure::do_oop(oop obj) { // Ignore mark word because we are running concurrent with mutators. - assert(obj->is_oop_or_null(true), "expected an oop or NULL"); + assert(obj->is_oop_or_null(true), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; if (_span.contains(addr) && !_bitMap->isMarked(addr)) { // Oop lies in _span and isn't yet grey or black @@ -7802,7 +7802,7 @@ void Par_PushOrMarkClosure::do_oop(oop obj) { // Ignore mark word because we are running concurrent with mutators. - assert(obj->is_oop_or_null(true), "expected an oop or NULL"); + assert(obj->is_oop_or_null(true), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; if (_whole_span.contains(addr) && !_bit_map->isMarked(addr)) { // Oop lies in _span and isn't yet grey or black @@ -7879,7 +7879,7 @@ // path and may be at the end of the global overflow list (so // the mark word may be NULL). assert(obj->is_oop_or_null(true /* ignore mark word */), - "expected an oop or NULL"); + err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; // Check if oop points into the CMS generation // and is not marked @@ -7959,7 +7959,7 @@ // the debugger, is_oop_or_null(false) may subsequently start // to hold. assert(obj->is_oop_or_null(true), - "expected an oop or NULL"); + err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); HeapWord* addr = (HeapWord*)obj; // Check if oop points into the CMS generation // and is not marked diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp Thu Sep 18 11:04:00 2014 +0200 @@ -73,7 +73,7 @@ } else { res = (PromotedObject*)(_next & next_mask); } - assert(oop(res)->is_oop_or_null(true /* ignore mark word */), "Not an oop?"); + assert(oop(res)->is_oop_or_null(true /* ignore mark word */), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(oop(res)))); return res; } inline void setNext(PromotedObject* x) { diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Sep 18 11:04:00 2014 +0200 @@ -277,7 +277,7 @@ ++_refs_reached; HeapWord* objAddr = (HeapWord*) obj; - assert(obj->is_oop_or_null(true /* ignore mark word */), "Error"); + assert(obj->is_oop_or_null(true /* ignore mark word */), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(obj))); if (_g1h->is_in_g1_reserved(objAddr)) { assert(obj != NULL, "null check is implicit"); if (!_nextMarkBitMap->isMarked(objAddr)) { diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Thu Sep 18 11:04:00 2014 +0200 @@ -288,7 +288,7 @@ while (p < to) { Prefetch::write(p, interval); oop m = oop(p); - assert(m->is_oop_or_null(), "check for header"); + assert(m->is_oop_or_null(), err_msg("Expected an oop or NULL for header field at " PTR_FORMAT, p2i(m))); m->push_contents(pm); p += m->size(); } @@ -296,7 +296,7 @@ } else { while (p < to) { oop m = oop(p); - assert(m->is_oop_or_null(), "check for header"); + assert(m->is_oop_or_null(), err_msg("Expected an oop or NULL for header field at " PTR_FORMAT, p2i(m))); m->push_contents(pm); p += m->size(); } diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Sep 18 11:04:00 2014 +0200 @@ -2882,7 +2882,7 @@ start_array->allocate_block(addr); } oop(addr)->update_contents(cm); - assert(oop(addr)->is_oop_or_null(), "should be an oop now"); + assert(oop(addr)->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(oop(addr)))); } } } @@ -3366,7 +3366,7 @@ oop moved_oop = (oop) destination(); moved_oop->update_contents(compaction_manager()); - assert(moved_oop->is_oop_or_null(), "Object should be whole at this point"); + assert(moved_oop->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(moved_oop))); update_state(words); assert(destination() == (HeapWord*)moved_oop + moved_oop->size(), "sanity"); diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.inline.hpp Thu Sep 18 11:04:00 2014 +0200 @@ -35,7 +35,7 @@ #ifdef ASSERT #define VERIFY_OOP(o_) \ if (VerifyOops) { \ - assert((oop(o_))->is_oop_or_null(), "Not an oop!"); \ + assert((oop(o_))->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(oop(o_)))); \ StubRoutines::_verify_oop_count++; \ } #else diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/memory/referenceProcessor.cpp --- a/hotspot/src/share/vm/memory/referenceProcessor.cpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Thu Sep 18 11:04:00 2014 +0200 @@ -473,7 +473,7 @@ _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref); oop discovered = java_lang_ref_Reference::discovered(_ref); assert(_discovered_addr && discovered->is_oop_or_null(), - "discovered field is bad"); + err_msg("Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered))); _next = discovered; _referent_addr = java_lang_ref_Reference::referent_addr(_ref); _referent = java_lang_ref_Reference::referent(_ref); @@ -482,7 +482,9 @@ assert(allow_null_referent ? _referent->is_oop_or_null() : _referent->is_oop(), - "bad referent"); + err_msg("Expected an oop%s for referent field at " PTR_FORMAT, + (allow_null_referent ? " or NULL" : ""), + p2i(_referent))); } void DiscoveredListIterator::remove() { @@ -630,7 +632,7 @@ oop next = java_lang_ref_Reference::next(iter.obj()); if ((iter.referent() == NULL || iter.is_referent_alive() || next != NULL)) { - assert(next->is_oop_or_null(), "bad next field"); + assert(next->is_oop_or_null(), err_msg("Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next))); // Remove Reference object from list iter.remove(); // Trace the cohorts @@ -979,7 +981,7 @@ while (iter.has_next()) { iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); oop next = java_lang_ref_Reference::next(iter.obj()); - assert(next->is_oop_or_null(), "bad next field"); + assert(next->is_oop_or_null(), err_msg("Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next))); // If referent has been cleared or Reference is not active, // drop it. if (iter.referent() == NULL || next != NULL) { @@ -1172,7 +1174,7 @@ HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj); const oop discovered = java_lang_ref_Reference::discovered(obj); - assert(discovered->is_oop_or_null(), "bad discovered field"); + assert(discovered->is_oop_or_null(), err_msg("Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered))); if (discovered != NULL) { // The reference has already been discovered... if (TraceReferenceGC) { diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/services/heapDumper.cpp --- a/hotspot/src/share/vm/services/heapDumper.cpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/services/heapDumper.cpp Thu Sep 18 11:04:00 2014 +0200 @@ -722,7 +722,7 @@ // reflection and sun.misc.Unsafe classes may have a reference to a // Klass* so filter it out. - assert(o->is_oop_or_null(), "should always be an oop"); + assert(o->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(o))); writer->write_objectID(o); break; } diff -r e67193c2ceda -r 5c67eb0c46bc hotspot/src/share/vm/utilities/taskqueue.hpp --- a/hotspot/src/share/vm/utilities/taskqueue.hpp Thu Sep 18 11:27:59 2014 +0200 +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp Thu Sep 18 11:04:00 2014 +0200 @@ -331,7 +331,7 @@ // index, &_elems[index], _elems[index]); E* t = (E*)&_elems[index]; // cast away volatility oop* p = (oop*)t; - assert((*t)->is_oop_or_null(), "Not an oop or null"); + assert((*t)->is_oop_or_null(), err_msg("Expected an oop or NULL at " PTR_FORMAT, p2i(*t))); f->do_oop(p); } // tty->print_cr("END OopTaskQueue::oops_do");