570 oopmap->set_bit(idx);
571 }
572
573 void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj, Klass* src_klass) {
574 assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses");
575 narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass);
576 address buffered_addr = requested_addr_to_buffered_addr(cast_from_oop<address>(requested_obj));
577
578 oop fake_oop = cast_to_oop(buffered_addr);
579 if (UseCompactObjectHeaders) {
580 fake_oop->set_mark(markWord::prototype().set_narrow_klass(nk));
581 } else {
582 fake_oop->set_narrow_klass(nk);
583 }
584
585 if (src_obj == nullptr) {
586 return;
587 }
588 // We need to retain the identity_hash, because it may have been used by some hashtables
589 // in the shared heap.
590 if (!src_obj->fast_no_hash_check()) {
591 intptr_t src_hash = src_obj->identity_hash();
592 if (UseCompactObjectHeaders) {
593 fake_oop->set_mark(markWord::prototype().set_narrow_klass(nk).copy_set_hash(src_hash));
594 } else {
595 fake_oop->set_mark(markWord::prototype().copy_set_hash(src_hash));
596 }
597 assert(fake_oop->mark().is_unlocked(), "sanity");
598
599 DEBUG_ONLY(intptr_t archived_hash = fake_oop->identity_hash());
600 assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
601 }
602 // Strip age bits.
603 fake_oop->set_mark(fake_oop->mark().set_age(0));
604 }
605
606 class ArchiveHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure {
607 oop _src_obj;
608 address _buffered_obj;
609 CHeapBitMap* _oopmap;
610
611 public:
612 EmbeddedOopRelocator(oop src_obj, address buffered_obj, CHeapBitMap* oopmap) :
613 _src_obj(src_obj), _buffered_obj(buffered_obj), _oopmap(oopmap) {}
|
570 oopmap->set_bit(idx);
571 }
572
573 void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj, Klass* src_klass) {
574 assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses");
575 narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass);
576 address buffered_addr = requested_addr_to_buffered_addr(cast_from_oop<address>(requested_obj));
577
578 oop fake_oop = cast_to_oop(buffered_addr);
579 if (UseCompactObjectHeaders) {
580 fake_oop->set_mark(markWord::prototype().set_narrow_klass(nk));
581 } else {
582 fake_oop->set_narrow_klass(nk);
583 }
584
585 if (src_obj == nullptr) {
586 return;
587 }
588 // We need to retain the identity_hash, because it may have been used by some hashtables
589 // in the shared heap.
590 if (!src_obj->fast_no_hash_check() && (!(EnableValhalla && src_obj->mark().is_inline_type()))) {
591 intptr_t src_hash = src_obj->identity_hash();
592 if (UseCompactObjectHeaders) {
593 fake_oop->set_mark(markWord::prototype().set_narrow_klass(nk).copy_set_hash(src_hash));
594 } else if (EnableValhalla) {
595 fake_oop->set_mark(src_klass->prototype_header().copy_set_hash(src_hash));
596 } else {
597 fake_oop->set_mark(markWord::prototype().copy_set_hash(src_hash));
598 }
599 assert(fake_oop->mark().is_unlocked(), "sanity");
600
601 DEBUG_ONLY(intptr_t archived_hash = fake_oop->identity_hash());
602 assert(src_hash == archived_hash, "Different hash codes: original " INTPTR_FORMAT ", archived " INTPTR_FORMAT, src_hash, archived_hash);
603 }
604 // Strip age bits.
605 fake_oop->set_mark(fake_oop->mark().set_age(0));
606 }
607
608 class ArchiveHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure {
609 oop _src_obj;
610 address _buffered_obj;
611 CHeapBitMap* _oopmap;
612
613 public:
614 EmbeddedOopRelocator(oop src_obj, address buffered_obj, CHeapBitMap* oopmap) :
615 _src_obj(src_obj), _buffered_obj(buffered_obj), _oopmap(oopmap) {}
|