< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java

Print this page




   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);


< prev index next >