# HG changeset patch # User Michael Van De Vanter # Date 1422419323 28800 # Node ID d1c1cd2530d7258b13476e873d42b3b09e93bd58 # Parent acd822f17ef56bcf9596b3797425e68b0acec9d8 Truffle/Instrumentation: clean up and repair some old unit tests diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/SLMain.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,17 +24,21 @@ import java.io.*; import java.math.*; +import java.util.Scanner; import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.instrument.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; +import com.oracle.truffle.api.tools.*; import com.oracle.truffle.sl.builtins.*; import com.oracle.truffle.sl.factory.*; import com.oracle.truffle.sl.nodes.*; import com.oracle.truffle.sl.nodes.call.*; import com.oracle.truffle.sl.nodes.controlflow.*; import com.oracle.truffle.sl.nodes.expression.*; +import com.oracle.truffle.sl.nodes.instrument.*; import com.oracle.truffle.sl.nodes.local.*; import com.oracle.truffle.sl.parser.*; import com.oracle.truffle.sl.runtime.*; @@ -111,9 +115,29 @@ * argument and adds them to the function registry. Functions that are already defined are replaced * with the new version. * + * + *

+ * Tools:
+ * The use of some of Truffle's support for developer tools (based on the Truffle Instrumentation + * Framework) are demonstrated in this file, for example: + *

