79 |
79 |
80 oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) { |
80 oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) { |
81 if (klass() != NULL) { |
81 if (klass() != NULL) { |
82 JavaValue result(T_OBJECT); |
82 JavaValue result(T_OBJECT); |
83 JavaCallArguments args; |
83 JavaCallArguments args; |
84 args.push_oop(klass->java_mirror()); |
84 args.push_oop(Handle(THREAD, klass->java_mirror())); |
85 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
85 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
86 |
86 |
87 return (oop)result.get_jobject(); |
87 return (oop)result.get_jobject(); |
88 } |
88 } |
89 return NULL; |
89 return NULL; |
355 // Used to canonicalize Long and String values. |
356 // Used to canonicalize Long and String values. |
356 ResourceHashtable<jlong, Handle> longs; |
357 ResourceHashtable<jlong, Handle> longs; |
357 ResourceHashtable<const char*, Handle, &CompilerToVM::cstring_hash, &CompilerToVM::cstring_equals> strings; |
358 ResourceHashtable<const char*, Handle, &CompilerToVM::cstring_hash, &CompilerToVM::cstring_equals> strings; |
358 |
359 |
359 jvalue prim; |
360 jvalue prim; |
360 prim.z = true; Handle boxedTrue = java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL); |
361 prim.z = true; oop boxedTrueOop = java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL); |
361 prim.z = false; Handle boxedFalse = java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL); |
362 Handle boxedTrue(THREAD, boxedTrueOop); |
|
363 prim.z = false; oop boxedFalseOop = java_lang_boxing_object::create(T_BOOLEAN, &prim, CHECK_NULL); |
|
364 Handle boxedFalse(THREAD, boxedFalseOop); |
362 |
365 |
363 CompilerToVM::Data::initialize(CHECK_NULL); |
366 CompilerToVM::Data::initialize(CHECK_NULL); |
364 |
367 |
365 VMField::klass()->initialize(CHECK_NULL); |
368 VMField::klass()->initialize(CHECK_NULL); |
366 VMFlag::klass()->initialize(CHECK_NULL); |
369 VMFlag::klass()->initialize(CHECK_NULL); |
367 VMIntrinsicMethod::klass()->initialize(CHECK_NULL); |
370 VMIntrinsicMethod::klass()->initialize(CHECK_NULL); |
368 |
371 |
369 int len = JVMCIVMStructs::localHotSpotVMStructs_count(); |
372 int len = JVMCIVMStructs::localHotSpotVMStructs_count(); |
370 objArrayHandle vmFields = oopFactory::new_objArray(VMField::klass(), len, CHECK_NULL); |
373 objArrayHandle vmFields = oopFactory::new_objArray_handle(VMField::klass(), len, CHECK_NULL); |
371 for (int i = 0; i < len ; i++) { |
374 for (int i = 0; i < len ; i++) { |
372 VMStructEntry vmField = JVMCIVMStructs::localHotSpotVMStructs[i]; |
375 VMStructEntry vmField = JVMCIVMStructs::localHotSpotVMStructs[i]; |
373 instanceHandle vmFieldObj = InstanceKlass::cast(VMField::klass())->allocate_instance_handle(CHECK_NULL); |
376 instanceHandle vmFieldObj = InstanceKlass::cast(VMField::klass())->allocate_instance_handle(CHECK_NULL); |
374 size_t name_buf_len = strlen(vmField.typeName) + strlen(vmField.fieldName) + 2 /* "::" */; |
377 size_t name_buf_len = strlen(vmField.typeName) + strlen(vmField.fieldName) + 2 /* "::" */; |
375 char* name_buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, name_buf_len + 1); |
378 char* name_buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, name_buf_len + 1); |
407 } |
410 } |
408 |
411 |
409 int ints_len = JVMCIVMStructs::localHotSpotVMIntConstants_count(); |
412 int ints_len = JVMCIVMStructs::localHotSpotVMIntConstants_count(); |
410 int longs_len = JVMCIVMStructs::localHotSpotVMLongConstants_count(); |
413 int longs_len = JVMCIVMStructs::localHotSpotVMLongConstants_count(); |
411 len = ints_len + longs_len; |
414 len = ints_len + longs_len; |
412 objArrayHandle vmConstants = oopFactory::new_objArray(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); |
415 objArrayHandle vmConstants = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); |
413 int insert = 0; |
416 int insert = 0; |
414 for (int i = 0; i < ints_len ; i++) { |
417 for (int i = 0; i < ints_len ; i++) { |
415 VMIntConstantEntry c = JVMCIVMStructs::localHotSpotVMIntConstants[i]; |
418 VMIntConstantEntry c = JVMCIVMStructs::localHotSpotVMIntConstants[i]; |
416 CSTRING_TO_JSTRING(name, c.name); |
419 CSTRING_TO_JSTRING(name, c.name); |
417 BOXED_LONG(value, c.value); |
420 BOXED_LONG(value, c.value); |
426 vmConstants->obj_at_put(insert++, value); |
429 vmConstants->obj_at_put(insert++, value); |
427 } |
430 } |
428 assert(insert == len * 2, "must be"); |
431 assert(insert == len * 2, "must be"); |
429 |
432 |
430 len = JVMCIVMStructs::localHotSpotVMAddresses_count(); |
433 len = JVMCIVMStructs::localHotSpotVMAddresses_count(); |
431 objArrayHandle vmAddresses = oopFactory::new_objArray(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); |
434 objArrayHandle vmAddresses = oopFactory::new_objArray_handle(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); |
432 for (int i = 0; i < len ; i++) { |
435 for (int i = 0; i < len ; i++) { |
433 VMAddressEntry a = JVMCIVMStructs::localHotSpotVMAddresses[i]; |
436 VMAddressEntry a = JVMCIVMStructs::localHotSpotVMAddresses[i]; |
434 CSTRING_TO_JSTRING(name, a.name); |
437 CSTRING_TO_JSTRING(name, a.name); |
435 BOXED_LONG(value, a.value); |
438 BOXED_LONG(value, a.value); |
436 vmAddresses->obj_at_put(i * 2, name()); |
439 vmAddresses->obj_at_put(i * 2, name()); |
462 #define ADD_BOOL_FLAG(name) ADD_FLAG(bool, name, BOXED_BOOLEAN) |
465 #define ADD_BOOL_FLAG(name) ADD_FLAG(bool, name, BOXED_BOOLEAN) |
463 #define ADD_INTX_FLAG(name) ADD_FLAG(intx, name, BOXED_LONG) |
466 #define ADD_INTX_FLAG(name) ADD_FLAG(intx, name, BOXED_LONG) |
464 #define ADD_UINTX_FLAG(name) ADD_FLAG(uintx, name, BOXED_LONG) |
467 #define ADD_UINTX_FLAG(name) ADD_FLAG(uintx, name, BOXED_LONG) |
465 |
468 |
466 len = 0 + PREDEFINED_CONFIG_FLAGS(COUNT_FLAG, COUNT_FLAG, COUNT_FLAG); |
469 len = 0 + PREDEFINED_CONFIG_FLAGS(COUNT_FLAG, COUNT_FLAG, COUNT_FLAG); |
467 objArrayHandle vmFlags = oopFactory::new_objArray(VMFlag::klass(), len, CHECK_NULL); |
470 objArrayHandle vmFlags = oopFactory::new_objArray_handle(VMFlag::klass(), len, CHECK_NULL); |
468 int i = 0; |
471 int i = 0; |
469 PREDEFINED_CONFIG_FLAGS(ADD_BOOL_FLAG, ADD_INTX_FLAG, ADD_UINTX_FLAG) |
472 PREDEFINED_CONFIG_FLAGS(ADD_BOOL_FLAG, ADD_INTX_FLAG, ADD_UINTX_FLAG) |
470 |
473 |
471 objArrayHandle vmIntrinsics = CompilerToVM::initialize_intrinsics(CHECK_NULL); |
474 objArrayHandle vmIntrinsics = CompilerToVM::initialize_intrinsics(CHECK_NULL); |
472 |
475 |
487 C2V_END |
490 C2V_END |
488 |
491 |
489 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv *, jobject c2vm, jobject name_handle)) |
492 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv *, jobject c2vm, jobject name_handle)) |
490 #define RETURN_BOXED_LONG(value) oop box; jvalue p; p.j = (jlong) (value); box = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box); |
493 #define RETURN_BOXED_LONG(value) oop box; jvalue p; p.j = (jlong) (value); box = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box); |
491 #define RETURN_BOXED_DOUBLE(value) oop box; jvalue p; p.d = (jdouble) (value); box = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box); |
494 #define RETURN_BOXED_DOUBLE(value) oop box; jvalue p; p.d = (jdouble) (value); box = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL); return JNIHandles::make_local(THREAD, box); |
492 Handle name = JNIHandles::resolve(name_handle); |
495 Handle name(THREAD, JNIHandles::resolve(name_handle)); |
493 if (name.is_null()) { |
496 if (name.is_null()) { |
494 THROW_0(vmSymbols::java_lang_NullPointerException()); |
497 THROW_0(vmSymbols::java_lang_NullPointerException()); |
495 } |
498 } |
496 ResourceMark rm; |
499 ResourceMark rm; |
497 const char* cstring = java_lang_String::as_utf8_string(name()); |
500 const char* cstring = java_lang_String::as_utf8_string(name()); |
748 return CompilerOracle::should_inline(method) || method->force_inline(); |
751 return CompilerOracle::should_inline(method) || method->force_inline(); |
749 C2V_END |
752 C2V_END |
750 |
753 |
751 C2V_VMENTRY(jobject, lookupType, (JNIEnv*, jobject, jstring jname, jclass accessing_class, jboolean resolve)) |
754 C2V_VMENTRY(jobject, lookupType, (JNIEnv*, jobject, jstring jname, jclass accessing_class, jboolean resolve)) |
752 ResourceMark rm; |
755 ResourceMark rm; |
753 Handle name = JNIHandles::resolve(jname); |
756 Handle name(THREAD, JNIHandles::resolve(jname)); |
754 Symbol* class_name = java_lang_String::as_symbol(name, CHECK_0); |
757 Symbol* class_name = java_lang_String::as_symbol(name(), CHECK_0); |
755 if (java_lang_String::length(name()) <= 1) { |
758 if (java_lang_String::length(name()) <= 1) { |
756 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string())); |
759 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string())); |
757 } |
760 } |
758 |
761 |
759 Klass* resolved_klass = NULL; |
762 Klass* resolved_klass = NULL; |
760 Handle class_loader; |
|
761 Handle protection_domain; |
|
762 if (JNIHandles::resolve(accessing_class) == NULL) { |
763 if (JNIHandles::resolve(accessing_class) == NULL) { |
763 THROW_0(vmSymbols::java_lang_NullPointerException()); |
764 THROW_0(vmSymbols::java_lang_NullPointerException()); |
764 } |
765 } |
765 Klass* accessing_klass = java_lang_Class::as_Klass(JNIHandles::resolve(accessing_class)); |
766 Klass* accessing_klass = java_lang_Class::as_Klass(JNIHandles::resolve(accessing_class)); |
766 class_loader = accessing_klass->class_loader(); |
767 Handle class_loader(THREAD, accessing_klass->class_loader()); |
767 protection_domain = accessing_klass->protection_domain(); |
768 Handle protection_domain(THREAD, accessing_klass->protection_domain()); |
768 |
769 |
769 if (resolve) { |
770 if (resolve) { |
770 resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0); |
771 resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0); |
771 } else { |
772 } else { |
772 if (class_name->byte_at(0) == 'L' && |
773 if (class_name->byte_at(0) == 'L' && |
798 resolved_klass = Universe::typeArrayKlassObj(t); |
799 resolved_klass = Universe::typeArrayKlassObj(t); |
799 resolved_klass = TypeArrayKlass::cast(resolved_klass)->array_klass(fd.dimension(), CHECK_0); |
800 resolved_klass = TypeArrayKlass::cast(resolved_klass)->array_klass(fd.dimension(), CHECK_0); |
800 } |
801 } |
801 } |
802 } |
802 } |
803 } |
803 Handle result = CompilerToVM::get_jvmci_type(resolved_klass, CHECK_NULL); |
804 oop result = CompilerToVM::get_jvmci_type(resolved_klass, CHECK_NULL); |
804 return JNIHandles::make_local(THREAD, result()); |
805 return JNIHandles::make_local(THREAD, result); |
805 C2V_END |
806 C2V_END |
806 |
807 |
807 C2V_VMENTRY(jobject, resolveConstantInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
808 C2V_VMENTRY(jobject, resolveConstantInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
808 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
809 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
809 oop result = cp->resolve_constant_at(index, CHECK_NULL); |
810 oop result = cp->resolve_constant_at(index, CHECK_NULL); |
839 C2V_END |
840 C2V_END |
840 |
841 |
841 C2V_VMENTRY(jobject, resolveTypeInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
842 C2V_VMENTRY(jobject, resolveTypeInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
842 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
843 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
843 Klass* resolved_klass = cp->klass_at(index, CHECK_NULL); |
844 Klass* resolved_klass = cp->klass_at(index, CHECK_NULL); |
844 Handle klass = CompilerToVM::get_jvmci_type(resolved_klass, CHECK_NULL); |
845 oop klass = CompilerToVM::get_jvmci_type(resolved_klass, CHECK_NULL); |
845 return JNIHandles::make_local(THREAD, klass()); |
846 return JNIHandles::make_local(THREAD, klass); |
846 C2V_END |
847 C2V_END |
847 |
848 |
848 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
849 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
849 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
850 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
850 KlassHandle loading_klass(cp->pool_holder()); |
851 KlassHandle loading_klass(cp->pool_holder()); |
852 KlassHandle klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass); |
853 KlassHandle klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass); |
853 Symbol* symbol = NULL; |
854 Symbol* symbol = NULL; |
854 if (klass.is_null()) { |
855 if (klass.is_null()) { |
855 symbol = cp->klass_name_at(index); |
856 symbol = cp->klass_name_at(index); |
856 } |
857 } |
857 Handle result; |
858 oop result_oop; |
858 if (!klass.is_null()) { |
859 if (!klass.is_null()) { |
859 result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
860 result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL); |
860 } else { |
861 } else { |
861 result = java_lang_String::create_from_symbol(symbol, CHECK_NULL); |
862 Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL); |
862 } |
863 result_oop = result(); |
863 return JNIHandles::make_local(THREAD, result()); |
864 } |
|
865 return JNIHandles::make_local(THREAD, result_oop); |
864 C2V_END |
866 C2V_END |
865 |
867 |
866 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
868 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index)) |
867 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
869 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool); |
868 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index); |
870 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index); |
983 C2V_END |
985 C2V_END |
984 |
986 |
985 C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log)) |
987 C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log)) |
986 ResourceMark rm; |
988 ResourceMark rm; |
987 HandleMark hm; |
989 HandleMark hm; |
988 Handle target_handle = JNIHandles::resolve(target); |
990 Handle target_handle(THREAD, JNIHandles::resolve(target)); |
989 Handle compiled_code_handle = JNIHandles::resolve(compiled_code); |
991 Handle compiled_code_handle(THREAD, JNIHandles::resolve(compiled_code)); |
990 CodeBlob* cb = NULL; |
992 CodeBlob* cb = NULL; |
991 Handle installed_code_handle = JNIHandles::resolve(installed_code); |
993 Handle installed_code_handle(THREAD, JNIHandles::resolve(installed_code)); |
992 Handle speculation_log_handle = JNIHandles::resolve(speculation_log); |
994 Handle speculation_log_handle(THREAD, JNIHandles::resolve(speculation_log)); |
993 |
995 |
994 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK_JNI_ERR); |
996 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK_JNI_ERR); |
995 |
997 |
996 TraceTime install_time("installCode", JVMCICompiler::codeInstallTimer()); |
998 TraceTime install_time("installCode", JVMCICompiler::codeInstallTimer()); |
997 bool is_immutable_PIC = HotSpotCompiledCode::isImmutablePIC(compiled_code_handle) > 0; |
999 bool is_immutable_PIC = HotSpotCompiledCode::isImmutablePIC(compiled_code_handle) > 0; |
1045 |
1047 |
1046 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata)) |
1048 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata)) |
1047 ResourceMark rm; |
1049 ResourceMark rm; |
1048 HandleMark hm; |
1050 HandleMark hm; |
1049 |
1051 |
1050 Handle target_handle = JNIHandles::resolve(target); |
1052 Handle target_handle(THREAD, JNIHandles::resolve(target)); |
1051 Handle compiled_code_handle = JNIHandles::resolve(compiled_code); |
1053 Handle compiled_code_handle(THREAD, JNIHandles::resolve(compiled_code)); |
1052 Handle metadata_handle = JNIHandles::resolve(metadata); |
1054 Handle metadata_handle(THREAD, JNIHandles::resolve(metadata)); |
1053 |
1055 |
1054 CodeMetadata code_metadata; |
1056 CodeMetadata code_metadata; |
1055 CodeBlob *cb = NULL; |
1057 CodeBlob *cb = NULL; |
1056 CodeInstaller installer(true /* immutable PIC compilation */); |
1058 CodeInstaller installer(true /* immutable PIC compilation */); |
1057 |
1059 |
1059 if (result != JVMCIEnv::ok) { |
1061 if (result != JVMCIEnv::ok) { |
1060 return result; |
1062 return result; |
1061 } |
1063 } |
1062 |
1064 |
1063 if (code_metadata.get_nr_pc_desc() > 0) { |
1065 if (code_metadata.get_nr_pc_desc() > 0) { |
1064 typeArrayHandle pcArrayOop = oopFactory::new_byteArray(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full)); |
1066 typeArrayHandle pcArrayOop = oopFactory::new_byteArray_handle(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full)); |
1065 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc()); |
1067 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc()); |
1066 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop()); |
1068 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop()); |
1067 } |
1069 } |
1068 |
1070 |
1069 if (code_metadata.get_scopes_size() > 0) { |
1071 if (code_metadata.get_scopes_size() > 0) { |
1070 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full)); |
1072 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray_handle(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full)); |
1071 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size()); |
1073 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size()); |
1072 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop()); |
1074 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop()); |
1073 } |
1075 } |
1074 |
1076 |
1075 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer(); |
1077 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer(); |
1076 typeArrayHandle relocArrayOop = oopFactory::new_byteArray((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full)); |
1078 typeArrayHandle relocArrayOop = oopFactory::new_byteArray_handle((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full)); |
1077 if (reloc_buffer->size() > 0) { |
1079 if (reloc_buffer->size() > 0) { |
1078 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size()); |
1080 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size()); |
1079 } |
1081 } |
1080 HotSpotMetaData::set_relocBytes(metadata_handle, relocArrayOop()); |
1082 HotSpotMetaData::set_relocBytes(metadata_handle, relocArrayOop()); |
1081 |
1083 |
1082 const OopMapSet* oopMapSet = installer.oopMapSet(); |
1084 const OopMapSet* oopMapSet = installer.oopMapSet(); |
1083 { |
1085 { |
1084 ResourceMark mark; |
1086 ResourceMark mark; |
1085 ImmutableOopMapBuilder builder(oopMapSet); |
1087 ImmutableOopMapBuilder builder(oopMapSet); |
1086 int oopmap_size = builder.heap_size(); |
1088 int oopmap_size = builder.heap_size(); |
1087 typeArrayHandle oopMapArrayHandle = oopFactory::new_byteArray(oopmap_size, CHECK_(JVMCIEnv::cache_full)); |
1089 typeArrayHandle oopMapArrayHandle = oopFactory::new_byteArray_handle(oopmap_size, CHECK_(JVMCIEnv::cache_full)); |
1088 builder.generate_into((address) oopMapArrayHandle->byte_at_addr(0)); |
1090 builder.generate_into((address) oopMapArrayHandle->byte_at_addr(0)); |
1089 HotSpotMetaData::set_oopMaps(metadata_handle, oopMapArrayHandle()); |
1091 HotSpotMetaData::set_oopMaps(metadata_handle, oopMapArrayHandle()); |
1090 } |
1092 } |
1091 |
1093 |
1092 AOTOopRecorder* recorder = code_metadata.get_oop_recorder(); |
1094 AOTOopRecorder* recorder = code_metadata.get_oop_recorder(); |
1093 |
1095 |
1094 int nr_meta_strings = recorder->nr_meta_strings(); |
1096 int nr_meta_strings = recorder->nr_meta_strings(); |
1095 objArrayHandle metadataArrayHandle = oopFactory::new_objectArray(nr_meta_strings, CHECK_(JVMCIEnv::cache_full)); |
1097 objArrayOop metadataArray = oopFactory::new_objectArray(nr_meta_strings, CHECK_(JVMCIEnv::cache_full)); |
|
1098 objArrayHandle metadataArrayHandle(THREAD, metadataArray); |
1096 for (int i = 0; i < nr_meta_strings; ++i) { |
1099 for (int i = 0; i < nr_meta_strings; ++i) { |
1097 const char* element = recorder->meta_element(i); |
1100 const char* element = recorder->meta_element(i); |
1098 Handle java_string = java_lang_String::create_from_str(element, CHECK_(JVMCIEnv::cache_full)); |
1101 Handle java_string = java_lang_String::create_from_str(element, CHECK_(JVMCIEnv::cache_full)); |
1099 metadataArrayHandle->obj_at_put(i, java_string()); |
1102 metadataArrayHandle->obj_at_put(i, java_string()); |
1100 } |
1103 } |
1101 HotSpotMetaData::set_metadata(metadata_handle, metadataArrayHandle()); |
1104 HotSpotMetaData::set_metadata(metadata_handle, metadataArrayHandle()); |
1102 |
1105 |
1103 ExceptionHandlerTable* handler = code_metadata.get_exception_table(); |
1106 ExceptionHandlerTable* handler = code_metadata.get_exception_table(); |
1104 int table_size = handler->size_in_bytes(); |
1107 int table_size = handler->size_in_bytes(); |
1105 typeArrayHandle exceptionArrayOop = oopFactory::new_byteArray(table_size, CHECK_(JVMCIEnv::cache_full)); |
1108 typeArrayHandle exceptionArrayOop = oopFactory::new_byteArray_handle(table_size, CHECK_(JVMCIEnv::cache_full)); |
1106 |
1109 |
1107 if (table_size > 0) { |
1110 if (table_size > 0) { |
1108 handler->copy_bytes_to((address) exceptionArrayOop->byte_at_addr(0)); |
1111 handler->copy_bytes_to((address) exceptionArrayOop->byte_at_addr(0)); |
1109 } |
1112 } |
1110 HotSpotMetaData::set_exceptionBytes(metadata_handle, exceptionArrayOop()); |
1113 HotSpotMetaData::set_exceptionBytes(metadata_handle, exceptionArrayOop()); |
1334 |
1337 |
1335 C2V_VMENTRY(jobject, getNextStackFrame, (JNIEnv*, jobject compilerToVM, jobject hs_frame, jobjectArray methods, jint initialSkip)) |
1338 C2V_VMENTRY(jobject, getNextStackFrame, (JNIEnv*, jobject compilerToVM, jobject hs_frame, jobjectArray methods, jint initialSkip)) |
1336 ResourceMark rm; |
1339 ResourceMark rm; |
1337 |
1340 |
1338 if (!thread->has_last_Java_frame()) return NULL; |
1341 if (!thread->has_last_Java_frame()) return NULL; |
1339 Handle result = HotSpotStackFrameReference::klass()->allocate_instance(thread); |
1342 Handle result = HotSpotStackFrameReference::klass()->allocate_instance_handle(thread); |
1340 HotSpotStackFrameReference::klass()->initialize(thread); |
1343 HotSpotStackFrameReference::klass()->initialize(thread); |
1341 |
1344 |
1342 StackFrameStream fst(thread); |
1345 StackFrameStream fst(thread); |
1343 if (hs_frame != NULL) { |
1346 if (hs_frame != NULL) { |
1344 // look for the correct stack frame if one is given |
1347 // look for the correct stack frame if one is given |
1393 if (scope != NULL && scope->objects() != NULL) { |
1396 if (scope != NULL && scope->objects() != NULL) { |
1394 bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), scope->objects(), THREAD); |
1397 bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), scope->objects(), THREAD); |
1395 Deoptimization::reassign_fields(fst.current(), fst.register_map(), scope->objects(), realloc_failures, false); |
1398 Deoptimization::reassign_fields(fst.current(), fst.register_map(), scope->objects(), realloc_failures, false); |
1396 |
1399 |
1397 GrowableArray<ScopeValue*>* local_values = scope->locals(); |
1400 GrowableArray<ScopeValue*>* local_values = scope->locals(); |
1398 typeArrayHandle array = oopFactory::new_boolArray(local_values->length(), thread); |
1401 typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), thread); |
|
1402 typeArrayHandle array(THREAD, array_oop); |
1399 for (int i = 0; i < local_values->length(); i++) { |
1403 for (int i = 0; i < local_values->length(); i++) { |
1400 ScopeValue* value = local_values->at(i); |
1404 ScopeValue* value = local_values->at(i); |
1401 if (value->is_object()) { |
1405 if (value->is_object()) { |
1402 array->bool_at_put(i, true); |
1406 array->bool_at_put(i, true); |
1403 } |
1407 } |
1434 HotSpotStackFrameReference::set_compilerToVM(result, JNIHandles::resolve(compilerToVM)); |
1438 HotSpotStackFrameReference::set_compilerToVM(result, JNIHandles::resolve(compilerToVM)); |
1435 HotSpotStackFrameReference::set_stackPointer(result, (jlong) fst.current()->sp()); |
1439 HotSpotStackFrameReference::set_stackPointer(result, (jlong) fst.current()->sp()); |
1436 HotSpotStackFrameReference::set_frameNumber(result, frame_number); |
1440 HotSpotStackFrameReference::set_frameNumber(result, frame_number); |
1437 |
1441 |
1438 // initialize the locals array |
1442 // initialize the locals array |
1439 objArrayHandle array = oopFactory::new_objectArray(locals->size(), thread); |
1443 objArrayOop array_oop = oopFactory::new_objectArray(locals->size(), CHECK_NULL); |
|
1444 objArrayHandle array(THREAD, array_oop); |
1440 for (int i = 0; i < locals->size(); i++) { |
1445 for (int i = 0; i < locals->size(); i++) { |
1441 StackValue* var = locals->at(i); |
1446 StackValue* var = locals->at(i); |
1442 if (var->type() == T_OBJECT) { |
1447 if (var->type() == T_OBJECT) { |
1443 array->obj_at_put(i, locals->at(i)->get_obj()()); |
1448 array->obj_at_put(i, locals->at(i)->get_obj()()); |
1444 } |
1449 } |
1486 cp_cache_entry->set_method_handle(cp, callInfo); |
1491 cp_cache_entry->set_method_handle(cp, callInfo); |
1487 } |
1492 } |
1488 C2V_END |
1493 C2V_END |
1489 |
1494 |
1490 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject)) |
1495 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject)) |
1491 objArrayHandle holders = oopFactory::new_objArray(SystemDictionary::String_klass(), 2, CHECK_NULL); |
1496 objArrayHandle holders = oopFactory::new_objArray_handle(SystemDictionary::String_klass(), 2, CHECK_NULL); |
1492 Handle mh = java_lang_String::create_from_str("Ljava/lang/invoke/MethodHandle;", CHECK_NULL); |
1497 Handle mh = java_lang_String::create_from_str("Ljava/lang/invoke/MethodHandle;", CHECK_NULL); |
1493 Handle vh = java_lang_String::create_from_str("Ljava/lang/invoke/VarHandle;", CHECK_NULL); |
1498 Handle vh = java_lang_String::create_from_str("Ljava/lang/invoke/VarHandle;", CHECK_NULL); |
1494 holders->obj_at_put(0, mh()); |
1499 holders->obj_at_put(0, mh()); |
1495 holders->obj_at_put(1, vh()); |
1500 holders->obj_at_put(1, vh()); |
1496 return JNIHandles::make_local(THREAD, holders()); |
1501 return JNIHandles::make_local(THREAD, holders()); |
1593 |
1598 |
1594 // all locals are materialized by now |
1599 // all locals are materialized by now |
1595 HotSpotStackFrameReference::set_localIsVirtual(hs_frame, NULL); |
1600 HotSpotStackFrameReference::set_localIsVirtual(hs_frame, NULL); |
1596 |
1601 |
1597 // update the locals array |
1602 // update the locals array |
1598 objArrayHandle array = HotSpotStackFrameReference::locals(hs_frame); |
1603 objArrayHandle array(THREAD, HotSpotStackFrameReference::locals(hs_frame)); |
1599 StackValueCollection* locals = virtualFrames->at(last_frame_number)->locals(); |
1604 StackValueCollection* locals = virtualFrames->at(last_frame_number)->locals(); |
1600 for (int i = 0; i < locals->size(); i++) { |
1605 for (int i = 0; i < locals->size(); i++) { |
1601 StackValue* var = locals->at(i); |
1606 StackValue* var = locals->at(i); |
1602 if (var->type() == T_OBJECT) { |
1607 if (var->type() == T_OBJECT) { |
1603 array->obj_at_put(i, locals->at(i)->get_obj()()); |
1608 array->obj_at_put(i, locals->at(i)->get_obj()()); |
1694 } |
1699 } |
1695 return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; |
1700 return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; |
1696 C2V_END |
1701 C2V_END |
1697 |
1702 |
1698 C2V_VMENTRY(void, compileToBytecode, (JNIEnv*, jobject, jobject lambda_form_handle)) |
1703 C2V_VMENTRY(void, compileToBytecode, (JNIEnv*, jobject, jobject lambda_form_handle)) |
1699 Handle lambda_form = JNIHandles::resolve_non_null(lambda_form_handle); |
1704 Handle lambda_form(THREAD, JNIHandles::resolve_non_null(lambda_form_handle)); |
1700 if (lambda_form->is_a(SystemDictionary::LambdaForm_klass())) { |
1705 if (lambda_form->is_a(SystemDictionary::LambdaForm_klass())) { |
1701 TempNewSymbol compileToBytecode = SymbolTable::new_symbol("compileToBytecode", CHECK); |
1706 TempNewSymbol compileToBytecode = SymbolTable::new_symbol("compileToBytecode", CHECK); |
1702 JavaValue result(T_VOID); |
1707 JavaValue result(T_VOID); |
1703 JavaCalls::call_special(&result, lambda_form, SystemDictionary::LambdaForm_klass(), compileToBytecode, vmSymbols::void_method_signature(), CHECK); |
1708 JavaCalls::call_special(&result, lambda_form, SystemDictionary::LambdaForm_klass(), compileToBytecode, vmSymbols::void_method_signature(), CHECK); |
1704 } else { |
1709 } else { |