GCCのGENERICを可視化する

GCCのGENERICをGraphvizで可視化する。

https://gist.github.com/tonyseek/4161012

からコードを拝借する。 以下のように3つファイルを作る。

astviz:

#!/usr/bin/env sh
SCRIPT_PATH=$(dirname $0)
gcc -o $1 $1.c -fdump-tree-original-raw
$SCRIPT_PATH/pre.awk $1.c.* | $SCRIPT_PATH/treeviz.awk > $1.dot
dot -Tpng $1.dot -o $1.png

pre.awk:

#!/usr/bin/env -S gawk -f 
/^[^;]/{
    gsub(/^@/, "~@", $0);
    gsub(/( *):( *)/, ":", $0);
    print;
}

treeviz.awk

#!/usr/bin/env -S gawk -f
#http://alohakun.blog7.fc2.com/?mode=m&no=355
BEGIN {RS = "~@"; printf "digraph G {\n node [shape = record];";}
/^[0-9]/{
s = sprintf("%s [label = \"{%s | {", $1, $1);
for(i = 2; i < NF - 1; i++)
    s = s sprintf("%s | ", $i);
    s = s sprintf("%s}}\"];\n", $i);
    $0 = s;
    while (/([a-zA-Z]+):@([0-9]+)/){
        format = sprintf("\\1 \\3\n %s:\\1 -> \\2;", $1);
        $0 = gensub(/([a-zA-Z]+):@([0-9]+)(.*)$/, format, "g");
    };
    printf " %s\n", $0;
}
END {print "}"}
$ echo "int main() { return 0; }" > a.c
$ ./astviz a

a.png

できた。

ちなみに、 astvizの最後の行を

$SCRIPT_PATH/pre.awk $1.c.* | $SCRIPT_PATH/treeviz.awk | dot -Tx11

にすれば中間ファイルを作らずにウィンドウ上にグラフを表示できて嬉しい。