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) {