# HG changeset patch # User Stefan Anzinger # Date 1444748879 -7200 # Node ID 4688478ecb7b6b22c08aaf535a6c65a8fd40ee2e # Parent 3088a32d27afbec059ef4276e8b7d1904523861d Make space in frame for native callee to spill outgoing parameters diff -r 3088a32d27af -r 4688478ecb7b jvmci/jdk.vm.ci.hotspot.sparc/src/jdk/vm/ci/hotspot/sparc/SPARCHotSpotRegisterConfig.java --- a/jvmci/jdk.vm.ci.hotspot.sparc/src/jdk/vm/ci/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Oct 13 00:12:28 2015 +0200 +++ b/jvmci/jdk.vm.ci.hotspot.sparc/src/jdk/vm/ci/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Oct 13 17:07:59 2015 +0200 @@ -138,6 +138,11 @@ private final RegisterAttributes[] attributesMap; + /** + * Does native code (C++ code) spill arguments in registers to the parent frame? + */ + private final boolean addNativeRegisterArgumentSlots; + @Override public Register[] getAllocatableRegisters() { return allocatable.clone(); @@ -239,13 +244,14 @@ } public SPARCHotSpotRegisterConfig(TargetDescription target, HotSpotVMConfig config) { - this(target, initAllocatable(config.useCompressedOops)); + this(target, initAllocatable(config.useCompressedOops), config); } - public SPARCHotSpotRegisterConfig(TargetDescription target, Register[] allocatable) { + public SPARCHotSpotRegisterConfig(TargetDescription target, Register[] allocatable, HotSpotVMConfig config) { this.architecture = target.arch; this.allocatable = allocatable.clone(); attributesMap = RegisterAttributes.createMap(this, SPARC.allRegisters); + this.addNativeRegisterArgumentSlots = config.linuxOs; } @Override @@ -353,9 +359,15 @@ JavaKind returnKind = returnType == null ? JavaKind.Void : returnType.getJavaKind(); AllocatableValue returnLocation = returnKind == JavaKind.Void ? Value.ILLEGAL : getReturnRegister(returnKind, type).asValue(target.getLIRKind(returnKind.getStackKind())); - // Space where callee may spill outgoing parameters o0...o5 - int lowerOutgoingSpace = Math.min(locations.length, 6) * target.wordSize; - return new CallingConvention(currentStackOffset + lowerOutgoingSpace, returnLocation, locations); + + int outArgSpillArea; + if (type == Type.NativeCall && addNativeRegisterArgumentSlots) { + // Space for native callee which may spill our outgoing arguments + outArgSpillArea = Math.min(locations.length, generalParameterRegisters.length) * target.wordSize; + } else { + outArgSpillArea = 0; + } + return new CallingConvention(currentStackOffset + outArgSpillArea, returnLocation, locations); } private static int roundUp(int number, int mod) { diff -r 3088a32d27af -r 4688478ecb7b jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java --- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java Tue Oct 13 00:12:28 2015 +0200 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java Tue Oct 13 17:07:59 2015 +0200 @@ -720,6 +720,7 @@ // os information, register layout, code generation, ... @HotSpotVMValue(expression = "DEBUG_ONLY(1) NOT_DEBUG(0)") @Stable public boolean cAssertions; public final boolean windowsOs = System.getProperty("os.name", "").startsWith("Windows"); + public final boolean linuxOs = System.getProperty("os.name", "").startsWith("Linux"); @HotSpotVMFlag(name = "CodeEntryAlignment") @Stable public int codeEntryAlignment; @HotSpotVMFlag(name = "VerifyOops") @Stable public boolean verifyOops;