27++'s Report

東京大学で行われた「大規模ソフトウェアを手探る」実験においてgccコンパイラーに機能の追加を行った。その際の奮闘を描いた日記(風レポート)。


このブログには東京大学電子情報・電気電子工学科にて行われた「外規模ソフトウェアを手探る」実験において使用の変更、追加を行ったgccについて書かれています。実験日に沿った日記風レポートとなっていますが、実際の進捗とブログの進捗には多少の差があることをここに断らせていただきます。
行ったことは"-o"オプションなしでhoge.cをコンパイルしたときhoge.outとなる変更、及び文末の";"の抜けを自動で補填する変更である。

まとめ(変更箇所の紹介記事リンクとgccの仕組み)

手探るgccのソースコードのダウンロード方法(初日)



文の意味変わらないし、句読点ってなんなん?(2)

さて、前回アセンブリの領域に入ってしまい詰んでしまったように思われたがエラーを吐いている関数obj->func->exec_child()の引数に実行可能ファイルcc1が入っていることがわかった。
ここで/home/denjo/gcc_install/libexec/…/cc1をデバッグすることにした。与える引数は、"$ ./gcc -v wrong.c"で確認したところ
/home/denjo/repo/lecture_doss/gcc_install/libexec/gcc/x86_64-pc-linux-gnu/6.2.0/cc1 -quiet -v -imultiarch x86_64-linux-gnu test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -o /tmp/ccrITzFM.s

であることがわかった。

cc1をデバッグしていくとdo_compileなどという関数に入り、デバッグを続けていくとc_parser_skip_until_found()という関数で文法の正当性を評価していることがわかった。
f:id:bigsoftExp:20161201143741p:plain
この関数のc_parser_requireに分け入ってみると、 f:id:bigsoftExp:20161201143853p:plain
このような関数になっており、ここがtrueになることがコンパイラを通過するための必要条件になっていることがわかった。

ここで各引数の値をチェックしてみる。trueを返している時の画像が
f:id:bigsoftExp:20161201145347p:plain
上であり、この時parser[0]->tokens[0]->typeとtypeを比較して、合致している時にtrueを返していることがわかった。

ちなみに落ちた時には parser[0]->tokens[0]->type=CPP_KEYBOARDS(?) みたいな感じだった。

というわけで文末の";"がないときにもあることにしちゃうためには
if(type=CPP_SEMICOLON){return ture;}
の一文を加えてやればいいのでは?という淡い期待を乗せて変更、makeしたところ…

$ ./gcc wrong.c
$ ./wrong.out
Hello World!
できた〜!