3

LLVM で 2 つの基本ブロックの間にブロックを挿入したいと考えています。たとえば、基本ブロック A が基本ブロック B にジャンプしている場合、A が C にジャンプし、C が B にジャンプするように、それらの間に基本ブロック C を挿入したいと考えています。ターゲット B が C に置き換えられるように、基本ブロック A の終了命令を変更する必要があるという基本的な考えはありますが、その間に新しい基本ブロック C を追加するにはどうすればよいですか?

4

2 に答える 2

4

はい、基本ブロック A の終了命令を変更 (または置換) する必要があります。たとえば、分岐の場合は、BranchInst::setSuccessor(). 次に、基本ブロック C を作成し、その終了命令が B にジャンプするようにします。これにより、ブロックが中間になります。

必要なのは、ターミネーターのターゲットを変更することだけです。メモリ内のブロックの順序を並べ替える必要はありません。

ただし、心配する必要がある 2 つの特別な指示があることに注意する必要があります - ファイ ノードとランディング パッドです。

  • ファイ ノードは、ブロックの直前の先行ノードのみを参照します。つまり、A と B の間に C を挿入する場合は、B のすべての phi ノードを削除するか、A ではなく C を参照するようにして修正する必要があります。

  • B がランディングパッド ブロック (ランディングパッド命令を含む) である場合、invoke 命令のアンワインド ターゲットから直接ジャンプすることのみが正当です。A から B へのジャンプがアンワインド ターゲットを通過する場合、C 自体をランディング パッドにして B からランディング パッドを削除しない限り、間に基本ブロックを追加することはできません。

于 2012-11-08T07:37:52.890 に答える