--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java Fri Mar 16 11:26:05 2018 +0000
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java Fri Mar 16 22:59:32 2018 -0700
@@ -34,8 +34,11 @@
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.StampPair;
+import org.graalvm.compiler.debug.DebugCloseable;
import org.graalvm.compiler.debug.DebugContext;
+import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.debug.JavaMethodContext;
+import org.graalvm.compiler.graph.NodeSourcePosition;
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition;
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkageImpl;
@@ -224,33 +227,37 @@
* %r15 on AMD64) and is only prepended if {@link #prependThread} is true.
*/
@Override
+ @SuppressWarnings("try")
protected StructuredGraph getGraph(DebugContext debug, CompilationIdentifier compilationId) {
WordTypes wordTypes = providers.getWordTypes();
Class<?>[] args = linkage.getDescriptor().getArgumentTypes();
boolean isObjectResult = !LIRKind.isValue(linkage.getOutgoingCallingConvention().getReturn());
StructuredGraph graph = new StructuredGraph.Builder(options, debug).name(toString()).compilationId(compilationId).build();
graph.disableUnsafeAccessTracking();
-
- GraphKit kit = new GraphKit(graph, providers, wordTypes, providers.getGraphBuilderPlugins());
- ParameterNode[] params = createParameters(kit, args);
+ graph.setTrackNodeSourcePosition();
+ try {
+ ResolvedJavaMethod thisMethod = providers.getMetaAccess().lookupJavaMethod(ForeignCallStub.class.getDeclaredMethod("getGraph", DebugContext.class, CompilationIdentifier.class));
+ try (DebugCloseable context = graph.withNodeSourcePosition(NodeSourcePosition.substitution(thisMethod))) {
+ GraphKit kit = new GraphKit(graph, providers, wordTypes, providers.getGraphBuilderPlugins());
+ ParameterNode[] params = createParameters(kit, args);
+ ReadRegisterNode thread = kit.append(new ReadRegisterNode(providers.getRegisters().getThreadRegister(), wordTypes.getWordKind(), true, false));
+ ValueNode result = createTargetCall(kit, params, thread);
+ kit.createInvoke(StubUtil.class, "handlePendingException", thread, ConstantNode.forBoolean(isObjectResult, graph));
+ if (isObjectResult) {
+ InvokeNode object = kit.createInvoke(HotSpotReplacementsUtil.class, "getAndClearObjectResult", thread);
+ result = kit.createInvoke(StubUtil.class, "verifyObject", object);
+ }
+ kit.append(new ReturnNode(linkage.getDescriptor().getResultType() == void.class ? null : result));
+ debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Initial stub graph");
- ReadRegisterNode thread = kit.append(new ReadRegisterNode(providers.getRegisters().getThreadRegister(), wordTypes.getWordKind(), true, false));
- ValueNode result = createTargetCall(kit, params, thread);
- kit.createInvoke(StubUtil.class, "handlePendingException", thread, ConstantNode.forBoolean(isObjectResult, graph));
- if (isObjectResult) {
- InvokeNode object = kit.createInvoke(HotSpotReplacementsUtil.class, "getAndClearObjectResult", thread);
- result = kit.createInvoke(StubUtil.class, "verifyObject", object);
+ kit.inlineInvokes();
+ new RemoveValueProxyPhase().apply(graph);
+
+ debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Stub graph before compilation");
+ }
+ } catch (Exception e) {
+ throw GraalError.shouldNotReachHere(e);
}
- kit.append(new ReturnNode(linkage.getDescriptor().getResultType() == void.class ? null : result));
-
- debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Initial stub graph");
-
- kit.inlineInvokes();
-
- new RemoveValueProxyPhase().apply(graph);
-
- debug.dump(DebugContext.VERBOSE_LEVEL, graph, "Stub graph before compilation");
-
return graph;
}