+ * In each case, the tool is enabled if a corresponding local boolean variable in this file is set + * to {@code true}. Results are printed at the end of the execution using each tool's + * default printer. + * */ public class SLMain { + /* Demonstrate per-type tabulation of node execution counts */ + private static boolean nodeExecCounts = false; + /* Demonstrate per-line tabulation of STATEMENT node execution counts */ + private static boolean statementCounts = false; + /* Demonstrate per-line tabulation of STATEMENT coverage */ + private static boolean coverage = false; + /** * The main entry point. Use the mx command "mx sl" to run it with the correct class path setup. */ @@ -146,6 +170,28 @@ // logOutput.println("Source = " + source.getCode()); } + if (statementCounts || coverage) { + Probe.registerASTProber(new SLStandardASTProber()); + } + + NodeExecCounter nodeExecCounter = null; + if (nodeExecCounts) { + nodeExecCounter = new NodeExecCounter(); + nodeExecCounter.install(); + } + + NodeExecCounter statementExecCounter = null; + if (statementCounts) { + statementExecCounter = new NodeExecCounter(StandardSyntaxTag.STATEMENT); + statementExecCounter.install(); + } + + CoverageTracker coverageTracker = null; + if (coverage) { + coverageTracker = new CoverageTracker(); + coverageTracker.install(); + } + /* Parse the SL source file. */ Parser.parseSL(context, source); @@ -187,6 +233,18 @@ } finally { printScript("after execution", context, logOutput, printASTToLog, printSourceAttributionToLog, dumpASTToIGV); } + if (nodeExecCounter != null) { + nodeExecCounter.print(System.out); + nodeExecCounter.dispose(); + } + if (statementExecCounter != null) { + statementExecCounter.print(System.out); + statementExecCounter.dispose(); + } + if (coverageTracker != null) { + coverageTracker.print(System.out); + coverageTracker.dispose(); + } return totalRuntime; } @@ -282,4 +340,5 @@ } return result.toString(); } + } diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLExpressionNode.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; -import com.oracle.truffle.api.instrument.*; +import com.oracle.truffle.api.instrument.ProbeNode.WrapperNode; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.instrument.*; @@ -91,43 +91,13 @@ } @Override - public Probe probe() { - Node parent = getParent(); - - if (parent == null) { - throw new IllegalStateException("Cannot call probe() a node without a parent."); - } - - if (parent instanceof SLExpressionWrapperNode) { - return ((SLExpressionWrapperNode) parent).getProbe(); - } - - // Create a new wrapper/probe with this node as its child. - final SLExpressionWrapperNode wrapper = new SLExpressionWrapperNode(this); - - // Connect it to a Probe - final Probe probe = ProbeNode.insertProbe(wrapper); - - // Replace this node in the AST with the wrapper - this.replace(wrapper); - - return probe; + public boolean isInstrumentable() { + return true; } @Override - public void probeLite(TruffleEventReceiver eventReceiver) { - Node parent = getParent(); - - if (parent == null) { - throw new IllegalStateException("Cannot call probeLite() on a node without a parent."); - } + public WrapperNode createWrapperNode() { + return new SLExpressionWrapperNode(this); + } - if (parent instanceof SLExpressionWrapperNode) { - throw new IllegalStateException("Cannot call probeLite() on a node that already has a wrapper."); - } - final SLExpressionWrapperNode wrapper = new SLExpressionWrapperNode(this); - ProbeNode.insertProbeLite(wrapper, eventReceiver); - - this.replace(wrapper); - } } diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLStatementNode.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,7 @@ import java.io.*; import com.oracle.truffle.api.frame.*; -import com.oracle.truffle.api.instrument.*; -import com.oracle.truffle.api.instrument.ProbeNode.*; +import com.oracle.truffle.api.instrument.ProbeNode.WrapperNode; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; import com.oracle.truffle.sl.nodes.instrument.*; @@ -37,7 +36,7 @@ * local variables. */ @NodeInfo(language = "Simple Language", description = "The abstract base node for all statements") -public abstract class SLStatementNode extends Node implements Instrumentable { +public abstract class SLStatementNode extends Node { public SLStatementNode(SourceSection src) { super(src); @@ -86,44 +85,13 @@ } @Override - public Probe probe() { - Node parent = getParent(); - - if (parent == null) { - throw new IllegalStateException("Cannot call probe() on a node without a parent."); - } - - if (parent instanceof SLStatementWrapperNode) { - return ((SLStatementWrapperNode) parent).getProbe(); - } - - // Create a new wrapper/probe with this node as its child. - final SLStatementWrapperNode wrapper = new SLStatementWrapperNode(this); - - // Connect it to a Probe - final Probe probe = ProbeNode.insertProbe(wrapper); - - // Replace this node in the AST with the wrapper - this.replace(wrapper); - - return probe; + public boolean isInstrumentable() { + return true; } @Override - public void probeLite(TruffleEventReceiver eventReceiver) { - Node parent = getParent(); - - if (parent == null) { - throw new IllegalStateException("Cannot call probeLite() on a node without a parent"); - } + public WrapperNode createWrapperNode() { + return new SLStatementWrapperNode(this); + } - if (parent instanceof SLStatementWrapperNode) { - throw new IllegalStateException("Cannot call probeLite() on a node that already has a wrapper."); - } - - final SLStatementWrapperNode wrapper = new SLStatementWrapperNode(this); - ProbeNode.insertProbeLite(wrapper, eventReceiver); - - this.replace(wrapper); - } } diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLExpressionWrapperNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLExpressionWrapperNode.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLExpressionWrapperNode.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,6 +58,11 @@ } @Override + public boolean isInstrumentable() { + return false; + } + + @Override public SLExpressionNode getNonWrapperNode() { return child; } @@ -133,14 +138,4 @@ public SLNull executeNull(VirtualFrame frame) throws UnexpectedResultException { return SLTypesGen.expectSLNull(executeGeneric(frame)); } - - @Override - public Probe probe() { - throw new IllegalStateException("Cannot call probe() on a wrapper."); - } - - @Override - public void probeLite(TruffleEventReceiver eventReceiver) { - throw new IllegalStateException("Cannot call probeLite() on a wrapper."); - } } diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStandardASTProber.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,31 +44,35 @@ */ public boolean visit(Node node) { - if (node instanceof SLStatementNode) { + if (node.isInstrumentable()) { + + if (node instanceof SLStatementNode) { - // We have to distinguish between SLExpressionNode and SLStatementNode since some of the - // generated factories have methods that require SLExpressionNodes as parameters. Since - // SLExpressionNodes are a subclass of SLStatementNode, we check if something is an - // SLExpressionNode first. - if (node instanceof SLExpressionNode && node.getParent() != null) { - SLExpressionNode expressionNode = (SLExpressionNode) node; - if (expressionNode.getSourceSection() != null) { - Probe probe = expressionNode.probe(); + // Distinguish between SLExpressionNode and SLStatementNode since some of the + // generated factory methods that require SLExpressionNodes as parameters. + // Since + // SLExpressionNodes are a subclass of SLStatementNode, check if something is an + // SLExpressionNode first. + if (node instanceof SLExpressionNode && node.getParent() != null) { + SLExpressionNode expressionNode = (SLExpressionNode) node; + if (expressionNode.getSourceSection() != null) { + Probe probe = expressionNode.probe(); - if (node instanceof SLWriteLocalVariableNode) { + if (node instanceof SLWriteLocalVariableNode) { + probe.tagAs(STATEMENT, null); + probe.tagAs(ASSIGNMENT, null); + } + } + } else if (node instanceof SLStatementNode && node.getParent() != null) { + + SLStatementNode statementNode = (SLStatementNode) node; + if (statementNode.getSourceSection() != null) { + Probe probe = statementNode.probe(); probe.tagAs(STATEMENT, null); - probe.tagAs(ASSIGNMENT, null); - } - } - } else if (node instanceof SLStatementNode && node.getParent() != null) { - SLStatementNode statementNode = (SLStatementNode) node; - if (statementNode.getSourceSection() != null) { - Probe probe = statementNode.probe(); - probe.tagAs(STATEMENT, null); - - if (node instanceof SLWhileNode) { - probe.tagAs(START_LOOP, null); + if (node instanceof SLWhileNode) { + probe.tagAs(START_LOOP, null); + } } } } diff -r acd822f17ef5 -r d1c1cd2530d7 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStatementWrapperNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStatementWrapperNode.java Tue Jan 27 20:28:19 2015 -0800 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/instrument/SLStatementWrapperNode.java Tue Jan 27 20:28:43 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,6 +51,11 @@ } @Override + public boolean isInstrumentable() { + return false; + } + + @Override public SLStatementNode getNonWrapperNode() { return child; } @@ -87,13 +92,4 @@ } } - @Override - public Probe probe() { - throw new IllegalStateException("Cannot call probe() on a wrapper."); - } - - @Override - public void probeLite(TruffleEventReceiver eventReceiver) { - throw new IllegalStateException("Cannot call probeLite() on a wrapper."); - } }