changeset 59095 | 03fbcd06b4c0 |
parent 58299 | 6df94ce3ab2f |
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; |