llvmでは、特定のレジスタの値を定義する命令までさかのぼることができますか?たとえば、次のような指示がある場合:
%add14 = add i32 %add7, %add5
add5が定義されている命令までさかのぼる方法はありますか?
llvmでは、特定のレジスタの値を定義する命令までさかのぼることができますか?たとえば、次のような指示がある場合:
%add14 = add i32 %add7, %add5
add5が定義されている命令までさかのぼる方法はありますか?
まず、LLVM IRにはレジスタがありません。名前に含まれているものはすべて%
、値の名前にすぎません。それらの中に情報を保存することはありません。それらは変数やメモリの場所ではなく、単なる名前です。これをさらに説明するのに役立つSSAフォームについて読むことをお勧めします。
いずれにせよ、あなたがする必要があるのは、getOperand(n)
そのn番目のオペランドを取得するために命令のメソッドを呼び出すことです-たとえば、getOperand(0)
あなたの例では、という名前の値を返します%add7
。次に、その型()をチェックすることにより、その値が実際に命令であるかどうかをチェックできます(たとえば、関数の引数ではありませんisa<Instruction>
)。
強調すると、getOperand
メソッドを呼び出すと、オペランドが定義されている実際の場所がわかります。他に何も必要ありません。