comparison src/share/vm/graal/graalCompilerToVM.cpp @ 5003:5e6f1026a63e

fixes to vtable stub inlining: compute offset on demand, look out for interface methods
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 01 Mar 2012 15:36:35 +0100
parents b5dc2403c1e7
children 5e9f38419819
comparison
equal deleted inserted replaced
5002:6072d5da5c20 5003:5e6f1026a63e
949 JavaCalls::call(&result, actualMethod, nm, &args, CHECK_NULL); 949 JavaCalls::call(&result, actualMethod, nm, &args, CHECK_NULL);
950 950
951 return JNIHandles::make_local((oop) result.get_jobject()); 951 return JNIHandles::make_local((oop) result.get_jobject());
952 } 952 }
953 953
954 // public native int RiMethod_vtableEntryOffset(HotSpotMethodResolved method);
955 JNIEXPORT jint JNICALL Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_RiMethod_vtableEntryOffset(JNIEnv *, jobject, jobject hotspot_method) {
956 TRACE_graal_3("CompilerToVM::RiMethod_vtableEntryOffset");
957
958 methodOop method = getMethodFromHotSpotMethod(hotspot_method);
959 assert(!instanceKlass::cast(method->method_holder())->is_interface(), "vtableEntryOffset cannot be called for interface methods");
960
961 // get entry offset in words
962 int vtable_entry_offset = instanceKlass::vtable_start_offset() + method->vtable_index() * vtableEntry::size();
963 // convert to bytes
964 vtable_entry_offset = vtable_entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
965
966 return vtable_entry_offset;
967 }
968
954 969
955 #define CC (char*) /*cast a literal from (const char*)*/ 970 #define CC (char*) /*cast a literal from (const char*)*/
956 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_##f)) 971 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_##f))
957 972
958 #define PROXY "J" 973 #define PROXY "J"
1011 {CC"installMethod", CC"("TARGET_METHOD"Z)"HS_COMP_METHOD, FN_PTR(installMethod)}, 1026 {CC"installMethod", CC"("TARGET_METHOD"Z)"HS_COMP_METHOD, FN_PTR(installMethod)},
1012 {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)}, 1027 {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)},
1013 {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)}, 1028 {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)},
1014 {CC"disassembleJava", CC"("RESOLVED_METHOD")"STRING, FN_PTR(disassembleJava)}, 1029 {CC"disassembleJava", CC"("RESOLVED_METHOD")"STRING, FN_PTR(disassembleJava)},
1015 {CC"executeCompiledMethod", CC"("HS_COMP_METHOD OBJECT OBJECT OBJECT")"OBJECT, FN_PTR(executeCompiledMethod)}, 1030 {CC"executeCompiledMethod", CC"("HS_COMP_METHOD OBJECT OBJECT OBJECT")"OBJECT, FN_PTR(executeCompiledMethod)},
1031 {CC"RiMethod_vtableEntryOffset", CC"("RESOLVED_METHOD")I", FN_PTR(RiMethod_vtableEntryOffset)},
1016 }; 1032 };
1017 1033
1018 int CompilerToVM_methods_count() { 1034 int CompilerToVM_methods_count() {
1019 return sizeof(CompilerToVM_methods) / sizeof(JNINativeMethod); 1035 return sizeof(CompilerToVM_methods) / sizeof(JNINativeMethod);
1020 } 1036 }