< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page




 234   } else if (flag->is_uintx()) {
 235     RETURN_BOXED_LONG(flag->get_uintx());
 236   } else if (flag->is_double()) {
 237     RETURN_BOXED_DOUBLE(flag->get_double());
 238   } else {
 239     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
 240   }
 241 #undef RETURN_BOXED_LONG
 242 #undef RETURN_BOXED_DOUBLE
 243 C2V_END
 244 
 245 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
 246   requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
 247   if (oop_address == 0) {
 248     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
 249   }
 250   oop obj = *((oopDesc**) oop_address);
 251   if (obj != NULL) {
 252     oopDesc::verify(obj);
 253   }
 254   return JNIHandles::make_local(obj);
 255 C2V_END
 256 
 257 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
 258   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 259 
 260   int code_size = method->code_size();
 261   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
 262 
 263   guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
 264   // iterate over all bytecodes and replace non-Java bytecodes
 265 
 266   for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
 267     Bytecodes::Code code = s.code();
 268     Bytecodes::Code raw_code = s.raw_code();
 269     int bci = s.bci();
 270     int len = s.instruction_size();
 271 
 272     // Restore original byte code.
 273     reconstituted_code[bci] =  (jbyte) (s.is_wide()? Bytecodes::_wide : code);
 274     if (len > 1) {


1021   HandleMark hm;
1022 
1023   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1024   nmethodLocker locker;
1025   nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, locker);
1026   if (nm == NULL || !nm->is_in_use()) {
1027     JVMCI_THROW_NULL(InvalidInstalledCodeException);
1028   }
1029   methodHandle mh(THREAD, nm->method());
1030   Symbol* signature = mh->signature();
1031   JavaCallArguments jca(mh->size_of_parameters());
1032 
1033   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1034   JavaValue result(jap.return_type());
1035   jca.set_alternative_target(Handle(THREAD, JNIHandles::resolve(nmethod_mirror.as_jobject())));
1036   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1037 
1038   if (jap.return_type() == T_VOID) {
1039     return NULL;
1040   } else if (is_reference_type(jap.return_type())) {
1041     return JNIHandles::make_local((oop) result.get_jobject());
1042   } else {
1043     jvalue *value = (jvalue *) result.get_value_addr();
1044     // Narrow the value down if required (Important on big endian machines)
1045     switch (jap.return_type()) {
1046       case T_BOOLEAN:
1047        value->z = (jboolean) value->i;
1048        break;
1049       case T_BYTE:
1050        value->b = (jbyte) value->i;
1051        break;
1052       case T_CHAR:
1053        value->c = (jchar) value->i;
1054        break;
1055       case T_SHORT:
1056        value->s = (jshort) value->i;
1057        break;
1058       default:
1059         break;
1060     }
1061     JVMCIObject o = JVMCIENV->create_box(jap.return_type(), value, JVMCI_CHECK_NULL);


2297         if (entry == NULL) {
2298           JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
2299               method->name_and_sig_as_C_string(),
2300               jni_name, jni_long_name, sl_path));
2301         }
2302       }
2303 
2304       if (method->has_native_function() && entry != method->native_function()) {
2305         JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
2306             method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
2307       }
2308       method->set_native_function(entry, Method::native_bind_event_is_interesting);
2309       log_debug(jni, resolve)("[Dynamic-linking native method %s.%s ... JNI] @ " PTR_FORMAT,
2310                               method->method_holder()->external_name(),
2311                               method->name()->as_C_string(),
2312                               p2i((void*) entry));
2313     }
2314   }
2315 
2316   typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
2317   jlongArray info = (jlongArray) JNIHandles::make_local(info_oop);
2318   runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
2319   return info;
2320 }
2321 
2322 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
2323   if (thread == NULL) {
2324     // Called from unattached JVMCI shared library thread
2325     return false;
2326   }
2327   JVMCITraceMark jtm("isCurrentThreadAttached");
2328   if (thread->jni_environment() == env) {
2329     C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
2330     requireJVMCINativeLibrary(JVMCI_CHECK_0);
2331     JVMCIRuntime* runtime = JVMCI::compiler_runtime();
2332     if (runtime == NULL || !runtime->has_shared_library_javavm()) {
2333       JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in isCurrentThreadAttached");
2334     }
2335     JNIEnv* peerEnv;
2336     return runtime->GetEnv(thread, (void**) &peerEnv, JNI_VERSION_1_2) == JNI_OK;
2337   }


