|
33 | 33 | import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
34 | 34 | import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor; |
35 | 35 | import org.graalvm.compiler.core.common.type.StampPair; |
| 36 | +import org.graalvm.compiler.core.common.type.TypeReference; |
36 | 37 | import org.graalvm.compiler.debug.DebugHandlersFactory; |
37 | 38 | import org.graalvm.compiler.graph.Node; |
38 | 39 | import org.graalvm.compiler.graph.NodeInputList; |
| 40 | +import org.graalvm.compiler.nodes.BeginNode; |
39 | 41 | import org.graalvm.compiler.nodes.CallTargetNode; |
40 | 42 | import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; |
41 | 43 | import org.graalvm.compiler.nodes.ConstantNode; |
42 | 44 | import org.graalvm.compiler.nodes.DirectCallTargetNode; |
43 | 45 | import org.graalvm.compiler.nodes.FixedGuardNode; |
44 | 46 | import org.graalvm.compiler.nodes.FixedNode; |
| 47 | +import org.graalvm.compiler.nodes.FixedWithNextNode; |
| 48 | +import org.graalvm.compiler.nodes.IfNode; |
45 | 49 | import org.graalvm.compiler.nodes.IndirectCallTargetNode; |
46 | 50 | import org.graalvm.compiler.nodes.Invoke; |
47 | 51 | import org.graalvm.compiler.nodes.InvokeNode; |
|
54 | 58 | import org.graalvm.compiler.nodes.StructuredGraph; |
55 | 59 | import org.graalvm.compiler.nodes.ValueNode; |
56 | 60 | import org.graalvm.compiler.nodes.calc.IsNullNode; |
| 61 | +import org.graalvm.compiler.nodes.extended.BranchProbabilityNode; |
57 | 62 | import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode; |
58 | 63 | import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; |
59 | 64 | import org.graalvm.compiler.nodes.extended.ForeignCallNode; |
60 | 65 | import org.graalvm.compiler.nodes.extended.GetClassNode; |
61 | 66 | import org.graalvm.compiler.nodes.extended.LoadHubNode; |
| 67 | +import org.graalvm.compiler.nodes.extended.OpaqueNode; |
| 68 | +import org.graalvm.compiler.nodes.java.InstanceOfNode; |
62 | 69 | import org.graalvm.compiler.nodes.java.MethodCallTargetNode; |
63 | 70 | import org.graalvm.compiler.nodes.memory.OnHeapMemoryAccess.BarrierType; |
64 | 71 | import org.graalvm.compiler.nodes.memory.ReadNode; |
|
73 | 80 | import org.graalvm.word.LocationIdentity; |
74 | 81 |
|
75 | 82 | import com.oracle.svm.core.FrameAccess; |
| 83 | +import com.oracle.svm.core.SubstrateOptions; |
76 | 84 | import com.oracle.svm.core.code.CodeInfoTable; |
77 | 85 | import com.oracle.svm.core.graal.code.SubstrateBackend; |
78 | 86 | import com.oracle.svm.core.graal.meta.RuntimeConfiguration; |
|
81 | 89 | import com.oracle.svm.core.meta.SharedMethod; |
82 | 90 | import com.oracle.svm.core.meta.SubstrateObjectConstant; |
83 | 91 | import com.oracle.svm.core.snippets.ImplicitExceptions; |
| 92 | +import com.oracle.svm.core.snippets.SnippetRuntime; |
| 93 | +import com.oracle.svm.core.snippets.SubstrateForeignCallTarget; |
84 | 94 | import com.oracle.svm.core.util.VMError; |
85 | 95 |
|
86 | 96 | import jdk.vm.ci.code.CallingConvention; |
|
93 | 103 |
|
94 | 104 | public abstract class NonSnippetLowerings { |
95 | 105 |
|
| 106 | + public static final SnippetRuntime.SubstrateForeignCallDescriptor REPORT_VERIFY_TYPES_ERROR = SnippetRuntime.findForeignCall(NonSnippetLowerings.class, "reportVerifyTypesError", false, |
| 107 | + LocationIdentity.any()); |
| 108 | + |
96 | 109 | private final RuntimeConfiguration runtimeConfig; |
97 | 110 | private final Predicate<ResolvedJavaMethod> mustNotAllocatePredicate; |
98 | 111 |
|
| 112 | + final boolean verifyTypes = SubstrateOptions.VerifyTypes.getValue(); |
| 113 | + |
| 114 | + @SubstrateForeignCallTarget(stubCallingConvention = true) |
| 115 | + private static void reportVerifyTypesError(Object object, String message) { |
| 116 | + throw VMError.shouldNotReachHere("VerifyTypes found a type error for object " + (object == null ? "null" : object.getClass().getTypeName()) + ": " + message); |
| 117 | + } |
| 118 | + |
99 | 119 | @SuppressWarnings("unused") |
100 | 120 | protected NonSnippetLowerings(RuntimeConfiguration runtimeConfig, Predicate<ResolvedJavaMethod> mustNotAllocatePredicate, OptionValues options, Iterable<DebugHandlersFactory> factories, |
101 | 121 | Providers providers, SnippetReflectionProvider snippetReflection, Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings) { |
@@ -251,6 +271,24 @@ public void lower(FixedNode node, LoweringTool tool) { |
251 | 271 | JavaType[] signature = method.getSignature().toParameterTypes(callTarget.isStatic() ? null : method.getDeclaringClass()); |
252 | 272 | CallingConvention.Type callType = method.getCallingConventionKind().toType(true); |
253 | 273 |
|
| 274 | + if (verifyTypes && !callTarget.isStatic() && receiver.getStackKind() == JavaKind.Object) { |
| 275 | + ValueNode opaqueReceiver = graph.unique(new OpaqueNode(receiver)); |
| 276 | + LogicNode instanceOf = graph.addOrUniqueWithInputs(InstanceOfNode.create(TypeReference.createTrustedWithoutAssumptions(method.getDeclaringClass()), opaqueReceiver)); |
| 277 | + BeginNode passingBegin = graph.add(new BeginNode()); |
| 278 | + BeginNode failingBegin = graph.add(new BeginNode()); |
| 279 | + IfNode ifNode = graph.add(new IfNode(instanceOf, passingBegin, failingBegin, BranchProbabilityNode.EXTREMELY_FAST_PATH_PROFILE)); |
| 280 | + |
| 281 | + FixedWithNextNode pred = (FixedWithNextNode) node.predecessor(); |
| 282 | + pred.setNext(ifNode); |
| 283 | + passingBegin.setNext(node); |
| 284 | + |
| 285 | + ConstantNode errorMessage = ConstantNode.forConstant(tool.getConstantReflection().forString("Invoke of " + method.format("%H.%n(%p)%r")), tool.getMetaAccess(), graph); |
| 286 | + ForeignCallNode reportError = graph.add(new ForeignCallNode(REPORT_VERIFY_TYPES_ERROR, opaqueReceiver, errorMessage)); |
| 287 | + reportError.setStateAfter(invoke.stateAfter().duplicateModifiedDuringCall(invoke.bci(), node.getStackKind())); |
| 288 | + failingBegin.setNext(reportError); |
| 289 | + reportError.setNext(graph.add(new LoweredDeadEndNode())); |
| 290 | + } |
| 291 | + |
254 | 292 | InvokeKind invokeKind = callTarget.invokeKind(); |
255 | 293 | SharedMethod[] implementations = method.getImplementations(); |
256 | 294 | LoadHubNode hub = null; |
|
0 commit comments