# HG changeset patch # User Peter Hofer # Date 1304930637 -7200 # Node ID a57e051b33cd1518abfc95fde5cb7912318c2b8f # Parent b1b58f9080449c20cb68de43e9d407a5ef74c740 Move Graphviz visualization code to its own project, GraalGraphviz diff -r b1b58f908044 -r a57e051b33cd graal/GraalCompiler/.classpath --- a/graal/GraalCompiler/.classpath Fri May 06 17:54:02 2011 +0200 +++ b/graal/GraalCompiler/.classpath Mon May 09 10:43:57 2011 +0200 @@ -4,5 +4,6 @@ + diff -r b1b58f908044 -r a57e051b33cd graal/GraalCompiler/src/com/sun/c1x/C1XCompiler.java --- a/graal/GraalCompiler/src/com/sun/c1x/C1XCompiler.java Fri May 06 17:54:02 2011 +0200 +++ b/graal/GraalCompiler/src/com/sun/c1x/C1XCompiler.java Mon May 09 10:43:57 2011 +0200 @@ -27,7 +27,6 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.vis.*; -import com.oracle.graal.graph.vis.GraphvizTest.*; import com.sun.c1x.debug.*; import com.sun.c1x.globalstub.*; import com.sun.c1x.observer.*; @@ -160,7 +159,7 @@ printer.end(); try { - GraphvizRunner.process(GraphvizRunner.DOT_COMMAND, new ByteArrayInputStream(out.toByteArray()), + GraphvizRunner.process(GraphvizRunner.DOT_LAYOUT, new ByteArrayInputStream(out.toByteArray()), new FileOutputStream(name + "_" + (n++) + event.getLabel() + ".pdf"), "pdf"); } catch (Exception e) { e.printStackTrace(); diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraph/src/com/oracle/graal/graph/vis/GraphvizPrinter.java --- a/graal/GraalGraph/src/com/oracle/graal/graph/vis/GraphvizPrinter.java Fri May 06 17:54:02 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2011, 2011, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.graph.vis; - -import java.awt.Color; -import java.io.OutputStream; -import java.io.PrintStream; - -import com.oracle.graal.graph.Graph; -import com.oracle.graal.graph.Node; -import com.oracle.graal.graph.Node.NodeArray; - -/** - * Generates a representation of {@link Node Nodes} or entire {@link Graph Graphs} in the DOT language that can be - * visualized with Graphviz. - */ -public class GraphvizPrinter { - - public static final Color NODE_BGCOLOR = Color.WHITE; - private static final String NODE_BGCOLOR_STRING = formatColorString(NODE_BGCOLOR); - - private static String formatColorString(Color c) { - return String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); - } - - private final PrintStream out; - - /** - * Creates a new {@link GraphvizPrinter} that writes to the specified output stream. - */ - public GraphvizPrinter(OutputStream out) { - this.out = new PrintStream(out); - } - - /** - * Opens a graph with the specified title (label). Call this before printing any nodes, but not more than once - * without calling {@link #end()} first. - * - * @param title - * The graph's label. - */ - public void begin(String title) { - out.println("digraph g {"); - if (title != null) { - out.println(" label=\"" + title + "\";"); - } - } - - /** - * Closes the graph. No nodes should be printed afterwards. Another graph can be opened with {@link #begin(String)}, - * but many Graphviz output plugins ignore additional graphs in their input. - */ - public void end() { - out.println("}"); - } - - /** - * Prints all nodes and edges in the specified graph. - */ - public void print(Graph graph) { - // graph.getNodes() returns all the graph's nodes, not just "roots" - for (Node n : graph.getNodes()) { - printNode(n); - } - } - - /** - * Prints a single node and edges for all its inputs and successors. - */ - public void printNode(Node node) { - int id = node.id(); - String name = "n" + id; - NodeArray inputs = node.inputs(); - NodeArray successors = node.successors(); - - printNode(name, node.toString(), inputs.size(), successors.size()); - - for (int i = 0; i < successors.size(); ++i) { - Node successor = successors.get(i); - if (successor != Node.Null) { - printControlEdge(id, i, successor.id()); - } - } - - for (int i = 0; i < inputs.size(); ++i) { - Node input = inputs.get(i); - if (input != Node.Null) { - printDataEdge(id, i, input.id()); - } - } - } - - private void printNode(String name, String label, int ninputs, int nsuccessors) { - out.println(name + " [shape=plaintext,"); - out.println(" label=< "); - out.println("
"); - out.println(" "); - out.println("
"); - out.println("
"); - - if ((ninputs == 1 && nsuccessors == 1) || (ninputs == 0 && nsuccessors == 0)) { - out.println(" "); - } - - for (int i = 0; i < nsuccessors - ninputs; i++) { - out.println(" "); - } - - for (int i = 0; i < ninputs; i++) { - out.println(" "); - } - - label = label.replace("&", "&"); - label = label.replace("<", "<"); - label = label.replace(">", ">"); - out.println("
" + label + "
"); - - for (int i = 0; i < nsuccessors; i++) { - out.println(" "); - } - - for (int i = 0; i < ninputs - nsuccessors; i++) { - out.println(" "); - } - - if ((ninputs == 1 && nsuccessors == 1) || (ninputs == 0 && nsuccessors == 0)) { - out.println(" "); - } - - out.println("
"); - out.println("
>]; "); - } - - private void printControlEdge(int from, int fromPort, int to) { - out.println("n" + from + ":succ" + fromPort + " -> n" + to + ":predecessors:n [color=red];"); - } - - private void printDataEdge(int from, int fromPort, int to) { - out.println("n" + to + ":usages -> n" + from + ":in" + fromPort + ":n [color=black,dir=back];"); - } - -} diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraph/src/com/oracle/graal/graph/vis/GraphvizRunner.java --- a/graal/GraalGraph/src/com/oracle/graal/graph/vis/GraphvizRunner.java Fri May 06 17:54:02 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2011, 2011, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.graph.vis; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Provides functionality to process graphs in the DOT language with a Graphviz tool and obtain the generated output. - */ -public class GraphvizRunner { - - public static final String DOT_COMMAND = "dot"; - - /** - * Processes data from an input stream with a Graphviz tool such as {@code dot}, writing output in the specified - * format to the given output stream. The method waits for the executed tool to finish and then returns its exit - * code. - * - * @param command - * The Graphviz tool to call. - * @param in - * Stream to read input from. - * @param out - * Stream to write output to. - * @param format - * Desired output format (-T parameter). - * @return Exit code of the called utility. - * @throws IOException - * When the process can not be started (e.g. Graphviz missing) or reading/writing a stream fails. - */ - public static int process(String command, InputStream in, OutputStream out, String format) throws IOException { - byte[] buffer = new byte[4096]; - - // create and start process - ProcessBuilder pb = new ProcessBuilder(command, "-T", format); - Process p = pb.start(); - - // write data from in to stdin - OutputStream stdin = p.getOutputStream(); - transfer(buffer, in, stdin); - stdin.close(); - in.close(); - - // read output from stdout and write to out - InputStream stdout = p.getInputStream(); - transfer(buffer, stdout, out); - stdout.close(); - - // wait for process to terminate - for (;;) { - try { - return p.waitFor(); - } catch (InterruptedException e) { - // ignore - } - } - } - - /** - * Reads all data from an {@link InputStream} and writes it to an {@link OutputStream}, using the provided buffer. - */ - private static void transfer(byte[] buffer, InputStream in, OutputStream out) throws IOException { - int count; - while ((count = in.read(buffer, 0, buffer.length)) != -1) { - out.write(buffer, 0, count); - } - in.close(); - } -} diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraph/test/com/oracle/graal/graph/vis/GraphvizTest.java --- a/graal/GraalGraph/test/com/oracle/graal/graph/vis/GraphvizTest.java Fri May 06 17:54:02 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2011, 2011, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.graph.vis; - -import static org.junit.Assert.assertEquals; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import org.junit.Test; - -import com.oracle.graal.graph.Graph; -import com.oracle.graal.graph.Node; - -/** - * Tests for the Graphviz graph generator. Needs Graphviz (more specifically, dot) installed to verify produced output. - */ -public class GraphvizTest { - - @Test - public void testSimpleGraph() throws IOException { - Graph g = new Graph(); - - DummyNode start = new DummyNode("start", 0, 1, g); - - DummyNode ifnode = new DummyNode("if", 2, 2, g); - start.setSuccessor(0, ifnode); - - // branch 1 - DummyNode nop = new DummyNode("nop", 0, 1, g); - ifnode.setSuccessor(0, nop); - - // branch 2 - DummyNode a = new DummyNode("a", 0, 1, g); - DummyNode b = new DummyNode("b", 0, 1, g); - DummyNode plus = new DummyNode("+", 2, 1, g); - plus.setInput(0, a); - plus.setInput(1, b); - ifnode.setSuccessor(1, plus); - - DummyNode end = new DummyNode("end", 0, 1, g); - plus.setSuccessor(0, end); - nop.setSuccessor(0, end); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - GraphvizPrinter printer = new GraphvizPrinter(out); - printer.begin("Simple test"); - printer.print(g); - printer.end(); - - int exitCode = GraphvizRunner.process(GraphvizRunner.DOT_COMMAND, new ByteArrayInputStream(out.toByteArray()), new NullOutputStream(), "xdot"); - assertEquals(0, exitCode); - } - - private static class DummyNode extends Node { - - private final int inputCount; - private final int successorCount; - private final String name; - - public DummyNode(String name, int inputCount, int successorCount, Graph graph) { - super(inputCount, successorCount, graph); - this.name = name; - this.inputCount = inputCount; - this.successorCount = successorCount; - } - - @Override - public Node copy(Graph into) { - return new DummyNode(name, inputCount, successorCount, into); - } - - public void setInput(int idx, Node n) { - inputs().set(idx, n); - } - - public void setSuccessor(int idx, Node n) { - successors().set(idx, n); - } - - @Override - protected int inputCount() { - return super.inputCount() + inputCount; - } - - @Override - protected int successorCount() { - return super.inputCount() + successorCount; - } - - @Override - public String toString() { - return name; - } - } - - private static class NullOutputStream extends OutputStream { - - @Override - public void write(int b) throws IOException { - } - } - -} diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/.checkstyle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/.checkstyle Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,10 @@ + + + + + + + + + + diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/.classpath --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/.classpath Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,9 @@ + + + + + + + + + diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/.project --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/.project Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,23 @@ + + + GraalGraphviz + + + + + + org.eclipse.jdt.core.javabuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + + org.eclipse.jdt.core.javanature + net.sf.eclipsecs.core.CheckstyleNature + + diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/.settings/org.eclipse.jdt.core.prefs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/.settings/org.eclipse.jdt.core.prefs Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,270 @@ +#Wed Apr 27 22:10:44 CEST 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=true +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=4 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=8 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=true +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=200 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=false diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/.settings/org.eclipse.jdt.ui.prefs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/.settings/org.eclipse.jdt.ui.prefs Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,4 @@ +#Wed Apr 27 22:10:44 CEST 2011 +eclipse.preferences.version=1 +formatter_profile=_C1XJavaCodeStyle +formatter_settings_version=11 diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/src/com/oracle/graal/graph/vis/GraphvizPrinter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/src/com/oracle/graal/graph/vis/GraphvizPrinter.java Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2011, 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.graph.vis; + +import java.awt.Color; +import java.io.OutputStream; +import java.io.PrintStream; + +import com.oracle.graal.graph.Graph; +import com.oracle.graal.graph.Node; +import com.oracle.graal.graph.Node.NodeArray; + +/** + * Generates a representation of {@link Node Nodes} or entire {@link Graph Graphs} in the DOT language that can be + * visualized with Graphviz. + */ +public class GraphvizPrinter { + + public static final Color NODE_BGCOLOR = Color.WHITE; + private static final String NODE_BGCOLOR_STRING = formatColorString(NODE_BGCOLOR); + + private static String formatColorString(Color c) { + return String.format("#%02x%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + } + + private final PrintStream out; + + /** + * Creates a new {@link GraphvizPrinter} that writes to the specified output stream. + */ + public GraphvizPrinter(OutputStream out) { + this.out = new PrintStream(out); + } + + /** + * Opens a graph with the specified title (label). Call this before printing any nodes, but not more than once + * without calling {@link #end()} first. + * + * @param title + * The graph's label. + */ + public void begin(String title) { + out.println("digraph g {"); + if (title != null) { + out.println(" label=\"" + title + "\";"); + } + } + + /** + * Closes the graph. No nodes should be printed afterwards. Another graph can be opened with {@link #begin(String)}, + * but many Graphviz output plugins ignore additional graphs in their input. + */ + public void end() { + out.println("}"); + } + + /** + * Prints all nodes and edges in the specified graph. + */ + public void print(Graph graph) { + // graph.getNodes() returns all the graph's nodes, not just "roots" + for (Node n : graph.getNodes()) { + printNode(n); + } + } + + /** + * Prints a single node and edges for all its inputs and successors. + */ + public void printNode(Node node) { + int id = node.id(); + String name = "n" + id; + NodeArray inputs = node.inputs(); + NodeArray successors = node.successors(); + + printNode(name, node.toString(), inputs.size(), successors.size()); + + for (int i = 0; i < successors.size(); ++i) { + Node successor = successors.get(i); + if (successor != Node.Null) { + printControlEdge(id, i, successor.id()); + } + } + + for (int i = 0; i < inputs.size(); ++i) { + Node input = inputs.get(i); + if (input != Node.Null) { + printDataEdge(id, i, input.id()); + } + } + } + + private void printNode(String name, String label, int ninputs, int nsuccessors) { + out.println(name + " [shape=plaintext,"); + out.println(" label=< "); + out.println("
"); + out.println(" "); + out.println("
"); + out.println("
"); + + if ((ninputs == 1 && nsuccessors == 1) || (ninputs == 0 && nsuccessors == 0)) { + out.println(" "); + } + + for (int i = 0; i < nsuccessors - ninputs; i++) { + out.println(" "); + } + + for (int i = 0; i < ninputs; i++) { + out.println(" "); + } + + label = label.replace("&", "&"); + label = label.replace("<", "<"); + label = label.replace(">", ">"); + out.println("
" + label + "
"); + + for (int i = 0; i < nsuccessors; i++) { + out.println(" "); + } + + for (int i = 0; i < ninputs - nsuccessors; i++) { + out.println(" "); + } + + if ((ninputs == 1 && nsuccessors == 1) || (ninputs == 0 && nsuccessors == 0)) { + out.println(" "); + } + + out.println("
"); + out.println("
>]; "); + } + + private void printControlEdge(int from, int fromPort, int to) { + out.println("n" + from + ":succ" + fromPort + " -> n" + to + ":predecessors:n [color=red];"); + } + + private void printDataEdge(int from, int fromPort, int to) { + out.println("n" + to + ":usages -> n" + from + ":in" + fromPort + ":n [color=black,dir=back];"); + } + +} diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/src/com/oracle/graal/graph/vis/GraphvizRunner.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/src/com/oracle/graal/graph/vis/GraphvizRunner.java Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2011, 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.graph.vis; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Provides functionality to process graphs in the DOT language with a Graphviz tool and obtain the generated output. + */ +public class GraphvizRunner { + + public static final String DOT_LAYOUT = "dot"; + + /** + * Processes data from an input stream with a Graphviz tool such as {@code dot}, writing output in the specified + * format to the given output stream. The method waits for the executed tool to finish and then returns its exit + * code. + * + * @param layout + * The Graphviz layouter to use (e.g. "dot"). + * @param in + * Stream to read input from. + * @param out + * Stream to write output to. + * @param format + * Desired output format (-T parameter). + * @return Exit code of the called utility. + * @throws IOException + * When the process can not be started (e.g. Graphviz missing) or reading/writing a stream fails. + */ + public static int process(String layout, InputStream in, OutputStream out, String format) throws IOException { + byte[] buffer = new byte[4096]; + + // create and start process + ProcessBuilder pb = new ProcessBuilder("dot", "-T", format, "-K", layout); + Process p = pb.start(); + + // write data from in to stdin + OutputStream stdin = p.getOutputStream(); + transfer(buffer, in, stdin); + stdin.close(); + in.close(); + + // read output from stdout and write to out + InputStream stdout = p.getInputStream(); + transfer(buffer, stdout, out); + stdout.close(); + + // wait for process to terminate + for (;;) { + try { + return p.waitFor(); + } catch (InterruptedException e) { + // ignore + } + } + } + + /** + * Reads all data from an {@link InputStream} and writes it to an {@link OutputStream}, using the provided buffer. + */ + private static void transfer(byte[] buffer, InputStream in, OutputStream out) throws IOException { + int count; + while ((count = in.read(buffer, 0, buffer.length)) != -1) { + out.write(buffer, 0, count); + } + in.close(); + } +} diff -r b1b58f908044 -r a57e051b33cd graal/GraalGraphviz/test/com/oracle/graal/graph/vis/GraphvizTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/GraalGraphviz/test/com/oracle/graal/graph/vis/GraphvizTest.java Mon May 09 10:43:57 2011 +0200 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2011, 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.graph.vis; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import org.junit.Test; + +import com.oracle.graal.graph.Graph; +import com.oracle.graal.graph.Node; + +/** + * Tests for the Graphviz graph generator. Needs Graphviz (more specifically, dot) installed to verify produced output. + */ +public class GraphvizTest { + + @Test + public void testSimpleGraph() throws IOException { + Graph g = new Graph(); + + DummyNode start = new DummyNode("start", 0, 1, g); + + DummyNode ifnode = new DummyNode("if", 2, 2, g); + start.setSuccessor(0, ifnode); + + // branch 1 + DummyNode nop = new DummyNode("nop", 0, 1, g); + ifnode.setSuccessor(0, nop); + + // branch 2 + DummyNode a = new DummyNode("a", 0, 1, g); + DummyNode b = new DummyNode("b", 0, 1, g); + DummyNode plus = new DummyNode("+", 2, 1, g); + plus.setInput(0, a); + plus.setInput(1, b); + ifnode.setSuccessor(1, plus); + + DummyNode end = new DummyNode("end", 0, 1, g); + plus.setSuccessor(0, end); + nop.setSuccessor(0, end); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + GraphvizPrinter printer = new GraphvizPrinter(out); + printer.begin("Simple test"); + printer.print(g); + printer.end(); + + int exitCode = GraphvizRunner.process(GraphvizRunner.DOT_LAYOUT, new ByteArrayInputStream(out.toByteArray()), new NullOutputStream(), "xdot"); + assertEquals(0, exitCode); + } + + private static class DummyNode extends Node { + + private final int inputCount; + private final int successorCount; + private final String name; + + public DummyNode(String name, int inputCount, int successorCount, Graph graph) { + super(inputCount, successorCount, graph); + this.name = name; + this.inputCount = inputCount; + this.successorCount = successorCount; + } + + @Override + public Node copy(Graph into) { + return new DummyNode(name, inputCount, successorCount, into); + } + + public void setInput(int idx, Node n) { + inputs().set(idx, n); + } + + public void setSuccessor(int idx, Node n) { + successors().set(idx, n); + } + + @Override + protected int inputCount() { + return super.inputCount() + inputCount; + } + + @Override + protected int successorCount() { + return super.inputCount() + successorCount; + } + + @Override + public String toString() { + return name; + } + } + + private static class NullOutputStream extends OutputStream { + + @Override + public void write(int b) throws IOException { + } + } + +}