< prev index next >

src/hotspot/share/memory/dynamicArchive.cpp

Print this page
@@ -259,16 +259,30 @@
  
        return true; // keep recursing until every object is visited exactly once.
      }
  
      virtual void push_special(SpecialRef type, Ref* ref, intptr_t* p) {
-       assert(type == _method_entry_ref, "only special type allowed for now");
+       // TODO:CDS - JDK-8234693 will consolidate this with an almost identical method in metaspaceShared.cpp
+       assert_valid(type);
        address obj = ref->obj();
        address new_obj = _builder->get_new_loc(ref);
        size_t offset = pointer_delta(p, obj,  sizeof(u1));
        intptr_t* new_p = (intptr_t*)(new_obj + offset);
-       assert(*p == *new_p, "must be a copy");
+       switch (type) {
+       case _method_entry_ref:
+         assert(*p == *new_p, "must be a copy");
+         break;
+       case _internal_pointer_ref:
+         {
+           size_t off = pointer_delta(*((address*)p), obj, sizeof(u1));
+           assert(0 <= intx(off) && intx(off) < ref->size() * BytesPerWord, "must point to internal address");
+           *((address*)new_p) = new_obj + off;
+         }
+         break;
+       default:
+         ShouldNotReachHere();
+       }
        ArchivePtrMarker::mark_pointer((address*)new_p);
      }
    };
  
    class EmbeddedRefUpdater: public MetaspaceClosure {

@@ -791,11 +805,11 @@
  }
  
  size_t DynamicArchiveBuilder::estimate_trampoline_size() {
    size_t total = 0;
    size_t each_method_bytes =
-     align_up(SharedRuntime::trampoline_size(), BytesPerWord) +
+     align_up(SharedRuntime::trampoline_size(), BytesPerWord) * 3 +
      align_up(sizeof(AdapterHandlerEntry*), BytesPerWord);
  
    for (int i = 0; i < _klasses->length(); i++) {
      InstanceKlass* ik = _klasses->at(i);
      Array<Method*>* methods = ik->methods();

@@ -814,15 +828,27 @@
    for (int i = 0; i < _klasses->length(); i++) {
      InstanceKlass* ik = _klasses->at(i);
      Array<Method*>* methods = ik->methods();
      for (int j = 0; j < methods->length(); j++) {
        Method* m = methods->at(j);
+ 
+       // TODO:CDS - JDK-8234693 will consolidate this with Method::unlink()
        address c2i_entry_trampoline = (address)p;
        p += SharedRuntime::trampoline_size();
        assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
        m->set_from_compiled_entry(to_target(c2i_entry_trampoline));
  
+       address c2i_inline_ro_entry_trampoline = (address)p;
+       p += SharedRuntime::trampoline_size();
+       assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
+       m->set_from_compiled_inline_ro_entry(to_target(c2i_inline_ro_entry_trampoline));
+ 
+       address c2i_inline_entry_trampoline = (address)p;
+       p +=  SharedRuntime::trampoline_size();
+       assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
+       m->set_from_compiled_inline_entry(to_target(c2i_inline_entry_trampoline));
+ 
        AdapterHandlerEntry** adapter_trampoline =(AdapterHandlerEntry**)p;
        p += sizeof(AdapterHandlerEntry*);
        assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
        *adapter_trampoline = NULL;
        m->set_adapter_trampoline(to_target(adapter_trampoline));
< prev index next >