32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_LOCATION;
33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;
34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.COMPRESSED_HUB_LOCATION;
35 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.DISPLACED_MARK_WORD_LOCATION;
36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION;
37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION;
38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_LAYOUT_HELPER_LOCATION;
39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION;
40 import static org.graalvm.word.LocationIdentity.any;
41
42 import java.lang.ref.Reference;
43
44 import org.graalvm.compiler.api.directives.GraalDirectives;
45 import org.graalvm.compiler.core.common.GraalOptions;
46 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
47 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
48 import org.graalvm.compiler.core.common.type.ObjectStamp;
49 import org.graalvm.compiler.core.common.type.Stamp;
50 import org.graalvm.compiler.core.common.type.StampFactory;
51 import org.graalvm.compiler.core.common.type.StampPair;
52 import org.graalvm.compiler.debug.GraalError;
53 import org.graalvm.compiler.graph.Node;
54 import org.graalvm.compiler.graph.NodeInputList;
55 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
56 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
57 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
58 import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode;
59 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier;
60 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier;
61 import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier;
62 import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier;
63 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier;
64 import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode;
65 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
66 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
67 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
68 import org.graalvm.compiler.hotspot.nodes.SerialArrayRangeWriteBarrier;
69 import org.graalvm.compiler.hotspot.nodes.SerialWriteBarrier;
70 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
71 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
182 protected MonitorSnippets.Templates monitorSnippets;
183 protected WriteBarrierSnippets.Templates writeBarrierSnippets;
184 protected LoadExceptionObjectSnippets.Templates exceptionObjectSnippets;
185 protected UnsafeLoadSnippets.Templates unsafeLoadSnippets;
186 protected AssertionSnippets.Templates assertionSnippets;
187 protected ArrayCopySnippets.Templates arraycopySnippets;
188 protected StringToBytesSnippets.Templates stringToBytesSnippets;
189 protected HashCodeSnippets.Templates hashCodeSnippets;
190 protected ResolveConstantSnippets.Templates resolveConstantSnippets;
191 protected ProfileSnippets.Templates profileSnippets;
192
193 public DefaultHotSpotLoweringProvider(HotSpotGraalRuntimeProvider runtime, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls, HotSpotRegistersProvider registers,
194 HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
195 super(metaAccess, foreignCalls, target);
196 this.runtime = runtime;
197 this.registers = registers;
198 this.constantReflection = constantReflection;
199 }
200
201 @Override
202 public void initialize(OptionValues options, HotSpotProviders providers, GraalHotSpotVMConfig config) {
203 super.initialize(options, runtime, providers, providers.getSnippetReflection());
204
205 assert target == providers.getCodeCache().getTarget();
206 instanceofSnippets = new InstanceOfSnippets.Templates(options, runtime, providers, target);
207 newObjectSnippets = new NewObjectSnippets.Templates(options, runtime, providers, target, config);
208 monitorSnippets = new MonitorSnippets.Templates(options, runtime, providers, target, config.useFastLocking);
209 writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, runtime, providers, target, config.useCompressedOops ? config.getOopEncoding() : null);
210 exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, providers, target);
211 unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, providers, target);
212 assertionSnippets = new AssertionSnippets.Templates(options, providers, target);
213 arraycopySnippets = new ArrayCopySnippets.Templates(options, runtime, providers, target);
214 stringToBytesSnippets = new StringToBytesSnippets.Templates(options, providers, target);
215 hashCodeSnippets = new HashCodeSnippets.Templates(options, providers, target);
216 if (GeneratePIC.getValue(options)) {
217 resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, providers, target);
218 profileSnippets = new ProfileSnippets.Templates(options, providers, target);
219 }
220 providers.getReplacements().registerSnippetTemplateCache(new UnsafeArrayCopySnippets.Templates(options, providers, target));
221 }
222
223 public MonitorSnippets.Templates getMonitorSnippets() {
224 return monitorSnippets;
225 }
226
227 @Override
228 public void lower(Node n, LoweringTool tool) {
229 StructuredGraph graph = (StructuredGraph) n.graph();
230 if (n instanceof Invoke) {
231 lowerInvoke((Invoke) n, tool, graph);
232 } else if (n instanceof LoadMethodNode) {
233 lowerLoadMethodNode((LoadMethodNode) n);
234 } else if (n instanceof GetClassNode) {
235 lowerGetClassNode((GetClassNode) n, tool, graph);
236 } else if (n instanceof StoreHubNode) {
237 lowerStoreHubNode((StoreHubNode) n, graph);
238 } else if (n instanceof OSRStartNode) {
239 lowerOSRStartNode((OSRStartNode) n);
240 } else if (n instanceof BytecodeExceptionNode) {
|
32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_LOCATION;
33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;
34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.COMPRESSED_HUB_LOCATION;
35 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.DISPLACED_MARK_WORD_LOCATION;
36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION;
37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION;
38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_LAYOUT_HELPER_LOCATION;
39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION;
40 import static org.graalvm.word.LocationIdentity.any;
41
42 import java.lang.ref.Reference;
43
44 import org.graalvm.compiler.api.directives.GraalDirectives;
45 import org.graalvm.compiler.core.common.GraalOptions;
46 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
47 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
48 import org.graalvm.compiler.core.common.type.ObjectStamp;
49 import org.graalvm.compiler.core.common.type.Stamp;
50 import org.graalvm.compiler.core.common.type.StampFactory;
51 import org.graalvm.compiler.core.common.type.StampPair;
52 import org.graalvm.compiler.debug.DebugHandlersFactory;
53 import org.graalvm.compiler.debug.GraalError;
54 import org.graalvm.compiler.graph.Node;
55 import org.graalvm.compiler.graph.NodeInputList;
56 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
57 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
58 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
59 import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode;
60 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier;
61 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier;
62 import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier;
63 import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier;
64 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier;
65 import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode;
66 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
67 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
68 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
69 import org.graalvm.compiler.hotspot.nodes.SerialArrayRangeWriteBarrier;
70 import org.graalvm.compiler.hotspot.nodes.SerialWriteBarrier;
71 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
72 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
183 protected MonitorSnippets.Templates monitorSnippets;
184 protected WriteBarrierSnippets.Templates writeBarrierSnippets;
185 protected LoadExceptionObjectSnippets.Templates exceptionObjectSnippets;
186 protected UnsafeLoadSnippets.Templates unsafeLoadSnippets;
187 protected AssertionSnippets.Templates assertionSnippets;
188 protected ArrayCopySnippets.Templates arraycopySnippets;
189 protected StringToBytesSnippets.Templates stringToBytesSnippets;
190 protected HashCodeSnippets.Templates hashCodeSnippets;
191 protected ResolveConstantSnippets.Templates resolveConstantSnippets;
192 protected ProfileSnippets.Templates profileSnippets;
193
194 public DefaultHotSpotLoweringProvider(HotSpotGraalRuntimeProvider runtime, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls, HotSpotRegistersProvider registers,
195 HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
196 super(metaAccess, foreignCalls, target);
197 this.runtime = runtime;
198 this.registers = registers;
199 this.constantReflection = constantReflection;
200 }
201
202 @Override
203 public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
204 super.initialize(options, factories, runtime, providers, providers.getSnippetReflection());
205
206 assert target == providers.getCodeCache().getTarget();
207 instanceofSnippets = new InstanceOfSnippets.Templates(options, factories, runtime, providers, target);
208 newObjectSnippets = new NewObjectSnippets.Templates(options, factories, runtime, providers, target, config);
209 monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
210 writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config.useCompressedOops ? config.getOopEncoding() : null);
211 exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
212 unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target);
213 assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
214 arraycopySnippets = new ArrayCopySnippets.Templates(options, factories, runtime, providers, target);
215 stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target);
216 hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target);
217 if (GeneratePIC.getValue(options)) {
218 resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target);
219 profileSnippets = new ProfileSnippets.Templates(options, factories, providers, target);
220 }
221 providers.getReplacements().registerSnippetTemplateCache(new UnsafeArrayCopySnippets.Templates(options, factories, providers, target));
222 }
223
224 public MonitorSnippets.Templates getMonitorSnippets() {
225 return monitorSnippets;
226 }
227
228 @Override
229 public void lower(Node n, LoweringTool tool) {
230 StructuredGraph graph = (StructuredGraph) n.graph();
231 if (n instanceof Invoke) {
232 lowerInvoke((Invoke) n, tool, graph);
233 } else if (n instanceof LoadMethodNode) {
234 lowerLoadMethodNode((LoadMethodNode) n);
235 } else if (n instanceof GetClassNode) {
236 lowerGetClassNode((GetClassNode) n, tool, graph);
237 } else if (n instanceof StoreHubNode) {
238 lowerStoreHubNode((StoreHubNode) n, graph);
239 } else if (n instanceof OSRStartNode) {
240 lowerOSRStartNode((OSRStartNode) n);
241 } else if (n instanceof BytecodeExceptionNode) {
|