Mercurial > hg > graal-compiler
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