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