diff -r 5d4c3724e4c7 -r 03fbcd06b4c0 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java Thu Nov 14 11:16:14 2019 -0800 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java Thu Nov 14 12:21:00 2019 -0800 @@ -26,6 +26,7 @@ import static jdk.vm.ci.amd64.AMD64.r10; import static jdk.vm.ci.amd64.AMD64.rax; +import static jdk.vm.ci.amd64.AMD64.rbp; import static jdk.vm.ci.amd64.AMD64.rsp; import static jdk.vm.ci.code.ValueUtil.asRegister; import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame; @@ -93,7 +94,7 @@ @Override protected FrameMapBuilder newFrameMapBuilder(RegisterConfig registerConfig) { RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig; - FrameMap frameMap = new AMD64FrameMap(getCodeCache(), registerConfigNonNull, this); + FrameMap frameMap = new AMD64FrameMap(getCodeCache(), registerConfigNonNull, this, config.preserveFramePointer); return new AMD64FrameMapBuilder(frameMap, getCodeCache(), registerConfigNonNull); } @@ -130,10 +131,12 @@ final boolean isStub; final boolean omitFrame; + final boolean useStandardFrameProlog; - HotSpotFrameContext(boolean isStub, boolean omitFrame) { + HotSpotFrameContext(boolean isStub, boolean omitFrame, boolean useStandardFrameProlog) { this.isStub = isStub; this.omitFrame = omitFrame; + this.useStandardFrameProlog = useStandardFrameProlog; } @Override @@ -157,6 +160,11 @@ // assert asm.position() - verifiedEntryPointOffset >= // PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE; } + if (useStandardFrameProlog) { + // Stack-walking friendly instructions + asm.push(rbp); + asm.movq(rbp, rsp); + } if (!isStub && asm.position() == verifiedEntryPointOffset) { asm.subqWide(rsp, frameSize); assert asm.position() - verifiedEntryPointOffset >= PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE; @@ -180,7 +188,12 @@ assert crb.frameMap.getRegisterConfig().getCalleeSaveRegisters() == null; int frameSize = crb.frameMap.frameSize(); - asm.incrementq(rsp, frameSize); + if (useStandardFrameProlog) { + asm.movq(rsp, rbp); + asm.pop(rbp); + } else { + asm.incrementq(rsp, frameSize); + } } } } @@ -202,7 +215,7 @@ Stub stub = gen.getStub(); Assembler masm = new AMD64MacroAssembler(getTarget()); - HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame); + HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame, config.preserveFramePointer); DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget()); CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult, Register.None); crb.setTotalFrameSize(frameMap.totalFrameSize()); @@ -330,7 +343,7 @@ @Override public RegisterAllocationConfig newRegisterAllocationConfig(RegisterConfig registerConfig, String[] allocationRestrictedTo) { RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig; - return new AMD64HotSpotRegisterAllocationConfig(registerConfigNonNull, allocationRestrictedTo); + return new AMD64HotSpotRegisterAllocationConfig(registerConfigNonNull, allocationRestrictedTo, config.preserveFramePointer); } @Override