Mercurial > hg > graal-compiler
changeset 22898:f22b9506329a
TruffleTreeDumpHandler: dump inlined call graph
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Wed, 28 Oct 2015 18:47:47 +0100 |
parents | 71c1991bb6f0 |
children | 19b6f8b951d0 |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleTreeDumpHandler.java |
diffstat | 1 files changed, 37 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleTreeDumpHandler.java Wed Oct 28 18:47:41 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleTreeDumpHandler.java Wed Oct 28 18:47:47 2015 +0100 @@ -27,7 +27,10 @@ import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.nodes.DirectCallNode; import com.oracle.truffle.api.nodes.GraphPrintVisitor; +import com.oracle.truffle.api.nodes.GraphPrintVisitor.GraphPrintAdapter; +import com.oracle.truffle.api.nodes.GraphPrintVisitor.GraphPrintHandler; import com.oracle.truffle.api.nodes.NodeUtil; +import com.oracle.truffle.api.source.SourceSection; public class TruffleTreeDumpHandler implements DebugDumpHandler { @@ -48,6 +51,7 @@ TruffleInlining inlining = new TruffleInlining((OptimizedCallTarget) callTarget, new DefaultInliningPolicy()); if (inlining.countInlinedCalls() > 0) { dumpInlinedTrees(printer, (OptimizedCallTarget) callTarget, inlining); + dumpInlinedCallGraph(printer, (OptimizedCallTarget) callTarget, inlining); } } printer.endGroup(); @@ -71,6 +75,39 @@ } } + private static void dumpInlinedCallGraph(final GraphPrintVisitor printer, final OptimizedCallTarget rootCallTarget, TruffleInlining inlining) { + class InliningGraphPrintHandler implements GraphPrintHandler { + private final TruffleInlining inlining; + + public InliningGraphPrintHandler(TruffleInlining inlining) { + this.inlining = inlining; + } + + public void visit(Object node, GraphPrintAdapter g) { + if (g.visited(node)) { + return; + } + g.createElementForNode(node); + g.setNodeProperty(node, "name", node.toString()); + for (DirectCallNode callNode : NodeUtil.findAllNodeInstances(((RootCallTarget) node).getRootNode(), DirectCallNode.class)) { + CallTarget inlinedCallTarget = callNode.getCurrentCallTarget(); + if (inlinedCallTarget instanceof OptimizedCallTarget && callNode instanceof OptimizedDirectCallNode) { + TruffleInliningDecision decision = inlining.findByCall((OptimizedDirectCallNode) callNode); + if (decision != null && decision.isInline()) { + g.visit(inlinedCallTarget, new InliningGraphPrintHandler(decision)); + SourceSection sourceSection = callNode.getEncapsulatingSourceSection(); + g.connectNodes(node, inlinedCallTarget, sourceSection != null ? sourceSection.toString() : null); + } + } + } + } + } + + printer.beginGraph("inlined call graph"); + printer.visit(rootCallTarget, new InliningGraphPrintHandler(inlining)); + printer.endGraph(); + } + public void close() { // nothing to do }