764 nmethod* nm = cb->as_nmethod_or_null();
765 if (nm != NULL && installed_code_handle->is_scavengable()) {
766 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable");
767 if (!UseG1GC) {
768 assert(nm->on_scavenge_root_list(), "nm should be on scavengable list");
769 }
770 }
771 }
772 }
773 return result;
774 C2V_END
775
776 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata))
777 ResourceMark rm;
778 HandleMark hm;
779
780 Handle target_handle = JNIHandles::resolve(target);
781 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
782 Handle metadata_handle = JNIHandles::resolve(metadata);
783
784 HotSpotOopMap::klass()->initialize(thread);
785
786 CodeMetadata code_metadata;
787 CodeBlob *cb = NULL;
788 CodeInstaller installer;
789
790 JVMCIEnv::CodeInstallResult result = installer.gather_metadata(target_handle, compiled_code_handle, code_metadata, CHECK_0); //cb, pc_descs, nr_pc_descs, scopes_descs, scopes_size, reloc_buffer);
791 if (result != JVMCIEnv::ok) {
792 return result;
793 }
794
795 if (code_metadata.get_nr_pc_desc() > 0) {
796 typeArrayHandle pcArrayOop = oopFactory::new_byteArray(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full));
797 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc());
798 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop());
799 }
800
801 if (code_metadata.get_scopes_size() > 0) {
802 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full));
803 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size());
804 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop());
805 }
806
807 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer();
808 typeArrayHandle relocArrayOop = oopFactory::new_byteArray((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full));
809 if (reloc_buffer->size() > 0) {
810 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size());
|
764 nmethod* nm = cb->as_nmethod_or_null();
765 if (nm != NULL && installed_code_handle->is_scavengable()) {
766 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable");
767 if (!UseG1GC) {
768 assert(nm->on_scavenge_root_list(), "nm should be on scavengable list");
769 }
770 }
771 }
772 }
773 return result;
774 C2V_END
775
776 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata))
777 ResourceMark rm;
778 HandleMark hm;
779
780 Handle target_handle = JNIHandles::resolve(target);
781 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
782 Handle metadata_handle = JNIHandles::resolve(metadata);
783
784 CodeMetadata code_metadata;
785 CodeBlob *cb = NULL;
786 CodeInstaller installer;
787
788 JVMCIEnv::CodeInstallResult result = installer.gather_metadata(target_handle, compiled_code_handle, code_metadata, CHECK_0);
789 if (result != JVMCIEnv::ok) {
790 return result;
791 }
792
793 if (code_metadata.get_nr_pc_desc() > 0) {
794 typeArrayHandle pcArrayOop = oopFactory::new_byteArray(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full));
795 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc());
796 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop());
797 }
798
799 if (code_metadata.get_scopes_size() > 0) {
800 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full));
801 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size());
802 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop());
803 }
804
805 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer();
806 typeArrayHandle relocArrayOop = oopFactory::new_byteArray((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full));
807 if (reloc_buffer->size() > 0) {
808 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size());
|