changeset 6472:7548c1248bb3

pushed CallingConvention further into LIR API for emitting calls
author Doug Simon <doug.simon@oracle.com>
date Mon, 01 Oct 2012 22:00:22 +0200
parents b4fe028b6dc8
children 921005bb0b45
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java
diffstat 5 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Mon Oct 01 21:41:38 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Mon Oct 01 22:00:22 2012 +0200
@@ -696,7 +696,7 @@
         AbstractCallTargetNode callTarget = (AbstractCallTargetNode) x.callTarget();
         Kind[] signature = callTarget.signature();
         CallingConvention cc = frameMap.registerConfig.getCallingConvention(callTarget.callType(), x.node().kind(), signature, target(), false);
-        frameMap.callsMethod(cc, callTarget.callType());
+        frameMap.callsMethod(cc);
 
         List<Value> argList = visitInvokeArguments(cc, callTarget.arguments());
         Value[] parameters = argList.toArray(new Value[argList.size()]);
@@ -762,12 +762,11 @@
     protected abstract LabelRef createDeoptStub(DeoptimizationAction action, DeoptimizationReason reason, LIRFrameState info, Object deoptInfo);
 
     @Override
-    public Variable emitCall(@SuppressWarnings("hiding") Object target, Kind result, Kind[] arguments, boolean canTrap, Value... args) {
+    public Variable emitCall(@SuppressWarnings("hiding") Object target, CallingConvention cc, boolean canTrap, Value... args) {
         LIRFrameState info = canTrap ? state() : null;
 
         // move the arguments into the correct location
-        CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, result, arguments, target(), false);
-        frameMap.callsMethod(cc, RuntimeCall);
+        frameMap.callsMethod(cc);
         assert cc.getArgumentCount() == args.length : "argument count mismatch";
         Value[] argLocations = new Value[args.length];
         for (int i = 0; i < args.length; i++) {
@@ -788,9 +787,15 @@
     }
 
     @Override
+    public Value emitCall(RuntimeCall runtimeCall, boolean canTrap, Value... args) {
+        CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, runtimeCall.getResultKind(), runtimeCall.getArgumentKinds(), target, false);
+        return emitCall(runtimeCall, cc, canTrap, args);
+    }
+
+    @Override
     public void emitRuntimeCall(RuntimeCallNode x) {
         CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, x.kind(), x.call().getArgumentKinds(), target(), false);
-        frameMap.callsMethod(cc, RuntimeCall);
+        frameMap.callsMethod(cc);
         Value resultOperand = cc.getReturn();
         List<Value> argList = visitInvokeArguments(cc, x.arguments());
 
@@ -957,7 +962,7 @@
 
         // move the arguments into the correct location
         CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, runtimeCall.getResultKind(), arguments, target(), false);
-        frameMap.callsMethod(cc, RuntimeCall);
+        frameMap.callsMethod(cc);
         assert cc.getArgumentCount() == args.length : "argument count mismatch";
         Value[] argLocations = new Value[args.length];
         for (int i = 0; i < args.length; i++) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java	Mon Oct 01 21:41:38 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java	Mon Oct 01 22:00:22 2012 +0200
@@ -63,7 +63,7 @@
 
         Kind[] signature = MetaUtil.signatureToKinds(method.signature(), isStatic ? null : method.holder().kind());
         CallingConvention cc = gen.frameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, Kind.Void, signature, gen.target(), false);
-        gen.frameMap().callsMethod(cc, CallingConvention.Type.JavaCall); // TODO (aw): I think this is unnecessary for a tail call.
+        gen.frameMap().callsMethod(cc); // TODO (aw): I think this is unnecessary for a tail call.
         List<ValueNode> parameters = new ArrayList<>();
         for (int i = 0, slot = 0; i < cc.getArgumentCount(); i++, slot += FrameStateBuilder.stackSlots(frameState.localAt(slot).kind())) {
             parameters.add(frameState.localAt(slot));
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java	Mon Oct 01 21:41:38 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java	Mon Oct 01 22:00:22 2012 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import static com.oracle.graal.api.code.CallingConvention.Type.*;
+
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.gen.*;
@@ -60,7 +62,8 @@
             where = "in compiled code for " + MetaUtil.format("%H.%n(%p)", gen.method());
         }
         Kind[] signature = new Kind[] {Kind.Object, Kind.Object, Kind.Long};
-        gen.emitCall(vmErrorStub, Kind.Void, signature, false, Constant.forObject(where), gen.operand(format), gen.operand(value));
+        CallingConvention cc = gen.frameMap().registerConfig.getCallingConvention(RuntimeCall, Kind.Void, signature, gen.target(), false);
+        gen.emitCall(vmErrorStub, cc, false, Constant.forObject(where), gen.operand(format), gen.operand(value));
     }
 
     @NodeIntrinsic
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java	Mon Oct 01 21:41:38 2012 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java	Mon Oct 01 22:00:22 2012 +0200
@@ -27,7 +27,6 @@
 import java.util.*;
 
 import com.oracle.graal.api.code.*;
-import com.oracle.graal.api.code.CallingConvention.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.max.asm.*;
 
@@ -224,11 +223,8 @@
      * Informs the frame map that the compiled code calls a particular method, which
      * may need stack space for outgoing arguments.
      * @param cc The calling convention for the called method.
-     * @param type The type of calling convention.
      */
-    public void callsMethod(CallingConvention cc, Type type) {
-        // TODO look at the actual stack offsets?
-        assert type.out;
+    public void callsMethod(CallingConvention cc) {
         reserveOutgoing(cc.getStackSize());
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java	Mon Oct 01 21:41:38 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java	Mon Oct 01 22:00:22 2012 +0200
@@ -83,10 +83,8 @@
     public abstract void emitMembar(int barriers);
     public abstract void emitDeoptimizeOnOverflow(DeoptimizationAction action, DeoptimizationReason reason, Object deoptInfo);
     public abstract void emitDeoptimize(DeoptimizationAction action, DeoptimizationReason reason, Object deoptInfo, long leafGraphId);
-    public abstract Value emitCall(Object target, Kind result, Kind[] arguments, boolean canTrap, Value... args);
-    public final Value emitCall(RuntimeCall runtimeCall, boolean canTrap, Value... args) {
-        return emitCall(runtimeCall, runtimeCall.getResultKind(), runtimeCall.getArgumentKinds(), canTrap, args);
-    }
+    public abstract Value emitCall(Object target, CallingConvention cc, boolean canTrap, Value... args);
+    public abstract Value emitCall(RuntimeCall runtimeCall, boolean canTrap, Value... args);
 
     public abstract void emitIf(IfNode i);
     public abstract void emitConditional(ConditionalNode i);