2548     executable = Reflection::new_method(m, false, CHECK_NULL);
2549   }
2550   return JNIHandles::make_local(THREAD, executable);
2551 }
2552 
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554   requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555   Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556   if (!klass->is_instance_klass()) {
2557     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558         err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559   }
2560   InstanceKlass* iklass = InstanceKlass::cast(klass);
2561   Array<u2>* fields = iklass->fields();
2562   if (index < 0 ||index > fields->length()) {
2563     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564         err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565   }
2566   fieldDescriptor fd(iklass, index);
2567   oop reflected = Reflection::new_field(&fd, CHECK_NULL);
2568   return JNIHandles::make_local(env, reflected);
2569 }
2570 
2571 C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
2572   FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
2573   int result_length = 0;
2574   for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
2575     result_length++;
2576   }
2577   int current_length = 0;
2578   JVMCIObjectArray current_array = NULL;
2579   if (current != NULL) {
2580     current_array = JVMCIENV->wrap(current);
2581     current_length = JVMCIENV->get_length(current_array);
2582     if (current_length == result_length) {
2583       // No new failures
2584       return current;
2585     }
2586   }
2587   JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2588   int result_index = 0;




 234   } else if (flag->is_uintx()) {
 235     RETURN_BOXED_LONG(flag->get_uintx());
 236   } else if (flag->is_double()) {
 237     RETURN_BOXED_DOUBLE(flag->get_double());
 238   } else {
 239     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
 240   }
 241 #undef RETURN_BOXED_LONG
 242 #undef RETURN_BOXED_DOUBLE
 243 C2V_END
 244 
 245 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
 246   requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
 247   if (oop_address == 0) {
 248     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
 249   }
 250   oop obj = *((oopDesc**) oop_address);
 251   if (obj != NULL) {
 252     oopDesc::verify(obj);
 253   }
 254   return JNIHandles::make_local(THREAD, obj);
 255 C2V_END
 256 
 257 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
 258   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 259 
 260   int code_size = method->code_size();
 261   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
 262 
 263   guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
 264   // iterate over all bytecodes and replace non-Java bytecodes
 265 
 266   for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
 267     Bytecodes::Code code = s.code();
 268     Bytecodes::Code raw_code = s.raw_code();
 269     int bci = s.bci();
 270     int len = s.instruction_size();
 271 
 272     // Restore original byte code.
 273     reconstituted_code[bci] =  (jbyte) (s.is_wide()? Bytecodes::_wide : code);
 274     if (len > 1) {


1021   HandleMark hm;
1022 
1023   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1024   nmethodLocker locker;
1025   nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, locker);
1026   if (nm == NULL || !nm->is_in_use()) {
1027     JVMCI_THROW_NULL(InvalidInstalledCodeException);
1028   }
1029   methodHandle mh(THREAD, nm->method());
1030   Symbol* signature = mh->signature();
1031   JavaCallArguments jca(mh->size_of_parameters());
1032 
1033   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1034   JavaValue result(jap.return_type());
1035   jca.set_alternative_target(Handle(THREAD, JNIHandles::resolve(nmethod_mirror.as_jobject())));
1036   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1037 
1038   if (jap.return_type() == T_VOID) {
1039     return NULL;
1040   } else if (is_reference_type(jap.return_type())) {
1041     return JNIHandles::make_local(THREAD, (oop) result.get_jobject());
1042   } else {
1043     jvalue *value = (jvalue *) result.get_value_addr();
1044     // Narrow the value down if required (Important on big endian machines)
1045     switch (jap.return_type()) {
1046       case T_BOOLEAN:
1047        value->z = (jboolean) value->i;
1048        break;
1049       case T_BYTE:
1050        value->b = (jbyte) value->i;
1051        break;
1052       case T_CHAR:
1053        value->c = (jchar) value->i;
1054        break;
1055       case T_SHORT:
1056        value->s = (jshort) value->i;
1057        break;
1058       default:
1059         break;
1060     }
1061     JVMCIObject o = JVMCIENV->create_box(jap.return_type(), value, JVMCI_CHECK_NULL);


2297         if (entry == NULL) {
2298           JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
2299               method->name_and_sig_as_C_string(),
2300               jni_name, jni_long_name, sl_path));
2301         }
2302       }
2303 
2304       if (method->has_native_function() && entry != method->native_function()) {
2305         JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
2306             method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
2307       }
2308       method->set_native_function(entry, Method::native_bind_event_is_interesting);
2309       log_debug(jni, resolve)("[Dynamic-linking native method %s.%s ... JNI] @ " PTR_FORMAT,
2310                               method->method_holder()->external_name(),
2311                               method->name()->as_C_string(),
2312                               p2i((void*) entry));
2313     }
2314   }
2315 
2316   typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
2317   jlongArray info = (jlongArray) JNIHandles::make_local(THREAD, info_oop);
2318   runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
2319   return info;
2320 }
2321 
2322 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
2323   if (thread == NULL) {
2324     // Called from unattached JVMCI shared library thread
2325     return false;
2326   }
2327   JVMCITraceMark jtm("isCurrentThreadAttached");
2328   if (thread->jni_environment() == env) {
2329     C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
2330     requireJVMCINativeLibrary(JVMCI_CHECK_0);
2331     JVMCIRuntime* runtime = JVMCI::compiler_runtime();
2332     if (runtime == NULL || !runtime->has_shared_library_javavm()) {
2333       JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in isCurrentThreadAttached");
2334     }
2335     JNIEnv* peerEnv;
2336     return runtime->GetEnv(thread, (void**) &peerEnv, JNI_VERSION_1_2) == JNI_OK;
2337   }


2548     executable = Reflection::new_method(m, false, CHECK_NULL);
2549   }
2550   return JNIHandles::make_local(THREAD, executable);
2551 }
2552 
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554   requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555   Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556   if (!klass->is_instance_klass()) {
2557     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558         err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559   }
2560   InstanceKlass* iklass = InstanceKlass::cast(klass);
2561   Array<u2>* fields = iklass->fields();
2562   if (index < 0 ||index > fields->length()) {
2563     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564         err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565   }
2566   fieldDescriptor fd(iklass, index);
2567   oop reflected = Reflection::new_field(&fd, CHECK_NULL);
2568   return JNIHandles::make_local(THREAD, reflected);
2569 }
2570 
2571 C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
2572   FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
2573   int result_length = 0;
2574   for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
2575     result_length++;
2576   }
2577   int current_length = 0;
2578   JVMCIObjectArray current_array = NULL;
2579   if (current != NULL) {
2580     current_array = JVMCIENV->wrap(current);
2581     current_length = JVMCIENV->get_length(current_array);
2582     if (current_length == result_length) {
2583       // No new failures
2584       return current;
2585     }
2586   }
2587   JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2588   int result_index = 0;


< prev index next >