Mercurial > hg > graal-compiler
changeset 9235:8a339b567533
fixed frame omission on windows
author | Christian Haeubl <haeubl@ssw.jku.at> |
---|---|
date | Mon, 22 Apr 2013 15:35:28 +0200 |
parents | b9cf7d0b598e |
children | ec607ddaa99b |
files | graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/FrameMap.java |
diffstat | 2 files changed, 21 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- 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]; + } }
--- 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<StackSlot> 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) {