27++'s Report

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


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

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

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



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

さて、前回で"hoge.c"をコンパイルしたときコマンド無しで"hode.out"となるような改造を実装できた。そこで次の目標を立てることにした。

みなさん、こんにちわ

みなさん、こんにちわ。
とで相手に伝わる意味が変わるのだろうか。変わらない。

あくまで句読点は文法上のルールであって意味が通じればいいじゃん!って場面では必要ないのではないか?

これって、C言語でも同じじゃないか??
printf("Hello World");

printf("Hello World")
とで意味変わらないだろ!理解しろよ、gcc

と御託を並べたが、僕はたまに打ち漏らす";"によってコンパイラーに弾かれるとき「許してくれよ〜」ってなり書きなおすのが億劫だなって。

ここで次の目標を
test.c: In function ‘main’:
test.c:5:5: error: expected ‘;’ before ‘}’ token
}
^
このエラーを吐かないようにすること、とした。

具体的には
wrong.c:
int main(){
   printf("Hello World")
}
コンパイラーを通るようにしよう!ということである。

a.out の時と同じでエラーを吐いているところに至るまでデバッグを行い、直前の関数に入っていくことを考えた。

するとdo_spec()関数が-1を返している時にエラーを吐いていることがわかった。do_spec()関数は次の意味不明な文字列を再帰的に処理していた。

spec=0x485410 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)} %{!E:%{!M:%{!MM: %{traditional:%eGNU C no longer supports -traditional without -E} %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \t %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\t cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \t %(cc1_options)} %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\t cc1 %(cpp_unique_options) %(cc1_options)}}} %{!fsyntax-only:%(invoke_as)}}}}")

do_spec()の引数の一つが"as %(asm_options) %m.s %A"となった時にプログラミングは落ちており、そのとき呼び出される関数に繰り返し入って行くとexecute() gcc.c:2899→pex_run()関数→obj->func->exec_child()関数→vfork()でエラーメッセージを吐いていることが発覚したが、その中身はアセンブリだった…
\(^o^)/オワタ