Open8
Shiika llvm デバッグ
現象
clangでリンクするときに error: Invalid instruction with no BB (Producer: 'LLVM9.0.1' Reader: 'LLVM 9.0.1')
というエラーになる
shiikaが壊れた.bcを生成している?
llvm-disも同じエラーを出すのでその可能性が高そう
調査
.bcを調べたいがllvm-disできないので困った
一方、同時に生成した.llの方はllvm-asできることがわかった
ので、.llをllvm-asで.bcにする→llvm-disで.llに戻す ということをしてみた
diffを取ると確かにあやしい箇所がある
> IfEnd: ; preds = %"Invoke_Int#-@_end", %IfElse
4542a4540,4541
>
> 0: ; No predecessors!
4601c4600
< IfEnd83: ; preds = %IfElse82, %"Invoke_MutableString#append_end"
いや違うか?両方にNo predeccessorsあるな。
んーーでも
br label %End
unreachable
Ret: ; preds = %IfEnd
br label %End
}
が
br label %End
1: ; No predecessors!
unreachable
Ret: ; preds = %IfEnd
br label %End
}
になってるのを見ると、ここが有意な違いなのかもしれない。Invalid instruction with no BB
というエラーメッセージ的にも。
面白いのは.llをllcで.oにしてたときはエラーにならなかったんだよな。効率化のため.bcを吐くようにしたらこうなった。.llだとokだが.bcにするとエラーになるようなIRがあるということか。
えーと、どこでunreachableを生成してるんだっけ。ifかな。
ary.each do
if foo
break
end
end
clauseがNever型だったときにunreachableを入れてるのか。でもbreakがジャンプするんだから要らないような?
あ、panicとかexitを呼んだ場合はunreachableが要るのか。
どう直そうかな。
- a) clauseの最後の式がunconditional jumpかを調べて分岐する
- どうやって調べるんだろ?inkwellでできるかな
- b) メソッド呼び出し側でunreachableを入れるようにする
- つまりif clauseでunreachableを入れるのをやめ、Never型のメソッドを呼んだ後にunreachableを入れるようにする
b)の方向で直した。(未push)
[std-compile faa9cdf] fix: Prevent generating broken .bc