changeset 12532:9b1cc2628961

Extend the CompilerToVM interface to explicitly avoid compilation and inlining of methods
author Matthias Grimmer <grimmer@ssw.jku.at>
date Wed, 23 Oct 2013 12:48:06 +0200
parents 7d5c3ffbee64
children e5c23a8f3dd8
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java graal/com.oracle.graal.truffle.hotspot.amd64/src/com/oracle/graal/truffle/hotspot/amd64/AMD64HotSpotTruffleBackend.java src/share/vm/graal/graalCompilerToVM.cpp
diffstat 5 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Oct 23 12:46:58 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Oct 23 12:48:06 2013 +0200
@@ -218,6 +218,8 @@
 
     long readUnsafeKlassPointer(Object o);
 
+    void dontInline(long metaspaceMethod, HotSpotResolvedJavaMethod method);
+
     /**
      * Invalidates the profiling information and restarts profiling upon the next invocation.
      * 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Oct 23 12:46:58 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Oct 23 12:48:06 2013 +0200
@@ -178,6 +178,9 @@
     public native long readUnsafeKlassPointer(Object o);
 
     @Override
+    public native void dontInline(long metaspaceMethod, HotSpotResolvedJavaMethod method);
+
+    @Override
     public Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, HotSpotInstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException {
         return executeCompiledMethodIntrinsic(arg1, arg2, arg3, hotspotInstalledCode);
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java	Wed Oct 23 12:46:58 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java	Wed Oct 23 12:48:06 2013 +0200
@@ -190,6 +190,14 @@
     }
 
     /**
+     * Manually adds a DontInline annotation to this method.
+     */
+    public void setDontInline() {
+        dontInline = true;
+        runtime().getCompilerToVM().dontInline(metaspaceMethod, this);
+    }
+
+    /**
      * Returns true if this method is one of the special methods that is ignored by security stack
      * walks.
      * 
--- a/graal/com.oracle.graal.truffle.hotspot.amd64/src/com/oracle/graal/truffle/hotspot/amd64/AMD64HotSpotTruffleBackend.java	Wed Oct 23 12:46:58 2013 +0200
+++ b/graal/com.oracle.graal.truffle.hotspot.amd64/src/com/oracle/graal/truffle/hotspot/amd64/AMD64HotSpotTruffleBackend.java	Wed Oct 23 12:48:06 2013 +0200
@@ -46,7 +46,7 @@
  */
 class AMD64HotSpotTruffleBackend extends AMD64HotSpotBackend {
 
-    private ResolvedJavaMethod optimizedCallTargetCall;
+    private HotSpotResolvedJavaMethod optimizedCallTargetCall;
 
     public AMD64HotSpotTruffleBackend(HotSpotGraalRuntime runtime, HotSpotProviders providers) {
         super(runtime, providers);
@@ -55,7 +55,9 @@
     private ResolvedJavaMethod getInstrumentedMethod() throws GraalInternalError {
         if (optimizedCallTargetCall == null) {
             try {
-                optimizedCallTargetCall = getProviders().getMetaAccess().lookupJavaMethod(OptimizedCallTarget.class.getDeclaredMethod("call", PackedFrame.class, Arguments.class));
+                optimizedCallTargetCall = (HotSpotResolvedJavaMethod) getProviders().getMetaAccess().lookupJavaMethod(
+                                OptimizedCallTarget.class.getDeclaredMethod("call", PackedFrame.class, Arguments.class));
+                optimizedCallTargetCall.setDontInline();
             } catch (NoSuchMethodException | SecurityException e) {
                 throw new GraalInternalError(e);
             }
@@ -89,7 +91,6 @@
 
             AMD64Address verifiedEntryPointAddress = new AMD64Address(spillRegister, config.nmethodEntryOffset);
             asm.movq(spillRegister, verifiedEntryPointAddress);
-
             asm.jmp(spillRegister);
 
             asm.bind(doProlog);
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Oct 23 12:46:58 2013 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Wed Oct 23 12:48:06 2013 +0200
@@ -642,6 +642,13 @@
   return id;
 }
 
+C2V_VMENTRY(void, dontInline,(JNIEnv *, jobject,  jlong metaspace_method, jobject hotspot_method))
+  methodHandle method = asMethod(metaspace_method);
+  method->set_not_c1_compilable();
+  method->set_not_c2_compilable();
+  method->set_dont_inline(true);
+C2V_END
+
 C2V_ENTRY(void, initializeConfiguration, (JNIEnv *env, jobject, jobject config))
 
 #define set_boolean(name, value) do { env->SetBooleanField(config, getFieldID(env, config, name, "Z"), value); } while (0)
@@ -1196,6 +1203,7 @@
   {CC"getUniqueImplementor",          CC"("HS_RESOLVED_TYPE")"RESOLVED_TYPE,                            FN_PTR(getUniqueImplementor)},
   {CC"getStackTraceElement",          CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT,                     FN_PTR(getStackTraceElement)},
   {CC"initializeMethod",              CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V",                     FN_PTR(initializeMethod)},
+  {CC"dontInline",                    CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V",                     FN_PTR(dontInline)},
   {CC"initializeMethodData",          CC"("METASPACE_METHOD_DATA METHOD_DATA")V",                       FN_PTR(initializeMethodData)},
   {CC"isMethodCompilable",            CC"("METASPACE_METHOD")Z",                                        FN_PTR(isMethodCompilable)},
   {CC"getCompiledCodeSize",           CC"("METASPACE_METHOD")I",                                        FN_PTR(getCompiledCodeSize)},