文の意味変わらないし、句読点ってなんなん?(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()という関数で文法の正当性を評価していることがわかった。
この関数のc_parser_requireに分け入ってみると、
このような関数になっており、ここがtrueになることがコンパイラを通過するための必要条件になっていることがわかった。
ここで各引数の値をチェックしてみる。trueを返している時の画像が
上であり、この時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!
できた〜!