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

ログインするとコメントできます