Mercurial > hg > truffle
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)}, |