# HG changeset patch # User Thomas Wuerthinger # Date 1294675188 -3600 # Node ID 7e09ea4a8f36e5b26a1f9b9cb84d7d9b98009eb5 # Parent 177398c6147d5b482029dcac009a30fec1ed5650 Added leaf method assumptions. diff -r 177398c6147d -r 7e09ea4a8f36 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java Mon Jan 10 10:50:22 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java Mon Jan 10 16:59:48 2011 +0100 @@ -161,6 +161,11 @@ } @Override + public RiMethod uniqueConcreteMethod() { + return Compiler.getVMEntries().RiMethod_uniqueConcreteMethod(vmId); + } + + @Override public RiSignature signature() { if (signature == null) { signature = new HotSpotSignature(Compiler.getVMEntries().RiMethod_signature(vmId)); diff -r 177398c6147d -r 7e09ea4a8f36 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java Mon Jan 10 10:50:22 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java Mon Jan 10 16:59:48 2011 +0100 @@ -90,6 +90,11 @@ } @Override + public RiMethod uniqueConcreteMethod() { + throw unresolved("uniqueConcreteMethod()"); + } + + @Override public int accessFlags() { throw unresolved("accessFlags"); } diff -r 177398c6147d -r 7e09ea4a8f36 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java Mon Jan 10 10:50:22 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java Mon Jan 10 16:59:48 2011 +0100 @@ -81,9 +81,10 @@ boolean RiMethod_hasBalancedMonitors(long vmId); + RiMethod RiMethod_uniqueConcreteMethod(long vmId); + void recordBailout(String reason); RiType RiType_uniqueConcreteSubtype(HotSpotTypeResolved hotSpotTypeResolved); - // Checkstyle: resume } diff -r 177398c6147d -r 7e09ea4a8f36 c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Mon Jan 10 10:50:22 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Mon Jan 10 16:59:48 2011 +0100 @@ -110,5 +110,8 @@ @Override public native void recordBailout(String reason); + @Override + public native RiMethod RiMethod_uniqueConcreteMethod(long vmId); + // Checkstyle: resume } diff -r 177398c6147d -r 7e09ea4a8f36 src/share/vm/c1x/c1x_CodeInstaller.cpp --- a/src/share/vm/c1x/c1x_CodeInstaller.cpp Mon Jan 10 10:50:22 2011 +0100 +++ b/src/share/vm/c1x/c1x_CodeInstaller.cpp Mon Jan 10 16:59:48 2011 +0100 @@ -313,7 +313,17 @@ } void CodeInstaller::assumption_ConcreteMethod(oop assumption) { - fatal("unimplemented"); + oop context_oop = CiAssumptions_ConcreteMethod::context(assumption); + oop method_oop = CiAssumptions_ConcreteMethod::method(assumption); + jlong context_oop_id = HotSpotMethodResolved::vmId(context_oop); + jlong method_oop_id = HotSpotMethodResolved::vmId(method_oop); + methodOop method = VmIds::get(method_oop_id); + methodOop context = VmIds::get(context_oop_id); + + ciMethod* m = (ciMethod*) CURRENT_ENV->get_object(method); + ciMethod* c = (ciMethod*) CURRENT_ENV->get_object(context); + ciKlass* context_klass = c->holder(); + _dependencies->assert_unique_concrete_method(context_klass, m); } void CodeInstaller::process_exception_handlers() { diff -r 177398c6147d -r 7e09ea4a8f36 src/share/vm/c1x/c1x_VMEntries.cpp --- a/src/share/vm/c1x/c1x_VMEntries.cpp Mon Jan 10 10:50:22 2011 +0100 +++ b/src/share/vm/c1x/c1x_VMEntries.cpp Mon Jan 10 16:59:48 2011 +0100 @@ -119,6 +119,28 @@ return cimethod->has_balanced_monitors(); } +// public boolean RiMethod_uniqueConcreteMethod(long vmId); +JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1uniqueConcreteMethod(JNIEnv *, jobject, jlong vmId) { + Thread* THREAD = Thread::current(); + ciMethod* cimethod; + { + VM_ENTRY_MARK; + cimethod = (ciMethod*)CURRENT_ENV->get_object(VmIds::get(vmId)); + } + + + klassOop klass = (klassOop)cimethod->holder()->get_oop(); + methodOop method = (methodOop)cimethod->get_oop(); + methodOop unique_concrete = Dependencies::find_unique_concrete_method(klass, method); + if (unique_concrete == NULL) { + return NULL; + } + + Handle name = VmIds::toString(unique_concrete->name(), CHECK_NULL); + oop method_resolved = VMExits::createRiMethodResolved(VmIds::add(unique_concrete), name, CHECK_NULL); + return JNIHandles::make_local(THREAD, method_resolved); +} + // public RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass); JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *env, jobject, jstring jname, jobject accessingClass) { VM_ENTRY_MARK; @@ -592,6 +614,7 @@ {CC"RiMethod_accessFlags", CC"("PROXY")I", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags)}, {CC"RiMethod_exceptionHandlers", CC"("PROXY")"EXCEPTION_HANDLERS, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1exceptionHandlers)}, {CC"RiMethod_hasBalancedMonitors", CC"("PROXY")Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1hasBalancedMonitors)}, + {CC"RiMethod_uniqueConcreteMethod", CC"("PROXY")"METHOD, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1uniqueConcreteMethod)}, {CC"RiSignature_lookupType", CC"("STRING RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)}, {CC"RiConstantPool_lookupConstant", CC"("PROXY"I)"OBJECT, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)}, {CC"RiConstantPool_lookupMethod", CC"("PROXY"IB)"METHOD, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)},