changeset 9819:8aea948c522b

added support for the runtime to specify for each foreign call whether deoptimization can occur during the call
author Doug Simon <doug.simon@oracle.com>
date Sat, 25 May 2013 23:33:03 +0200
parents 4e9854086532
children 1b60f639ac4b
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java
diffstat 3 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java	Fri May 24 22:51:36 2013 -0400
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java	Sat May 25 23:33:03 2013 +0200
@@ -107,4 +107,9 @@
      * Returning any empty array denotes that the call does not kill any memory locations.
      */
     LocationIdentity[] getKilledLocationIdentities(ForeignCallDescriptor descriptor);
+
+    /**
+     * Determines if deoptimization can occur during a given foreign call.
+     */
+    boolean canDeoptimize(ForeignCallDescriptor descriptor);
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Fri May 24 22:51:36 2013 -0400
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Sat May 25 23:33:03 2013 +0200
@@ -213,7 +213,7 @@
     protected HotSpotForeignCallLinkage registerForeignCall(ForeignCallDescriptor descriptor, long address, CallingConvention.Type ccType, RegisterEffect effect, Transition transition,
                     boolean reexecutable, LocationIdentity... killedLocations) {
         Class<?> resultType = descriptor.getResultType();
-        assert resultType.isPrimitive() || Word.class.isAssignableFrom(resultType) : "foreign calls must return objects in thread local storage: " + descriptor;
+        assert transition == LEAF || resultType.isPrimitive() || Word.class.isAssignableFrom(resultType) : "non-leaf foreign calls must return objects in thread local storage: " + descriptor;
         return register(HotSpotForeignCallLinkage.create(descriptor, address, effect, ccType, transition, reexecutable, killedLocations));
     }
 
@@ -996,6 +996,10 @@
         return foreignCalls.get(descriptor).isReexecutable();
     }
 
+    public boolean canDeoptimize(ForeignCallDescriptor descriptor) {
+        return !foreignCalls.get(descriptor).isLeaf();
+    }
+
     public LocationIdentity[] getKilledLocationIdentities(ForeignCallDescriptor descriptor) {
         return foreignCalls.get(descriptor).getKilledLocations();
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Fri May 24 22:51:36 2013 -0400
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java	Sat May 25 23:33:03 2013 +0200
@@ -121,7 +121,7 @@
 
     @Override
     public boolean canDeoptimize() {
-        return true;
+        return runtime.canDeoptimize(descriptor);
     }
 
     @Override