#!/usr/bin/perl -w # # Simple script to visualize GCC RTL dumps using graphviz. # by Clifford Wolf # # Example: # echo 'extern int a[100], b, c; void demo() { a[b] = c+1; }' > demo.c # gcc -c -da demo.c # for x in demo.c.*; do # perl rtl2dot.pl $x > $x.dot # dot -Tps $x.dot -o $x.ps # done my $input=" "; my @tokens=(); while (<>) { chomp; next unless /^[(\s]/; $input .= $_; } $input =~ s/([\(\)\[\]])/ $1 /g; push(@tokens, $1) while $input =~ s/^([^\"]\S*|\"[^"]*\")\s*//; my $node_i = 0; sub parser($); sub parser($) { my $basenode = $node_i; while (1) { my $tok = shift @tokens; die "got EOF in depth $_[0]" unless defined $tok; next if $tok eq ""; if ( $tok eq "(" or $tok eq "[" ) { print "\tnode$basenode -> node$node_i;\n"; unshift @tokens, "[...]" if $tok eq "["; parser($_[0] + 1); } elsif ( $tok eq ")" or $tok eq "]" ) { return; } else { print "\tnode$basenode -> node$node_i;\n" if $node_i != $basenode; $tok =~ s/\\/\\\\/g; $tok =~ s/"/\\"/g; print "\tnode$node_i [ label=\"$tok\" ];\n"; $node_i++; } } } print "digraph \"GCC Dump Graph\" {\n"; while ($#tokens >= 0) { while ($_ = shift @tokens) { last if $_ eq "("; } parser(1) if $#tokens >= 0; } print "}\n";