src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java Thu Nov 15 21:05:47 2018 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java Thu Nov 15 09:04:07 2018 -0800
@@ -81,25 +81,31 @@
private StackSlot rbpSpillSlot;
public AMD64FrameMap(CodeCacheProvider codeCache, RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory) {
+ this(codeCache, registerConfig, referenceMapFactory, false);
+ }
+
+ public AMD64FrameMap(CodeCacheProvider codeCache, RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory, boolean useBasePointer) {
super(codeCache, registerConfig, referenceMapFactory);
// (negative) offset relative to sp + total frame size
- initialSpillSize = returnAddressSize();
+ initialSpillSize = returnAddressSize() + (useBasePointer ? getTarget().arch.getWordSize() : 0);
spillSize = initialSpillSize;
}
@Override
public int totalFrameSize() {
- return frameSize() + returnAddressSize();
+ int result = frameSize() + initialSpillSize;
+ assert result % getTarget().stackAlignment == 0 : "Total frame size not aligned: " + result;
+ return result;
}
@Override
public int currentFrameSize() {
- return alignFrameSize(outgoingSize + spillSize - returnAddressSize());
+ return alignFrameSize(outgoingSize + spillSize - initialSpillSize);
}
@Override
protected int alignFrameSize(int size) {
- return NumUtil.roundUp(size + returnAddressSize(), getTarget().stackAlignment) - returnAddressSize();
+ return NumUtil.roundUp(size + initialSpillSize, getTarget().stackAlignment) - initialSpillSize;
}
@Override