comparison src/share/vm/graal/graalCompilerToVM.cpp @ 9025:ff5a32117e02

Implement fast invocation of installed code (direct tail call to the target machine code address).
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 12 Apr 2013 01:53:52 +0200
parents 2b840ae76df1
children e0e85d78843b
comparison
equal deleted inserted replaced
9024:2b840ae76df1 9025:ff5a32117e02
896 methodHandle method = asMethod(metaspace_method); 896 methodHandle method = asMethod(metaspace_method);
897 oop element = java_lang_StackTraceElement::create(method, bci, CHECK_NULL); 897 oop element = java_lang_StackTraceElement::create(method, bci, CHECK_NULL);
898 return JNIHandles::make_local(element); 898 return JNIHandles::make_local(element);
899 C2V_END 899 C2V_END
900 900
901 C2V_VMENTRY(jobject, executeCompiledMethodVarargs, (JNIEnv *env, jobject args, jlong nativeMethod)) 901 C2V_VMENTRY(jobject, executeCompiledMethodVarargs, (JNIEnv *env, jobject, jobject args, jlong nativeMethod))
902 ResourceMark rm; 902 ResourceMark rm;
903 HandleMark hm; 903 HandleMark hm;
904
905 assert(metaspace_method != 0, "just checking");
906 904
907 nmethod* nm = (nmethod*) (address) nativeMethod; 905 nmethod* nm = (nmethod*) (address) nativeMethod;
908 methodHandle mh = nm->method(); 906 methodHandle mh = nm->method();
909 Symbol* signature = mh->signature(); 907 Symbol* signature = mh->signature();
910 JavaCallArguments jca(mh->size_of_parameters()); 908 JavaCallArguments jca(mh->size_of_parameters());
920 return JNIHandles::make_local((oop) result.get_jobject()); 918 return JNIHandles::make_local((oop) result.get_jobject());
921 } else { 919 } else {
922 oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL); 920 oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL);
923 return JNIHandles::make_local(o); 921 return JNIHandles::make_local(o);
924 } 922 }
925 C2V_END
926
927 C2V_VMENTRY(jobject, executeCompiledMethod, (JNIEnv *env, jobject, jobject arg1, jobject arg2, jobject arg3, jlong nativeMethod))
928 ResourceMark rm;
929 HandleMark hm;
930
931 nmethod* nm = (nmethod*) (address) nativeMethod;
932 methodHandle method = nm->method();
933 JavaValue result(T_OBJECT);
934 JavaCallArguments args;
935 args.push_oop(JNIHandles::resolve(arg1));
936 args.push_oop(JNIHandles::resolve(arg2));
937 args.push_oop(JNIHandles::resolve(arg3));
938
939 args.set_alternative_target(nm);
940 JavaCalls::call(&result, method, &args, CHECK_NULL);
941
942 return JNIHandles::make_local((oop) result.get_jobject());
943 C2V_END 923 C2V_END
944 924
945 C2V_VMENTRY(jint, getVtableEntryOffset, (JNIEnv *, jobject, jlong metaspace_method)) 925 C2V_VMENTRY(jint, getVtableEntryOffset, (JNIEnv *, jobject, jlong metaspace_method))
946 926
947 Method* method = asMethod(metaspace_method); 927 Method* method = asMethod(metaspace_method);
1060 C2V_END 1040 C2V_END
1061 1041
1062 1042
1063 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv *env, jobject, jlong nativeMethod)) 1043 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv *env, jobject, jlong nativeMethod))
1064 nmethod* m = (nmethod*)nativeMethod; 1044 nmethod* m = (nmethod*)nativeMethod;
1065 m->mark_for_deoptimization(); 1045 if (!m->is_not_entrant()) {
1066 VM_Deoptimize op; 1046 m->mark_for_deoptimization();
1067 VMThread::execute(&op); 1047 VM_Deoptimize op;
1048 VMThread::execute(&op);
1049 }
1068 C2V_END 1050 C2V_END
1069 1051
1070 1052
1071 C2V_VMENTRY(jboolean, isInstalledCodeValid, (JNIEnv *env, jobject, jlong nativeMethod)) 1053 C2V_VMENTRY(jboolean, isInstalledCodeValid, (JNIEnv *env, jobject, jlong nativeMethod))
1072 nmethod* m = (nmethod*)nativeMethod; 1054 nmethod* m = (nmethod*)nativeMethod;
1073 return m->is_alive(); 1055 return m->is_alive() && !m->is_not_entrant();
1074 C2V_END 1056 C2V_END
1075 1057
1076 #define CC (char*) /*cast a literal from (const char*)*/ 1058 #define CC (char*) /*cast a literal from (const char*)*/
1077 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f)) 1059 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f))
1078 1060
1139 {CC"getJavaField", CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD, FN_PTR(getJavaField)}, 1121 {CC"getJavaField", CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD, FN_PTR(getJavaField)},
1140 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)}, 1122 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)},
1141 {CC"installCode0", CC"("HS_COMP_RESULT HS_INSTALLED_CODE"[Z)I", FN_PTR(installCode0)}, 1123 {CC"installCode0", CC"("HS_COMP_RESULT HS_INSTALLED_CODE"[Z)I", FN_PTR(installCode0)},
1142 {CC"getCode", CC"(J)[B", FN_PTR(getCode)}, 1124 {CC"getCode", CC"(J)[B", FN_PTR(getCode)},
1143 {CC"disassembleNMethod", CC"(J)"STRING, FN_PTR(disassembleNMethod)}, 1125 {CC"disassembleNMethod", CC"(J)"STRING, FN_PTR(disassembleNMethod)},
1144 {CC"executeCompiledMethod", CC"("OBJECT OBJECT OBJECT NMETHOD")"OBJECT, FN_PTR(executeCompiledMethod)},
1145 {CC"executeCompiledMethodVarargs", CC"(["OBJECT NMETHOD")"OBJECT, FN_PTR(executeCompiledMethodVarargs)}, 1126 {CC"executeCompiledMethodVarargs", CC"(["OBJECT NMETHOD")"OBJECT, FN_PTR(executeCompiledMethodVarargs)},
1146 {CC"getDeoptedLeafGraphIds", CC"()[J", FN_PTR(getDeoptedLeafGraphIds)}, 1127 {CC"getDeoptedLeafGraphIds", CC"()[J", FN_PTR(getDeoptedLeafGraphIds)},
1147 {CC"getLineNumberTable", CC"("HS_RESOLVED_METHOD")[J", FN_PTR(getLineNumberTable)}, 1128 {CC"getLineNumberTable", CC"("HS_RESOLVED_METHOD")[J", FN_PTR(getLineNumberTable)},
1148 {CC"getLocalVariableTable", CC"("HS_RESOLVED_METHOD")["LOCAL, FN_PTR(getLocalVariableTable)}, 1129 {CC"getLocalVariableTable", CC"("HS_RESOLVED_METHOD")["LOCAL, FN_PTR(getLocalVariableTable)},
1149 {CC"getFileName", CC"("HS_RESOLVED_JAVA_TYPE")"STRING, FN_PTR(getFileName)}, 1130 {CC"getFileName", CC"("HS_RESOLVED_JAVA_TYPE")"STRING, FN_PTR(getFileName)},