5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.graalvm.compiler.hotspot.amd64;
24
25 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
26 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
27 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
28 import static jdk.vm.ci.amd64.AMD64.r10;
29 import static jdk.vm.ci.amd64.AMD64.rax;
30 import static jdk.vm.ci.amd64.AMD64.rsp;
31 import static jdk.vm.ci.code.ValueUtil.asRegister;
32
33 import org.graalvm.compiler.asm.Assembler;
34 import org.graalvm.compiler.asm.Label;
35 import org.graalvm.compiler.asm.amd64.AMD64Address;
36 import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
37 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
38 import org.graalvm.compiler.code.CompilationResult;
39 import org.graalvm.compiler.core.amd64.AMD64NodeMatchRules;
40 import org.graalvm.compiler.core.common.LIRKind;
41 import org.graalvm.compiler.core.common.CompilationIdentifier;
42 import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
43 import org.graalvm.compiler.core.target.Backend;
44 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
45 import org.graalvm.compiler.hotspot.HotSpotDataBuilder;
46 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
47 import org.graalvm.compiler.hotspot.HotSpotHostBackend;
48 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
49 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
50 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
51 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
52 import org.graalvm.compiler.hotspot.stubs.Stub;
53 import org.graalvm.compiler.lir.LIR;
54 import org.graalvm.compiler.lir.amd64.AMD64Call;
55 import org.graalvm.compiler.lir.amd64.AMD64FrameMap;
56 import org.graalvm.compiler.lir.amd64.AMD64FrameMapBuilder;
57 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
58 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
59 import org.graalvm.compiler.lir.asm.DataBuilder;
60 import org.graalvm.compiler.lir.asm.FrameContext;
61 import org.graalvm.compiler.lir.framemap.FrameMap;
62 import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
63 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
192 }
193 }
194
195 @Override
196 protected Assembler createAssembler(FrameMap frameMap) {
197 return new AMD64MacroAssembler(getTarget());
198 }
199
200 @Override
201 public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRen, FrameMap frameMap, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
202 // Omit the frame if the method:
203 // - has no spill slots or other slots allocated during register allocation
204 // - has no callee-saved registers
205 // - has no incoming arguments passed on the stack
206 // - has no deoptimization points
207 // - makes no foreign calls (which require an aligned stack)
208 HotSpotLIRGenerationResult gen = (HotSpotLIRGenerationResult) lirGenRen;
209 LIR lir = gen.getLIR();
210 assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame";
211 OptionValues options = lir.getOptions();
212 boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
213
214 Stub stub = gen.getStub();
215 Assembler masm = createAssembler(frameMap);
216 HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame);
217 DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
218 CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, compilationResult);
219 crb.setTotalFrameSize(frameMap.totalFrameSize());
220 crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
221 StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
222 if (deoptimizationRescueSlot != null && stub == null) {
223 crb.compilationResult.setCustomStackAreaOffset(deoptimizationRescueSlot);
224 }
225
226 if (stub != null) {
227 EconomicSet<Register> destroyedCallerRegisters = gatherDestroyedCallerRegisters(lir);
228 updateStub(stub, destroyedCallerRegisters, gen.getCalleeSaveInfo(), frameMap);
229 }
230
231 return crb;
232 }
233
234 @Override
235 public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner) {
236 AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
237 FrameMap frameMap = crb.frameMap;
238 RegisterConfig regConfig = frameMap.getRegisterConfig();
|
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.graalvm.compiler.hotspot.amd64;
24
25 import static jdk.vm.ci.amd64.AMD64.r10;
26 import static jdk.vm.ci.amd64.AMD64.rax;
27 import static jdk.vm.ci.amd64.AMD64.rsp;
28 import static jdk.vm.ci.code.ValueUtil.asRegister;
29 import static org.graalvm.compiler.core.common.GraalOptions.CanOmitFrame;
30 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
31 import static org.graalvm.compiler.core.common.GraalOptions.ZapStackOnMethodEntry;
32
33 import org.graalvm.compiler.asm.Assembler;
34 import org.graalvm.compiler.asm.Label;
35 import org.graalvm.compiler.asm.amd64.AMD64Address;
36 import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
37 import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
38 import org.graalvm.compiler.code.CompilationResult;
39 import org.graalvm.compiler.core.amd64.AMD64NodeMatchRules;
40 import org.graalvm.compiler.core.common.CompilationIdentifier;
41 import org.graalvm.compiler.core.common.LIRKind;
42 import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig;
43 import org.graalvm.compiler.core.target.Backend;
44 import org.graalvm.compiler.debug.DebugContext;
45 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
46 import org.graalvm.compiler.hotspot.HotSpotDataBuilder;
47 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
48 import org.graalvm.compiler.hotspot.HotSpotHostBackend;
49 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
50 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
51 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
52 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
53 import org.graalvm.compiler.hotspot.stubs.Stub;
54 import org.graalvm.compiler.lir.LIR;
55 import org.graalvm.compiler.lir.amd64.AMD64Call;
56 import org.graalvm.compiler.lir.amd64.AMD64FrameMap;
57 import org.graalvm.compiler.lir.amd64.AMD64FrameMapBuilder;
58 import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
59 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
60 import org.graalvm.compiler.lir.asm.DataBuilder;
61 import org.graalvm.compiler.lir.asm.FrameContext;
62 import org.graalvm.compiler.lir.framemap.FrameMap;
63 import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
64 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
193 }
194 }
195
196 @Override
197 protected Assembler createAssembler(FrameMap frameMap) {
198 return new AMD64MacroAssembler(getTarget());
199 }
200
201 @Override
202 public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRen, FrameMap frameMap, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
203 // Omit the frame if the method:
204 // - has no spill slots or other slots allocated during register allocation
205 // - has no callee-saved registers
206 // - has no incoming arguments passed on the stack
207 // - has no deoptimization points
208 // - makes no foreign calls (which require an aligned stack)
209 HotSpotLIRGenerationResult gen = (HotSpotLIRGenerationResult) lirGenRen;
210 LIR lir = gen.getLIR();
211 assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame";
212 OptionValues options = lir.getOptions();
213 DebugContext debug = lir.getDebug();
214 boolean omitFrame = CanOmitFrame.getValue(options) && !frameMap.frameNeedsAllocating() && !lir.hasArgInCallerFrame() && !gen.hasForeignCall();
215
216 Stub stub = gen.getStub();
217 Assembler masm = createAssembler(frameMap);
218 HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null, omitFrame);
219 DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
220 CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult);
221 crb.setTotalFrameSize(frameMap.totalFrameSize());
222 crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
223 StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
224 if (deoptimizationRescueSlot != null && stub == null) {
225 crb.compilationResult.setCustomStackAreaOffset(deoptimizationRescueSlot);
226 }
227
228 if (stub != null) {
229 EconomicSet<Register> destroyedCallerRegisters = gatherDestroyedCallerRegisters(lir);
230 updateStub(stub, destroyedCallerRegisters, gen.getCalleeSaveInfo(), frameMap);
231 }
232
233 return crb;
234 }
235
236 @Override
237 public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner) {
238 AMD64MacroAssembler asm = (AMD64MacroAssembler) crb.asm;
239 FrameMap frameMap = crb.frameMap;
240 RegisterConfig regConfig = frameMap.getRegisterConfig();
|