Wednesday 14 September 2016

20日ぶりにコンパイラのバグが取れた

最適化すると動かないという問題だったので、そもそも、

* どの部分でバグってるのかがわからない

stackが絡んでいて、stackから取り出した値が変で落ちるみたいな感じなので、stackに入れる時には何も文句言わないし。しかも、

* stackに入れた値自体は正しい

おいおい。まったくわからないです。で、

* Code Segement の間全部に script で ldb の break point を書けた

これで、どこで最適化されたものとそうでないものとの動作の違いが出るかを trace の差で見つけるわけだ。Parallel Debug と自分で呼んでるんですか。

これで、ようやっとわかりました。局所変数の初期化のコードが出てない。不要なものだと思って削除されているわけね。最適化しなければ削除されないわけだ。

で、LLVM IRの方を見てみると、普通のfunction call の直前に call lifetime.end が出てる。いや、それは tail call な CbC goto の時にだけしかやっちゃいけないのだよ。それで使ってないと見なされたな。確かにチェックのコードがぬけてました。これで解決。

生成されたコードの不具合を見つけるのに19日で、コンパイラをなおすのは1日だった。まぁ、だいたい、そんなものだよな。

No comments: