# HG changeset patch # User Doug Simon # Date 1386255319 -3600 # Node ID 5d2bc83e9d2225f317ebd48b53a2b3ba1b0db5c4 # Parent 3a8a4042229f784d5a8788a49443a2caca103e26 force long encoding of frame push instruction in a method without a stack bang; removed -G:StackShadowPages option diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Thu Dec 05 15:55:19 2013 +0100 @@ -180,10 +180,14 @@ } private void emitArith(int op1, int op2, Register dst, int imm32) { + emitArith(op1, op2, dst, imm32, false); + } + + private void emitArith(int op1, int op2, Register dst, int imm32, boolean force32Imm) { assert isUByte(op1) && isUByte(op2) : "wrong opcode"; assert (op1 & 0x01) == 1 : "should be 32bit operation"; assert (op1 & 0x02) == 0 : "sign-extension bit should not be set"; - if (isByte(imm32)) { + if (isByte(imm32) && !force32Imm) { emitByte(op1 | 0x02); // set sign bit emitByte(op2 | encode(dst)); emitByte(imm32 & 0xFF); @@ -2272,8 +2276,12 @@ } public final void subq(Register dst, int imm32) { + subq(dst, imm32, false); + } + + public final void subq(Register dst, int imm32, boolean force32Imm) { prefixqAndEncode(dst.encoding); - emitArith(0x81, 0xE8, dst, imm32); + emitArith(0x81, 0xE8, dst, imm32, force32Imm); } public final void subq(Register dst, AMD64Address src) { diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Thu Dec 05 15:55:19 2013 +0100 @@ -83,8 +83,8 @@ * @param isVerifiedEntryPoint specifies if the code buffer is currently at the verified entry * point */ - protected static void emitStackOverflowCheck(CompilationResultBuilder crb, boolean afterFrameInit, boolean isVerifiedEntryPoint) { - if (StackShadowPages.getValue() > 0) { + protected static void emitStackOverflowCheck(CompilationResultBuilder crb, int stackShadowPages, boolean afterFrameInit, boolean isVerifiedEntryPoint) { + if (stackShadowPages > 0) { AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm; int frameSize = crb.frameMap.frameSize(); @@ -92,7 +92,7 @@ int lastFramePage = frameSize / unsafe.pageSize(); // emit multiple stack bangs for methods with frames larger than a page for (int i = 0; i <= lastFramePage; i++) { - int disp = (i + StackShadowPages.getValue()) * unsafe.pageSize(); + int disp = (i + stackShadowPages) * unsafe.pageSize(); if (afterFrameInit) { disp -= frameSize; } @@ -141,12 +141,12 @@ } } else { int verifiedEntryPointOffset = asm.codeBuffer.position(); - if (!isStub) { - emitStackOverflowCheck(crb, false, true); + if (!isStub && stackShadowPages > 0) { + emitStackOverflowCheck(crb, stackShadowPages, false, true); assert asm.codeBuffer.position() - verifiedEntryPointOffset >= PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE; } if (!isStub && asm.codeBuffer.position() == verifiedEntryPointOffset) { - asm.subq(rsp, frameSize); + asm.subq(rsp, frameSize, true); assert asm.codeBuffer.position() - verifiedEntryPointOffset >= PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE; } else { asm.decrementq(rsp, frameSize); diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Thu Dec 05 15:55:19 2013 +0100 @@ -81,15 +81,15 @@ * @param afterFrameInit specifies if the stack pointer has already been adjusted to allocate * the current frame */ - protected static void emitStackOverflowCheck(CompilationResultBuilder crb, boolean afterFrameInit) { - if (StackShadowPages.getValue() > 0) { + protected static void emitStackOverflowCheck(CompilationResultBuilder crb, int stackShadowPages, boolean afterFrameInit) { + if (stackShadowPages > 0) { SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm; final int frameSize = crb.frameMap.totalFrameSize(); if (frameSize > 0) { int lastFramePage = frameSize / unsafe.pageSize(); // emit multiple stack bangs for methods with frames larger than a page for (int i = 0; i <= lastFramePage; i++) { - int disp = (i + StackShadowPages.getValue()) * unsafe.pageSize(); + int disp = (i + stackShadowPages) * unsafe.pageSize(); if (afterFrameInit) { disp -= frameSize; } @@ -124,8 +124,8 @@ final int frameSize = crb.frameMap.totalFrameSize(); SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm; - if (!isStub) { - emitStackOverflowCheck(crb, false); + if (!isStub && stackShadowPages > 0) { + emitStackOverflowCheck(crb, stackShadowPages, false); } new Save(sp, -frameSize, sp).emit(masm); diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Thu Dec 05 15:55:19 2013 +0100 @@ -235,7 +235,6 @@ registerBackend(factory.createBackend(this, hostBackend)); } - GraalOptions.StackShadowPages.setValue(config.stackShadowPages); if (GraalOptions.CacheGraphs.getValue()) { cache = new HotSpotGraphCache(compilerToVm); } diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotHostBackend.java Thu Dec 05 15:55:19 2013 +0100 @@ -37,8 +37,14 @@ */ public abstract class HotSpotHostBackend extends HotSpotBackend { + /** + * This will be 0 if stack banging is disabled. + */ + protected final int stackShadowPages; + public HotSpotHostBackend(HotSpotGraalRuntime runtime, HotSpotProviders providers) { super(runtime, providers); + this.stackShadowPages = runtime.getConfig().useStackBanging ? runtime.getConfig().stackShadowPages : 0; } @Override diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Thu Dec 05 15:55:19 2013 +0100 @@ -705,6 +705,7 @@ // offsets, ... @HotSpotVMFlag(name = "StackShadowPages") @Stable public int stackShadowPages; + @HotSpotVMFlag(name = "UseStackBanging") @Stable public boolean useStackBanging; @HotSpotVMField(name = "oopDesc::_mark", type = "markOop", get = HotSpotVMField.Type.OFFSET) @Stable public int markOffset; @HotSpotVMField(name = "oopDesc::_metadata._klass", type = "Klass*", get = HotSpotVMField.Type.OFFSET) @Stable public int hubOffset; @@ -1184,8 +1185,6 @@ } assert codeEntryAlignment > 0 : codeEntryAlignment; - assert stackShadowPages > 0 : stackShadowPages; - assert (layoutHelperArrayTagObjectValue & layoutHelperArrayTagTypeValue & arrayKlassLayoutHelperIdentifier) != 0 : "object array and type array must have first bit set"; return true; diff -r 3a8a4042229f -r 5d2bc83e9d22 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Dec 05 12:08:27 2013 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Dec 05 15:55:19 2013 +0100 @@ -244,9 +244,6 @@ // Runtime settings @Option(help = "") - public static final OptionValue StackShadowPages = new OptionValue<>(2); - - @Option(help = "") public static final OptionValue SupportJsrBytecodes = new OptionValue<>(true); @Option(help = "")