< prev index next >

src/hotspot/share/cds/archiveHeapWriter.cpp

Print this page

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)
< prev index next >