yhara.jp

Recent Posts

error: Invalid instruction with no BB

2021-10-01
Tech

自作言語の開発中、LLVMが以下のメッセージを吐いて死ぬのを調査したメモ。 ./bin/llvm-dis: error: Invalid instruction with no BB (Producer: 'LLVM12.0.1' Reader: 'LLVM 12.0.1')

このメッセージで検索すると lib/Bitcode/Reader/BitcodeReader.cpp がヒット

    if (!CurBB) {
      I->deleteValue();
      return error("Invalid instruction with no BB");
    }

CurBBがnullになるのは?

    // If this was a terminator instruction, move to the next block.
    if (I->isTerminator()) {
      ++CurBBNo;
      CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] : nullptr;
    }

終端命令が来たときらしい。デバッグログを足してみる

    if (I->isTerminator()) {
              dbgs() << "[term] " << I->getOpcodeName() << "\n";
[term] ret
[term] br
[term] br
[term] br
[term] br
(中略)
[term] br
[term] br
[term] br
[term] br
[term] unreachable

ret、br、unreachableとかが終端命令らしい。そういえば.llに

  call void %func69(%Int* %sk_int62, %String* %sk_str63)
  %"::Void" = load %Void*, %Void** @"::Void", align 8
  unreachable

"Invoke_Object#p71":                              ; preds = %MatchEnd
  %addr_vtable72 = getelementptr inbounds %Object, %Object* %main, i32 0, i32 0
  %vtable73 = load i8*, i8** %addr_vtable72, align 8
  %vtable_ptr74 = bitcast i8* %vtable73 to [16 x i8*]*

みたいな箇所があったな。.ll上では正しく見えるが、.bcの方でこのgetelementptrがベーシックブロックに入ってないのかも…(そうであれば.ll吐くときにエラーにしてほしいが)

と思ったが

いろいろやってるうちにここがまずい気がしてきた。

"Invoke_Object#p_end42":                          ; preds = %"Invoke_Object#p34"
  br label %MatchEnd
  br label %MatchClause2_

なんでこうなってるのか

  • MatchEndへ飛ぶのは、「パターンがマッチしたとき」
  • MatchClause2_へ飛ぶのは、「パターンがマッチしなかったとき」

なので、何か変だ。

コードを見返したところ、build_unconditional_branchを多く呼びすぎていたことがわかった。修正したらこのエラーはなくなった。

More posts

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author