src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java
changeset 59095 03fbcd06b4c0
parent 58299 6df94ce3ab2f
equal deleted inserted replaced
59094:5d4c3724e4c7 59095:03fbcd06b4c0
    24 
    24 
    25 package org.graalvm.compiler.hotspot.amd64;
    25 package org.graalvm.compiler.hotspot.amd64;
    26 
    26 
    27 import static jdk.vm.ci.amd64.AMD64.r10;
    27 import static jdk.vm.ci.amd64.AMD64.r10;
    28 import static jdk.vm.ci.amd64.AMD64.rax;
    28 import static jdk.vm.ci.amd64.AMD64.rax;
       
    29 import static jdk.vm.ci.amd64.AMD64.rbp;
    29 import static jdk.vm.ci.amd64.AMD64.rsp;
    30 import static jdk.vm.ci.amd64.AMD64.rsp;
    30 import static jdk.vm.ci.code.ValueUtil.asRegister;
    31 import static jdk.vm.ci.code.ValueUtil.asRegister;
    31 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
    32 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
    32 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
    33 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
    33 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
    34 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
    91     }
    92     }
    92 
    93 
    93     @Override
    94     @Override
    94     protected FrameMapBuilder newFrameMapBuilder(RegisterConfig registerConfig) {
    95     protected FrameMapBuilder newFrameMapBuilder(RegisterConfig registerConfig) {
    95         RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig;
    96         RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig;
    96         FrameMap frameMap = new AMD64FrameMap(getCodeCache(), registerConfigNonNull, this);
    97         FrameMap frameMap = new AMD64FrameMap(getCodeCache(), registerConfigNonNull, this, config.preserveFramePointer);
    97         return new AMD64FrameMapBuilder(frameMap, getCodeCache(), registerConfigNonNull);
    98         return new AMD64FrameMapBuilder(frameMap, getCodeCache(), registerConfigNonNull);
    98     }
    99     }
    99 
   100 
   100     @Override
   101     @Override
   101     public LIRGeneratorTool newLIRGenerator(LIRGenerationResult lirGenRes) {
   102     public LIRGeneratorTool newLIRGenerator(LIRGenerationResult lirGenRes) {
   128      */
   129      */
   129     class HotSpotFrameContext implements FrameContext {
   130     class HotSpotFrameContext implements FrameContext {
   130 
   131 
   131         final boolean isStub;
   132         final boolean isStub;
   132         final boolean omitFrame;
   133         final boolean omitFrame;
   133 
   134         final boolean useStandardFrameProlog;
   134         HotSpotFrameContext(boolean isStub, boolean omitFrame) {
   135 
       
   136         HotSpotFrameContext(boolean isStub, boolean omitFrame, boolean useStandardFrameProlog) {
   135             this.isStub = isStub;
   137             this.isStub = isStub;
   136             this.omitFrame = omitFrame;
   138             this.omitFrame = omitFrame;
       
   139             this.useStandardFrameProlog = useStandardFrameProlog;
   137         }
   140         }
   138 
   141 
   139         @Override
   142         @Override
   140         public boolean hasFrame() {
   143         public boolean hasFrame() {
   141             return !omitFrame;
   144             return !omitFrame;
   155                 if (!isStub) {
   158                 if (!isStub) {
   156                     emitStackOverflowCheck(crb);
   159                     emitStackOverflowCheck(crb);
   157                     // assert asm.position() - verifiedEntryPointOffset >=
   160                     // assert asm.position() - verifiedEntryPointOffset >=
   158                     // PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
   161                     // PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
   159                 }
   162                 }
       
   163                 if (useStandardFrameProlog) {
       
   164                     // Stack-walking friendly instructions
       
   165                     asm.push(rbp);
       
   166                     asm.movq(rbp, rsp);
       
   167                 }
   160                 if (!isStub && asm.position() == verifiedEntryPointOffset) {
   168                 if (!isStub && asm.position() == verifiedEntryPointOffset) {
   161                     asm.subqWide(rsp, frameSize);
   169                     asm.subqWide(rsp, frameSize);
   162                     assert asm.position() - verifiedEntryPointOffset >= PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
   170                     assert asm.position() - verifiedEntryPointOffset >= PATCHED_VERIFIED_ENTRY_POINT_INSTRUCTION_SIZE;
   163                 } else {
   171                 } else {
   164                     asm.decrementq(rsp, frameSize);
   172                     asm.decrementq(rsp, frameSize);
   178             if (!omitFrame) {
   186             if (!omitFrame) {
   179                 AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
   187                 AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
   180                 assert crb.frameMap.getRegisterConfig().getCalleeSaveRegisters() == null;
   188                 assert crb.frameMap.getRegisterConfig().getCalleeSaveRegisters() == null;
   181 
   189 
   182                 int frameSize = crb.frameMap.frameSize();
   190                 int frameSize = crb.frameMap.frameSize();
   183                 asm.incrementq(rsp, frameSize);
   191                 if (useStandardFrameProlog) {
       
   192                     asm.movq(rsp, rbp);
       
   193                     asm.pop(rbp);
       
   194                 } else {
       
   195                     asm.incrementq(rsp, frameSize);
       
   196                 }
   184             }
   197             }
   185         }
   198         }
   186     }
   199     }
   187 
   200 
   188     @Override
   201     @Override
   200         DebugContext debug = lir.getDebug();
   213         DebugContext debug = lir.getDebug();
   201         boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
   214         boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
   202 
   215 
   203         Stub stub = gen.getStub();
   216         Stub stub = gen.getStub();
   204         Assembler masm = new AMD64MacroAssembler(getTarget());
   217         Assembler masm = new AMD64MacroAssembler(getTarget());
   205         HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame);
   218         HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame, config.preserveFramePointer);
   206         DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
   219         DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
   207         CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult, Register.None);
   220         CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult, Register.None);
   208         crb.setTotalFrameSize(frameMap.totalFrameSize());
   221         crb.setTotalFrameSize(frameMap.totalFrameSize());
   209         crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
   222         crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
   210         StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
   223         StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
   328     }
   341     }
   329 
   342 
   330     @Override
   343     @Override
   331     public RegisterAllocationConfig newRegisterAllocationConfig(RegisterConfig registerConfig, String[] allocationRestrictedTo) {
   344     public RegisterAllocationConfig newRegisterAllocationConfig(RegisterConfig registerConfig, String[] allocationRestrictedTo) {
   332         RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig;
   345         RegisterConfig registerConfigNonNull = registerConfig == null ? getCodeCache().getRegisterConfig() : registerConfig;
   333         return new AMD64HotSpotRegisterAllocationConfig(registerConfigNonNull, allocationRestrictedTo);
   346         return new AMD64HotSpotRegisterAllocationConfig(registerConfigNonNull, allocationRestrictedTo, config.preserveFramePointer);
   334     }
   347     }
   335 
   348 
   336     @Override
   349     @Override
   337     public EconomicSet<Register> translateToCallerRegisters(EconomicSet<Register> calleeRegisters) {
   350     public EconomicSet<Register> translateToCallerRegisters(EconomicSet<Register> calleeRegisters) {
   338         return calleeRegisters;
   351         return calleeRegisters;