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
24
25 package org.graalvm.compiler.hotspot.meta;
26
27 import static org.graalvm.compiler.core.common.GraalOptions.AlwaysInlineVTableStubs;
28 import static org.graalvm.compiler.core.common.GraalOptions.InlineVTableStubs;
29 import static org.graalvm.compiler.core.common.GraalOptions.OmitHotExceptionStacktrace;
30 import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.OSR_MIGRATION_END;
31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_KLASS_LOCATION;
32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;
33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_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 jdk.internal.vm.compiler.word.LocationIdentity.any;
41
42 import java.lang.ref.Reference;
43 import java.util.EnumMap;
44
45 import org.graalvm.compiler.api.directives.GraalDirectives;
46 import org.graalvm.compiler.core.common.CompressEncoding;
47 import org.graalvm.compiler.core.common.GraalOptions;
48 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
49 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
50 import org.graalvm.compiler.core.common.type.ObjectStamp;
51 import org.graalvm.compiler.core.common.type.Stamp;
52 import org.graalvm.compiler.core.common.type.StampFactory;
53 import org.graalvm.compiler.core.common.type.StampPair;
54 import org.graalvm.compiler.debug.DebugCloseable;
55 import org.graalvm.compiler.debug.DebugHandlersFactory;
56 import org.graalvm.compiler.debug.GraalError;
57 import org.graalvm.compiler.graph.Node;
58 import org.graalvm.compiler.graph.NodeInputList;
59 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
60 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
61 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
62 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier;
63 import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier;
64 import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier;
65 import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier;
66 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier;
67 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
68 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
69 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
70 import org.graalvm.compiler.hotspot.nodes.SerialArrayRangeWriteBarrier;
71 import org.graalvm.compiler.hotspot.nodes.SerialWriteBarrier;
72 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
73 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
74 import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicConstantNode;
75 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
76 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
77 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
78 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
79 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
80 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
81 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
82 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
83 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
84 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
85 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
86 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
87 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
88 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
89 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
90 import org.graalvm.compiler.hotspot.replacements.ObjectCloneSnippets;
91 import org.graalvm.compiler.hotspot.replacements.StringToBytesSnippets;
145 import org.graalvm.compiler.nodes.java.NewArrayNode;
146 import org.graalvm.compiler.nodes.java.NewInstanceNode;
147 import org.graalvm.compiler.nodes.java.NewMultiArrayNode;
148 import org.graalvm.compiler.nodes.java.RawMonitorEnterNode;
149 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
150 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
151 import org.graalvm.compiler.nodes.memory.ReadNode;
152 import org.graalvm.compiler.nodes.memory.WriteNode;
153 import org.graalvm.compiler.nodes.memory.address.AddressNode;
154 import org.graalvm.compiler.nodes.spi.LoweringProvider;
155 import org.graalvm.compiler.nodes.spi.LoweringTool;
156 import org.graalvm.compiler.nodes.spi.StampProvider;
157 import org.graalvm.compiler.nodes.type.StampTool;
158 import org.graalvm.compiler.nodes.util.GraphUtil;
159 import org.graalvm.compiler.options.OptionValues;
160 import org.graalvm.compiler.replacements.DefaultJavaLoweringProvider;
161 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode;
162 import org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets;
163 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyWithSlowPathNode;
164 import org.graalvm.compiler.replacements.nodes.AssertionNode;
165 import jdk.internal.vm.compiler.word.LocationIdentity;
166
167 import jdk.vm.ci.code.TargetDescription;
168 import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
169 import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
170 import jdk.vm.ci.hotspot.HotSpotResolvedJavaField;
171 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
172 import jdk.vm.ci.meta.JavaConstant;
173 import jdk.vm.ci.meta.JavaKind;
174 import jdk.vm.ci.meta.JavaType;
175 import jdk.vm.ci.meta.MetaAccessProvider;
176 import jdk.vm.ci.meta.ResolvedJavaField;
177 import jdk.vm.ci.meta.ResolvedJavaType;
178
179 /**
180 * HotSpot implementation of {@link LoweringProvider}.
181 */
182 public class DefaultHotSpotLoweringProvider extends DefaultJavaLoweringProvider implements HotSpotLoweringProvider {
183
184 protected final HotSpotGraalRuntimeProvider runtime;
208 this.registers = registers;
209 this.constantReflection = constantReflection;
210 }
211
212 @Override
213 public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
214 super.initialize(options, factories, runtime, providers, providers.getSnippetReflection());
215
216 assert target == providers.getCodeCache().getTarget();
217 instanceofSnippets = new InstanceOfSnippets.Templates(options, factories, runtime, providers, target);
218 newObjectSnippets = new NewObjectSnippets.Templates(options, factories, runtime, providers, target, config);
219 monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
220 writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config);
221 exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
222 unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target);
223 assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
224 arraycopySnippets = new ArrayCopySnippets.Templates(new HotSpotArraycopySnippets(), options, factories, runtime, providers, providers.getSnippetReflection(), target);
225 stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target);
226 hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target);
227 resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target);
228 profileSnippets = new ProfileSnippets.Templates(options, factories, providers, target);
229 objectCloneSnippets = new ObjectCloneSnippets.Templates(options, factories, providers, target);
230 foreignCallSnippets = new ForeignCallSnippets.Templates(options, factories, providers, target);
231 }
232
233 public MonitorSnippets.Templates getMonitorSnippets() {
234 return monitorSnippets;
235 }
236
237 @Override
238 @SuppressWarnings("try")
239 public void lower(Node n, LoweringTool tool) {
240 StructuredGraph graph = (StructuredGraph) n.graph();
241 try (DebugCloseable context = n.withNodeSourcePosition()) {
242 if (n instanceof Invoke) {
243 lowerInvoke((Invoke) n, tool, graph);
244 } else if (n instanceof LoadMethodNode) {
245 lowerLoadMethodNode((LoadMethodNode) n);
246 } else if (n instanceof GetClassNode) {
247 lowerGetClassNode((GetClassNode) n, tool, graph);
248 } else if (n instanceof StoreHubNode) {
666 return ex;
667 }
668 }
669
670 public static final class RuntimeCalls {
671 public static final EnumMap<BytecodeExceptionKind, ForeignCallDescriptor> runtimeCalls;
672
673 static {
674 runtimeCalls = new EnumMap<>(BytecodeExceptionKind.class);
675 runtimeCalls.put(BytecodeExceptionKind.ARRAY_STORE, new ForeignCallDescriptor("createArrayStoreException", ArrayStoreException.class, Object.class));
676 runtimeCalls.put(BytecodeExceptionKind.CLASS_CAST, new ForeignCallDescriptor("createClassCastException", ClassCastException.class, Object.class, KlassPointer.class));
677 runtimeCalls.put(BytecodeExceptionKind.NULL_POINTER, new ForeignCallDescriptor("createNullPointerException", NullPointerException.class));
678 runtimeCalls.put(BytecodeExceptionKind.OUT_OF_BOUNDS, new ForeignCallDescriptor("createOutOfBoundsException", ArrayIndexOutOfBoundsException.class, int.class, int.class));
679 runtimeCalls.put(BytecodeExceptionKind.DIVISION_BY_ZERO, new ForeignCallDescriptor("createDivisionByZeroException", ArithmeticException.class));
680 runtimeCalls.put(BytecodeExceptionKind.INTEGER_EXACT_OVERFLOW, new ForeignCallDescriptor("createIntegerExactOverflowException", ArithmeticException.class));
681 runtimeCalls.put(BytecodeExceptionKind.LONG_EXACT_OVERFLOW, new ForeignCallDescriptor("createLongExactOverflowException", ArithmeticException.class));
682 }
683 }
684
685 private void throwCachedException(BytecodeExceptionNode node) {
686 Throwable exception = Exceptions.cachedExceptions.get(node.getExceptionKind());
687 assert exception != null;
688
689 StructuredGraph graph = node.graph();
690 FloatingNode exceptionNode = ConstantNode.forConstant(constantReflection.forObject(exception), metaAccess, graph);
691 graph.replaceFixedWithFloating(node, exceptionNode);
692 }
693
694 private void lowerBytecodeExceptionNode(BytecodeExceptionNode node) {
695 if (OmitHotExceptionStacktrace.getValue(node.getOptions())) {
696 throwCachedException(node);
697 return;
698 }
699
700 ForeignCallDescriptor descriptor = RuntimeCalls.runtimeCalls.get(node.getExceptionKind());
701 assert descriptor != null;
702
703 StructuredGraph graph = node.graph();
704 ForeignCallNode foreignCallNode = graph.add(new ForeignCallNode(foreignCalls, descriptor, node.stamp(NodeView.DEFAULT), node.getArguments()));
705 graph.replaceFixedWithFixed(node, foreignCallNode);
|
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
24
25 package org.graalvm.compiler.hotspot.meta;
26
27 import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
28 import static org.graalvm.compiler.core.common.GraalOptions.AlwaysInlineVTableStubs;
29 import static org.graalvm.compiler.core.common.GraalOptions.InlineVTableStubs;
30 import static org.graalvm.compiler.core.common.GraalOptions.OmitHotExceptionStacktrace;
31 import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.OSR_MIGRATION_END;
32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_KLASS_LOCATION;
33 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_HANDLE_LOCATION;
34 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_MIRROR_LOCATION;
35 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.COMPRESSED_HUB_LOCATION;
36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.DISPLACED_MARK_WORD_LOCATION;
37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION;
38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION;
39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_LAYOUT_HELPER_LOCATION;
40 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION;
41 import static jdk.internal.vm.compiler.word.LocationIdentity.any;
42
43 import java.lang.ref.Reference;
44 import java.util.EnumMap;
45
46 import org.graalvm.compiler.api.directives.GraalDirectives;
47 import org.graalvm.compiler.core.common.CompressEncoding;
48 import org.graalvm.compiler.core.common.GraalOptions;
49 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
50 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
51 import org.graalvm.compiler.core.common.type.ObjectStamp;
52 import org.graalvm.compiler.core.common.type.Stamp;
53 import org.graalvm.compiler.core.common.type.StampFactory;
54 import org.graalvm.compiler.core.common.type.StampPair;
55 import org.graalvm.compiler.debug.DebugCloseable;
56 import org.graalvm.compiler.debug.DebugHandlersFactory;
57 import org.graalvm.compiler.debug.GraalError;
58 import org.graalvm.compiler.graph.Node;
59 import org.graalvm.compiler.graph.NodeInputList;
60 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
61 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
62 import org.graalvm.compiler.hotspot.gc.g1.G1ArrayRangePostWriteBarrier;
63 import org.graalvm.compiler.hotspot.gc.g1.G1ArrayRangePreWriteBarrier;
64 import org.graalvm.compiler.hotspot.gc.g1.G1PostWriteBarrier;
65 import org.graalvm.compiler.hotspot.gc.g1.G1PreWriteBarrier;
66 import org.graalvm.compiler.hotspot.gc.g1.G1ReferentFieldReadBarrier;
67 import org.graalvm.compiler.hotspot.gc.shared.SerialArrayRangeWriteBarrier;
68 import org.graalvm.compiler.hotspot.gc.shared.SerialWriteBarrier;
69 import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode;
70 import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode;
71 import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
72 import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
73 import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
74 import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
75 import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicConstantNode;
76 import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
77 import org.graalvm.compiler.hotspot.nodes.profiling.ProfileNode;
78 import org.graalvm.compiler.hotspot.nodes.type.HotSpotNarrowOopStamp;
79 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
80 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
81 import org.graalvm.compiler.hotspot.replacements.AssertionSnippets;
82 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
83 import org.graalvm.compiler.hotspot.replacements.HashCodeSnippets;
84 import org.graalvm.compiler.hotspot.replacements.HubGetClassNode;
85 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
86 import org.graalvm.compiler.hotspot.replacements.InstanceOfSnippets;
87 import org.graalvm.compiler.hotspot.replacements.KlassLayoutHelperNode;
88 import org.graalvm.compiler.hotspot.replacements.LoadExceptionObjectSnippets;
89 import org.graalvm.compiler.hotspot.replacements.MonitorSnippets;
90 import org.graalvm.compiler.hotspot.replacements.NewObjectSnippets;
91 import org.graalvm.compiler.hotspot.replacements.ObjectCloneSnippets;
92 import org.graalvm.compiler.hotspot.replacements.StringToBytesSnippets;
146 import org.graalvm.compiler.nodes.java.NewArrayNode;
147 import org.graalvm.compiler.nodes.java.NewInstanceNode;
148 import org.graalvm.compiler.nodes.java.NewMultiArrayNode;
149 import org.graalvm.compiler.nodes.java.RawMonitorEnterNode;
150 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
151 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
152 import org.graalvm.compiler.nodes.memory.ReadNode;
153 import org.graalvm.compiler.nodes.memory.WriteNode;
154 import org.graalvm.compiler.nodes.memory.address.AddressNode;
155 import org.graalvm.compiler.nodes.spi.LoweringProvider;
156 import org.graalvm.compiler.nodes.spi.LoweringTool;
157 import org.graalvm.compiler.nodes.spi.StampProvider;
158 import org.graalvm.compiler.nodes.type.StampTool;
159 import org.graalvm.compiler.nodes.util.GraphUtil;
160 import org.graalvm.compiler.options.OptionValues;
161 import org.graalvm.compiler.replacements.DefaultJavaLoweringProvider;
162 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode;
163 import org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets;
164 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyWithSlowPathNode;
165 import org.graalvm.compiler.replacements.nodes.AssertionNode;
166 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
167 import jdk.internal.vm.compiler.word.LocationIdentity;
168
169 import jdk.vm.ci.code.TargetDescription;
170 import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
171 import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
172 import jdk.vm.ci.hotspot.HotSpotResolvedJavaField;
173 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
174 import jdk.vm.ci.meta.JavaConstant;
175 import jdk.vm.ci.meta.JavaKind;
176 import jdk.vm.ci.meta.JavaType;
177 import jdk.vm.ci.meta.MetaAccessProvider;
178 import jdk.vm.ci.meta.ResolvedJavaField;
179 import jdk.vm.ci.meta.ResolvedJavaType;
180
181 /**
182 * HotSpot implementation of {@link LoweringProvider}.
183 */
184 public class DefaultHotSpotLoweringProvider extends DefaultJavaLoweringProvider implements HotSpotLoweringProvider {
185
186 protected final HotSpotGraalRuntimeProvider runtime;
210 this.registers = registers;
211 this.constantReflection = constantReflection;
212 }
213
214 @Override
215 public void initialize(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, GraalHotSpotVMConfig config) {
216 super.initialize(options, factories, runtime, providers, providers.getSnippetReflection());
217
218 assert target == providers.getCodeCache().getTarget();
219 instanceofSnippets = new InstanceOfSnippets.Templates(options, factories, runtime, providers, target);
220 newObjectSnippets = new NewObjectSnippets.Templates(options, factories, runtime, providers, target, config);
221 monitorSnippets = new MonitorSnippets.Templates(options, factories, runtime, providers, target, config.useFastLocking);
222 writeBarrierSnippets = new WriteBarrierSnippets.Templates(options, factories, runtime, providers, target, config);
223 exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target);
224 unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target);
225 assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target);
226 arraycopySnippets = new ArrayCopySnippets.Templates(new HotSpotArraycopySnippets(), options, factories, runtime, providers, providers.getSnippetReflection(), target);
227 stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target);
228 hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target);
229 resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target);
230 if (!JavaVersionUtil.Java8OrEarlier) {
231 profileSnippets = new ProfileSnippets.Templates(options, factories, providers, target);
232 }
233 objectCloneSnippets = new ObjectCloneSnippets.Templates(options, factories, providers, target);
234 foreignCallSnippets = new ForeignCallSnippets.Templates(options, factories, providers, target);
235 }
236
237 public MonitorSnippets.Templates getMonitorSnippets() {
238 return monitorSnippets;
239 }
240
241 @Override
242 @SuppressWarnings("try")
243 public void lower(Node n, LoweringTool tool) {
244 StructuredGraph graph = (StructuredGraph) n.graph();
245 try (DebugCloseable context = n.withNodeSourcePosition()) {
246 if (n instanceof Invoke) {
247 lowerInvoke((Invoke) n, tool, graph);
248 } else if (n instanceof LoadMethodNode) {
249 lowerLoadMethodNode((LoadMethodNode) n);
250 } else if (n instanceof GetClassNode) {
251 lowerGetClassNode((GetClassNode) n, tool, graph);
252 } else if (n instanceof StoreHubNode) {
670 return ex;
671 }
672 }
673
674 public static final class RuntimeCalls {
675 public static final EnumMap<BytecodeExceptionKind, ForeignCallDescriptor> runtimeCalls;
676
677 static {
678 runtimeCalls = new EnumMap<>(BytecodeExceptionKind.class);
679 runtimeCalls.put(BytecodeExceptionKind.ARRAY_STORE, new ForeignCallDescriptor("createArrayStoreException", ArrayStoreException.class, Object.class));
680 runtimeCalls.put(BytecodeExceptionKind.CLASS_CAST, new ForeignCallDescriptor("createClassCastException", ClassCastException.class, Object.class, KlassPointer.class));
681 runtimeCalls.put(BytecodeExceptionKind.NULL_POINTER, new ForeignCallDescriptor("createNullPointerException", NullPointerException.class));
682 runtimeCalls.put(BytecodeExceptionKind.OUT_OF_BOUNDS, new ForeignCallDescriptor("createOutOfBoundsException", ArrayIndexOutOfBoundsException.class, int.class, int.class));
683 runtimeCalls.put(BytecodeExceptionKind.DIVISION_BY_ZERO, new ForeignCallDescriptor("createDivisionByZeroException", ArithmeticException.class));
684 runtimeCalls.put(BytecodeExceptionKind.INTEGER_EXACT_OVERFLOW, new ForeignCallDescriptor("createIntegerExactOverflowException", ArithmeticException.class));
685 runtimeCalls.put(BytecodeExceptionKind.LONG_EXACT_OVERFLOW, new ForeignCallDescriptor("createLongExactOverflowException", ArithmeticException.class));
686 }
687 }
688
689 private void throwCachedException(BytecodeExceptionNode node) {
690 if (IS_IN_NATIVE_IMAGE) {
691 throw new InternalError("Can't throw exception from SVM object");
692 }
693 Throwable exception = Exceptions.cachedExceptions.get(node.getExceptionKind());
694 assert exception != null;
695
696 StructuredGraph graph = node.graph();
697 FloatingNode exceptionNode = ConstantNode.forConstant(constantReflection.forObject(exception), metaAccess, graph);
698 graph.replaceFixedWithFloating(node, exceptionNode);
699 }
700
701 private void lowerBytecodeExceptionNode(BytecodeExceptionNode node) {
702 if (OmitHotExceptionStacktrace.getValue(node.getOptions())) {
703 throwCachedException(node);
704 return;
705 }
706
707 ForeignCallDescriptor descriptor = RuntimeCalls.runtimeCalls.get(node.getExceptionKind());
708 assert descriptor != null;
709
710 StructuredGraph graph = node.graph();
711 ForeignCallNode foreignCallNode = graph.add(new ForeignCallNode(foreignCalls, descriptor, node.stamp(NodeView.DEFAULT), node.getArguments()));
712 graph.replaceFixedWithFixed(node, foreignCallNode);
|