# HG changeset patch # User Christian Haeubl # Date 1366637728 -7200 # Node ID 8a339b567533881bf302eba2eb61758cc6cf3d42 # Parent b9cf7d0b598e0b504d67e040b840fe041fe96ecd fixed frame omission on windows diff -r b9cf7d0b598e -r 8a339b567533 graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java --- a/graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java Mon Apr 22 13:29:55 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java Mon Apr 22 15:35:28 2013 +0200 @@ -30,6 +30,7 @@ import org.junit.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.Register.RegisterFlag; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; import com.oracle.graal.asm.amd64.*; @@ -70,8 +71,9 @@ @Override public void generateCode(AMD64Assembler asm) { - asm.addl(rsi, 5); - asm.movl(rax, rsi); + Register arg = getArgumentRegister(0, RegisterFlag.CPU); + asm.addl(arg, 5); + asm.movl(rax, arg); asm.ret(0); } }); @@ -87,8 +89,9 @@ @Override public void generateCode(AMD64Assembler asm) { - asm.addq(rsi, 1); - asm.movq(rax, rsi); + Register arg = getArgumentRegister(0, RegisterFlag.CPU); + asm.addq(arg, 1); + asm.movq(rax, arg); asm.ret(0); } }); @@ -113,4 +116,9 @@ Assert.assertArrayEquals(expectedCode, actualCode); } + + private Register getArgumentRegister(int index, RegisterFlag flag) { + Register[] regs = runtime.lookupRegisterConfig().getCallingConventionRegisters(CallingConvention.Type.JavaCall, flag); + return regs[index]; + } } diff -r b9cf7d0b598e -r 8a339b567533 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 Apr 22 13:29:55 2013 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java Mon Apr 22 15:35:28 2013 +0200 @@ -96,11 +96,16 @@ /** * Size of the area occupied by outgoing overflow arguments. This value is adjusted as calling - * conventions for outgoing calls are retrieved. + * conventions for outgoing calls are retrieved. On some platforms, there is a minimum */ private int outgoingSize; /** + * Determines if this frame has values on the stack for outgoing calls. + */ + private boolean hasOutgoingStackArguments; + + /** * The list of stack areas allocated in this frame that are present in every reference map. */ private final List objectStackBlocks; @@ -157,8 +162,8 @@ * {@link Architecture#getReturnAddressSize() return address slot}. */ public boolean frameNeedsAllocating() { - int unalignedFrameSize = outgoingSize + spillSize - returnAddressSize(); - return unalignedFrameSize != 0; + int unalignedFrameSize = spillSize - returnAddressSize(); + return hasOutgoingStackArguments || unalignedFrameSize != 0; } /** @@ -247,6 +252,7 @@ public void reserveOutgoing(int argsSize) { assert frameSize == -1 : "frame size must not yet be fixed"; outgoingSize = Math.max(outgoingSize, argsSize); + hasOutgoingStackArguments = hasOutgoingStackArguments || argsSize > 0; } private StackSlot getSlot(Kind kind, int additionalOffset) {