hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
changeset 46329 53ccc37bda19
parent 46327 91576389a517
child 46338 e84b501fa52e
equal deleted inserted replaced
46328:6061df52d610 46329:53ccc37bda19
    75     return (oop)result.get_jobject();
    75     return (oop)result.get_jobject();
    76   }
    76   }
    77   return NULL;
    77   return NULL;
    78 }
    78 }
    79 
    79 
    80 oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) {
    80 oop CompilerToVM::get_jvmci_type(Klass* 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(Handle(THREAD, 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 
   676   JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
   676   JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
   677   return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
   677   return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
   678 }
   678 }
   679 
   679 
   680 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
   680 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
   681   KlassHandle klass;
   681   Klass* klass = NULL;
   682   oop base_object = JNIHandles::resolve(base);
   682   oop base_object = JNIHandles::resolve(base);
   683   jlong base_address = 0;
   683   jlong base_address = 0;
   684   if (base_object != NULL && offset == oopDesc::klass_offset_in_bytes()) {
   684   if (base_object != NULL && offset == oopDesc::klass_offset_in_bytes()) {
   685     klass = base_object->klass();
   685     klass = base_object->klass();
   686   } else if (!compressed) {
   686   } else if (!compressed) {
   701     klass = *((Klass**) (intptr_t) (base_address + offset));
   701     klass = *((Klass**) (intptr_t) (base_address + offset));
   702   } else {
   702   } else {
   703     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
   703     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
   704                 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", base_object->klass()->external_name(), offset, compressed ? "true" : "false"));
   704                 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", base_object->klass()->external_name(), offset, compressed ? "true" : "false"));
   705   }
   705   }
   706   assert (klass.is_null() || klass->is_klass(), "invalid read");
   706   assert (klass == NULL || klass->is_klass(), "invalid read");
   707   oop result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   707   oop result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   708   return JNIHandles::make_local(THREAD, result);
   708   return JNIHandles::make_local(THREAD, result);
   709 }
   709 }
   710 
   710 
   711 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method))
   711 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method))
   712   ResourceMark rm;
   712   ResourceMark rm;
   713   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   713   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   714   KlassHandle holder = CompilerToVM::asKlass(jvmci_type);
   714   Klass* holder = CompilerToVM::asKlass(jvmci_type);
   715   if (holder->is_interface()) {
   715   if (holder->is_interface()) {
   716     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", holder->external_name()));
   716     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", holder->external_name()));
   717   }
   717   }
   718 
   718 
   719   methodHandle ucm;
   719   methodHandle ucm;
   720   {
   720   {
   721     MutexLocker locker(Compile_lock);
   721     MutexLocker locker(Compile_lock);
   722     ucm = Dependencies::find_unique_concrete_method(holder(), method());
   722     ucm = Dependencies::find_unique_concrete_method(holder, method());
   723   }
   723   }
   724   oop result = CompilerToVM::get_jvmci_method(ucm, CHECK_NULL);
   724   oop result = CompilerToVM::get_jvmci_method(ucm, CHECK_NULL);
   725   return JNIHandles::make_local(THREAD, result);
   725   return JNIHandles::make_local(THREAD, result);
   726 C2V_END
   726 C2V_END
   727 
   727 
   846   return JNIHandles::make_local(THREAD, klass);
   846   return JNIHandles::make_local(THREAD, klass);
   847 C2V_END
   847 C2V_END
   848 
   848 
   849 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))
   850   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
   850   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
   851   KlassHandle loading_klass(cp->pool_holder());
   851   Klass* loading_klass = cp->pool_holder();
   852   bool is_accessible = false;
   852   bool is_accessible = false;
   853   KlassHandle klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass);
   853   Klass* klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass);
   854   Symbol* symbol = NULL;
   854   Symbol* symbol = NULL;
   855   if (klass.is_null()) {
   855   if (klass == NULL) {
   856     symbol = cp->klass_name_at(index);
   856     symbol = cp->klass_name_at(index);
   857   }
   857   }
   858   oop result_oop;
   858   oop result_oop;
   859   if (!klass.is_null()) {
   859   if (klass != NULL) {
   860     result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   860     result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   861   } else {
   861   } else {
   862     Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL);
   862     Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL);
   863     result_oop = result();
   863     result_oop = result();
   864   }
   864   }
   871   return JNIHandles::make_local(THREAD, appendix_oop);
   871   return JNIHandles::make_local(THREAD, appendix_oop);
   872 C2V_END
   872 C2V_END
   873 
   873 
   874 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   874 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   875   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
   875   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
   876   instanceKlassHandle pool_holder(cp->pool_holder());
   876   InstanceKlass* pool_holder = cp->pool_holder();
   877   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
   877   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
   878   methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder);
   878   methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder);
   879   oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL);
   879   oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL);
   880   return JNIHandles::make_local(THREAD, result);
   880   return JNIHandles::make_local(THREAD, result);
   881 C2V_END
   881 C2V_END
   918   }
   918   }
   919   return LinkResolver::vtable_index_of_interface_method(klass, method);
   919   return LinkResolver::vtable_index_of_interface_method(klass, method);
   920 C2V_END
   920 C2V_END
   921 
   921 
   922 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   922 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   923   KlassHandle recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
   923   Klass* recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
   924   KlassHandle caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
   924   Klass* caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
   925   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   925   methodHandle method = CompilerToVM::asMethod(jvmci_method);
   926 
   926 
   927   KlassHandle h_resolved   (THREAD, method->method_holder());
   927   Klass* resolved     = method->method_holder();
   928   Symbol* h_name      = method->name();
   928   Symbol* h_name      = method->name();
   929   Symbol* h_signature = method->signature();
   929   Symbol* h_signature = method->signature();
   930 
   930 
   931   if (MethodHandles::is_signature_polymorphic_method(method())) {
   931   if (MethodHandles::is_signature_polymorphic_method(method())) {
   932       // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case.
   932       // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case.
   933       return NULL;
   933       return NULL;
   934   }
   934   }
   935 
   935 
   936   LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass);
   936   LinkInfo link_info(resolved, h_name, h_signature, caller_klass);
   937   methodHandle m;
   937   methodHandle m;
   938   // Only do exact lookup if receiver klass has been linked.  Otherwise,
   938   // Only do exact lookup if receiver klass has been linked.  Otherwise,
   939   // the vtable has not been setup, and the LinkResolver will fail.
   939   // the vtable has not been setup, and the LinkResolver will fail.
   940   if (recv_klass->is_array_klass() ||
   940   if (recv_klass->is_array_klass() ||
   941       InstanceKlass::cast(recv_klass())->is_linked() && !recv_klass->is_interface()) {
   941       InstanceKlass::cast(recv_klass)->is_linked() && !recv_klass->is_interface()) {
   942     if (h_resolved->is_interface()) {
   942     if (resolved->is_interface()) {
   943       m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
   943       m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
   944     } else {
   944     } else {
   945       m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
   945       m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
   946     }
   946     }
   947   }
   947   }
  1480   cp_cache_entry->set_dynamic_call(cp, callInfo);
  1480   cp_cache_entry->set_dynamic_call(cp, callInfo);
  1481 C2V_END
  1481 C2V_END
  1482 
  1482 
  1483 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
  1483 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
  1484   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
  1484   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
  1485   KlassHandle holder = cp->klass_ref_at(index, CHECK);
  1485   Klass* holder = cp->klass_ref_at(index, CHECK);
  1486   Symbol* name = cp->name_ref_at(index);
  1486   Symbol* name = cp->name_ref_at(index);
  1487   if (MethodHandles::is_signature_polymorphic_name(holder(), name)) {
  1487   if (MethodHandles::is_signature_polymorphic_name(holder, name)) {
  1488     CallInfo callInfo;
  1488     CallInfo callInfo;
  1489     LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
  1489     LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
  1490     ConstantPoolCacheEntry* cp_cache_entry = cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1490     ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
  1491     cp_cache_entry->set_method_handle(cp, callInfo);
  1491     cp_cache_entry->set_method_handle(cp, callInfo);
  1492   }
  1492   }
  1493 C2V_END
  1493 C2V_END
  1494 
  1494 
  1495 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject))
  1495 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject))