--- old/src/hotspot/share/memory/heapShared.cpp 2018-08-14 19:22:57.333448274 -0700 +++ new/src/hotspot/share/memory/heapShared.cpp 2018-08-14 19:22:57.009435890 -0700 @@ -28,7 +28,7 @@ #include "logging/log.hpp" #include "logging/logMessage.hpp" #include "logging/logStream.hpp" -#include "memory/heapShared.hpp" +#include "memory/heapShared.inline.hpp" #include "memory/iterator.inline.hpp" #include "memory/metadataFactory.hpp" #include "memory/metaspaceClosure.hpp" @@ -36,6 +36,7 @@ #include "memory/resourceArea.hpp" #include "oops/compressedOops.inline.hpp" #include "oops/oop.inline.hpp" +#include "utilities/bitMap.inline.hpp" #if INCLUDE_CDS_JAVA_HEAP KlassSubGraphInfo* HeapShared::_subgraph_info_list = NULL; @@ -70,6 +71,9 @@ return info; } +address HeapShared::_narrow_oop_base; +int HeapShared::_narrow_oop_shift; + int HeapShared::num_of_subgraph_infos() { int num = 0; KlassSubGraphInfo* info = _subgraph_info_list; @@ -318,7 +322,7 @@ // point. All objects in the subgraph reachable from the object are // also 'known' by GC. oop v = MetaspaceShared::materialize_archived_object( - CompressedOops::decode(entry_field_records->at(i+1))); + entry_field_records->at(i+1)); m->obj_field_put(field_offset, v); i += 2; } @@ -516,4 +520,80 @@ void HeapShared::archive_module_graph_objects(Thread* THREAD) { do_module_object_graph(archive_reachable_objects_from_static_field); } + +class FindEmbeddedPointers: public BasicOopIterateClosure { + narrowOop* _start; + BitMap *_oopmap; + public: + FindEmbeddedPointers(narrowOop* start, BitMap* oopmap) : _start(start), _oopmap(oopmap) {} + virtual bool should_verify_oops(void) { + return false; + } + virtual void do_oop(narrowOop* p) { + size_t idx = p - _start; + _oopmap->set_bit(idx); + } + virtual void do_oop(oop *p) { + ShouldNotReachHere(); + } +}; + +ResourceBitMap HeapShared::calculate_oopmap(MemRegion region) { + assert(UseCompressedOops, "must be"); + size_t num_bits = region.byte_size() / sizeof(narrowOop); + ResourceBitMap oopmap(num_bits); + + HeapWord* p = region.start(); + HeapWord* end = region.end(); + FindEmbeddedPointers relocator((narrowOop*)p, &oopmap); + + while (p < end) { + oop o = (oop)p; + o->oop_iterate(&relocator); + p += o->size(); + } + + return oopmap; +} + +void HeapShared::init_narrow_oop_decoding(address base, int shift) { + _narrow_oop_base = base; + _narrow_oop_shift = shift; +} + +class PatchEmbeddedPointers: public BitMapClosure { + narrowOop* _start; + + public: + PatchEmbeddedPointers(narrowOop* start) : _start(start) {} + + bool do_bit(size_t offset) { + narrowOop* p = _start + offset; + narrowOop v = *p; + if (!CompressedOops::is_null(v)) { + oop o = HeapShared::decode_with_archived_oop_encoding_mode(v); + RawAccess::oop_store(p, o); + } + return true; + } +}; + +void HeapShared::patch_archived_heap_embedded_pointers(MemRegion region, address oopmap, + size_t oopmap_size_in_bits) { + BitMapView bm((BitMap::bm_word_t*)oopmap, oopmap_size_in_bits); + +#ifndef PRODUCT + ResourceMark rm; + ResourceBitMap checkBm = calculate_oopmap(region); + + assert(checkBm.size() == bm.size(), "sanity"); + for (size_t ci = 0; ci < bm.size(); ci++) { + assert(checkBm.at(ci) == bm.at(ci), "sanity"); + } +#endif + + PatchEmbeddedPointers patcher((narrowOop*)region.start()); + bm.iterate(&patcher); +} + #endif // INCLUDE_CDS_JAVA_HEAP