# HG changeset patch # User Doug Simon # Date 1349121622 -7200 # Node ID 7548c1248bb33dba694c6143a8b5e9b7842b972d # Parent b4fe028b6dc8185f34104c584ccdcc8c872bc15a pushed CallingConvention further into LIR API for emitting calls diff -r b4fe028b6dc8 -r 7548c1248bb3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- 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 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 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++) { diff -r b4fe028b6dc8 -r 7548c1248bb3 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java --- 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 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)); diff -r b4fe028b6dc8 -r 7548c1248bb3 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java --- 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 diff -r b4fe028b6dc8 -r 7548c1248bb3 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java --- 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()); } diff -r b4fe028b6dc8 -r 7548c1248bb3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- 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);