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
24
25 package org.graalvm.compiler.hotspot.stubs;
26
27 import static java.util.Collections.singletonList;
28 import static org.graalvm.compiler.core.GraalCompiler.emitBackEnd;
29 import static org.graalvm.compiler.core.GraalCompiler.emitFrontEnd;
30 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
31 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
32 import static org.graalvm.compiler.debug.DebugOptions.DebugStubsAndSnippets;
33 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.UNCOMMON_TRAP_HANDLER;
34 import static org.graalvm.util.CollectionsUtil.allMatch;
35
36 import java.util.ListIterator;
37 import java.util.concurrent.atomic.AtomicInteger;
38
39 import jdk.vm.ci.code.CodeCacheProvider;
40 import jdk.vm.ci.code.InstalledCode;
41 import jdk.vm.ci.code.Register;
42 import jdk.vm.ci.code.RegisterConfig;
43 import jdk.vm.ci.code.site.Call;
44 import jdk.vm.ci.code.site.ConstantReference;
45 import jdk.vm.ci.code.site.DataPatch;
46 import jdk.vm.ci.code.site.Infopoint;
47 import jdk.vm.ci.hotspot.HotSpotCompiledCode;
48 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
49 import jdk.vm.ci.meta.DefaultProfilingInfo;
50 import jdk.vm.ci.meta.ResolvedJavaMethod;
51 import jdk.vm.ci.meta.TriState;
52
53 import jdk.internal.vm.compiler.collections.EconomicSet;
54 import org.graalvm.compiler.code.CompilationResult;
55 import org.graalvm.compiler.core.common.CompilationIdentifier;
56 import org.graalvm.compiler.core.common.GraalOptions;
57 import org.graalvm.compiler.core.target.Backend;
58 import org.graalvm.compiler.debug.DebugContext;
59 import org.graalvm.compiler.debug.DebugContext.Description;
60 import org.graalvm.compiler.hotspot.HotSpotCompiledCodeBuilder;
61 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
62 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
63 import org.graalvm.compiler.hotspot.nodes.StubStartNode;
64 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
65 import org.graalvm.compiler.lir.phases.LIRPhase;
66 import org.graalvm.compiler.lir.phases.LIRSuites;
67 import org.graalvm.compiler.lir.phases.PostAllocationOptimizationPhase.PostAllocationOptimizationContext;
68 import org.graalvm.compiler.lir.profiling.MoveProfilingPhase;
69 import org.graalvm.compiler.nodes.StructuredGraph;
70 import org.graalvm.compiler.options.OptionValues;
71 import org.graalvm.compiler.phases.OptimisticOptimizations;
72 import org.graalvm.compiler.phases.PhaseSuite;
73 import org.graalvm.compiler.phases.tiers.Suites;
74 import org.graalvm.compiler.printer.GraalDebugHandlersFactory;
75
76 //JaCoCo Exclude
77
78 /**
79 * Base class for implementing some low level code providing the out-of-line slow path for a snippet
80 * and/or a callee saved call to a HotSpot C/C++ runtime function or even a another compiled Java
81 * method.
82 */
83 public abstract class Stub {
84
85 /**
86 * The linkage information for a call to this stub from compiled code.
87 */
88 protected final HotSpotForeignCallLinkage linkage;
89
90 /**
91 * The code installed for the stub.
92 */
93 protected InstalledCode code;
94
95 /**
185 return DebugContext.create(options, description, outer.getGlobalMetrics(), DEFAULT_LOG_STREAM, singletonList(new GraalDebugHandlersFactory(providers.getSnippetReflection())));
186 }
187 return DebugContext.DISABLED;
188 }
189
190 /**
191 * Gets the code for this stub, compiling it first if necessary.
192 */
193 @SuppressWarnings("try")
194 public synchronized InstalledCode getCode(final Backend backend) {
195 if (code == null) {
196 try (DebugContext debug = openDebugContext(DebugContext.forCurrentThread())) {
197 try (DebugContext.Scope d = debug.scope("CompilingStub", providers.getCodeCache(), debugScopeContext())) {
198 CodeCacheProvider codeCache = providers.getCodeCache();
199 CompilationResult compResult = buildCompilationResult(debug, backend);
200 try (DebugContext.Scope s = debug.scope("CodeInstall", compResult);
201 DebugContext.Activation a = debug.activate()) {
202 assert destroyedCallerRegisters != null;
203 // Add a GeneratePIC check here later, we don't want to install
204 // code if we don't have a corresponding VM global symbol.
205 HotSpotCompiledCode compiledCode = HotSpotCompiledCodeBuilder.createCompiledCode(codeCache, null, null, compResult);
206 code = codeCache.installCode(null, compiledCode, null, null, false);
207 } catch (Throwable e) {
208 throw debug.handle(e);
209 }
210 } catch (Throwable e) {
211 throw debug.handle(e);
212 }
213 assert code != null : "error installing stub " + this;
214 }
215 }
216
217 return code;
218 }
219
220 @SuppressWarnings("try")
221 private CompilationResult buildCompilationResult(DebugContext debug, final Backend backend) {
222 CompilationIdentifier compilationId = getStubCompilationId();
223 final StructuredGraph graph = getGraph(debug, compilationId);
224 CompilationResult compResult = new CompilationResult(compilationId, toString(), GeneratePIC.getValue(options));
225
|
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
24
25 package org.graalvm.compiler.hotspot.stubs;
26
27 import static java.util.Collections.singletonList;
28 import static org.graalvm.compiler.core.GraalCompiler.emitBackEnd;
29 import static org.graalvm.compiler.core.GraalCompiler.emitFrontEnd;
30 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
31 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
32 import static org.graalvm.compiler.debug.DebugOptions.DebugStubsAndSnippets;
33 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.UNCOMMON_TRAP_HANDLER;
34 import static org.graalvm.util.CollectionsUtil.allMatch;
35
36 import java.util.ListIterator;
37 import java.util.concurrent.atomic.AtomicInteger;
38
39 import jdk.internal.vm.compiler.collections.EconomicSet;
40 import org.graalvm.compiler.code.CompilationResult;
41 import org.graalvm.compiler.core.common.CompilationIdentifier;
42 import org.graalvm.compiler.core.common.GraalOptions;
43 import org.graalvm.compiler.core.target.Backend;
44 import org.graalvm.compiler.debug.DebugContext;
45 import org.graalvm.compiler.debug.DebugContext.Description;
46 import org.graalvm.compiler.hotspot.HotSpotCompiledCodeBuilder;
47 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
48 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
49 import org.graalvm.compiler.hotspot.nodes.StubStartNode;
50 import org.graalvm.compiler.lir.asm.CompilationResultBuilderFactory;
51 import org.graalvm.compiler.lir.phases.LIRPhase;
52 import org.graalvm.compiler.lir.phases.LIRSuites;
53 import org.graalvm.compiler.lir.phases.PostAllocationOptimizationPhase.PostAllocationOptimizationContext;
54 import org.graalvm.compiler.lir.profiling.MoveProfilingPhase;
55 import org.graalvm.compiler.nodes.StructuredGraph;
56 import org.graalvm.compiler.options.OptionValues;
57 import org.graalvm.compiler.phases.OptimisticOptimizations;
58 import org.graalvm.compiler.phases.PhaseSuite;
59 import org.graalvm.compiler.phases.tiers.Suites;
60 import org.graalvm.compiler.printer.GraalDebugHandlersFactory;
61
62 import jdk.vm.ci.code.CodeCacheProvider;
63 import jdk.vm.ci.code.InstalledCode;
64 import jdk.vm.ci.code.Register;
65 import jdk.vm.ci.code.RegisterConfig;
66 import jdk.vm.ci.code.site.Call;
67 import jdk.vm.ci.code.site.ConstantReference;
68 import jdk.vm.ci.code.site.DataPatch;
69 import jdk.vm.ci.code.site.Infopoint;
70 import jdk.vm.ci.hotspot.HotSpotCompiledCode;
71 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
72 import jdk.vm.ci.meta.DefaultProfilingInfo;
73 import jdk.vm.ci.meta.ResolvedJavaMethod;
74 import jdk.vm.ci.meta.TriState;
75
76 //JaCoCo Exclude
77
78 /**
79 * Base class for implementing some low level code providing the out-of-line slow path for a snippet
80 * and/or a callee saved call to a HotSpot C/C++ runtime function or even a another compiled Java
81 * method.
82 */
83 public abstract class Stub {
84
85 /**
86 * The linkage information for a call to this stub from compiled code.
87 */
88 protected final HotSpotForeignCallLinkage linkage;
89
90 /**
91 * The code installed for the stub.
92 */
93 protected InstalledCode code;
94
95 /**
185 return DebugContext.create(options, description, outer.getGlobalMetrics(), DEFAULT_LOG_STREAM, singletonList(new GraalDebugHandlersFactory(providers.getSnippetReflection())));
186 }
187 return DebugContext.DISABLED;
188 }
189
190 /**
191 * Gets the code for this stub, compiling it first if necessary.
192 */
193 @SuppressWarnings("try")
194 public synchronized InstalledCode getCode(final Backend backend) {
195 if (code == null) {
196 try (DebugContext debug = openDebugContext(DebugContext.forCurrentThread())) {
197 try (DebugContext.Scope d = debug.scope("CompilingStub", providers.getCodeCache(), debugScopeContext())) {
198 CodeCacheProvider codeCache = providers.getCodeCache();
199 CompilationResult compResult = buildCompilationResult(debug, backend);
200 try (DebugContext.Scope s = debug.scope("CodeInstall", compResult);
201 DebugContext.Activation a = debug.activate()) {
202 assert destroyedCallerRegisters != null;
203 // Add a GeneratePIC check here later, we don't want to install
204 // code if we don't have a corresponding VM global symbol.
205 HotSpotCompiledCode compiledCode = HotSpotCompiledCodeBuilder.createCompiledCode(codeCache, null, null, compResult, options);
206 code = codeCache.installCode(null, compiledCode, null, null, false);
207 } catch (Throwable e) {
208 throw debug.handle(e);
209 }
210 } catch (Throwable e) {
211 throw debug.handle(e);
212 }
213 assert code != null : "error installing stub " + this;
214 }
215 }
216
217 return code;
218 }
219
220 @SuppressWarnings("try")
221 private CompilationResult buildCompilationResult(DebugContext debug, final Backend backend) {
222 CompilationIdentifier compilationId = getStubCompilationId();
223 final StructuredGraph graph = getGraph(debug, compilationId);
224 CompilationResult compResult = new CompilationResult(compilationId, toString(), GeneratePIC.getValue(options));
225
|