4

私はCとLLVMを使用していくつかのコードを書いています。私はLLVMGetOperandリターンを知っていますが、それは多くの異なるものである可能性があるLLVMValueRefように思われるので、それが正確に何であるか疑問に思いました。オペランドを作成する命令を返しますかLLVMValueRefLLVMGetOperand

私が最終的に行う必要があるのは、命令オペランドを取得し、値を作成する命令を取得することです。のように

%3 = ADD %1 %2
...
%5 = ADD ...
...
%8 = SUB %3 %5

命令を知っている場合は%8 = SUB %3 %5、オペランドを取得してから%3%5それらの値を使用して命令%3 = ADD %1 %2とを取得し%5 = ADD ...ます。使用する必要がLLVMGetOperand()あることはわかっていますが、何が返されるのか、必要な命令を取得するためにどのように使用するのかわかりません。命令を返しただけならいいですね。

私も調べましたLLVMGetFirstUse()LLVMGetFirstUse()命令を受け取り、その命令が生成する値の最初の使用を返しますか?

私はllvm.orgについて知っていて、それを使用しています。そのWebサイトに記載されているものよりも明確にする必要があります。

4

1 に答える 1

0

CバインディングはC++コードの構造を反映しているため、一般に、C++での処理方法を理解しておくことをお勧めします。開始する場所の1つは、LLVMプログラマーマニュアルです。

あなたValueRefが言及Value*しているのはCコードだけです。マニュアルでの説明は次のとおりです。

このValueクラスは、LLVMソースベースで最も重要なクラスです。これは、(とりわけ)命令のオペランドとして使用できる型付きの値を表します。Values、など、Constantsさまざまな種類があります Arguments。でもInstructionsありFunctions ますValues

さて、基本ブロックを組み立てるために、あなたは通常IRBuilderクラスを使います。Cコードでは、これLLVMBuild*は関数ファミリーに対応します。たとえば、sub命令を作成するための関数のシグネチャは次のとおりです。

LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
                          const char *Name);

最初のパラメーターはIRBuilderオブジェクトへの参照、2番目は最初のオペランド、3番目は2番目のオペランド、最後は結果の値のオプションの名前です。したがって、例は次のようになります(テストされていません)。

/* I'm assuming that you have already created a basic block bb. */
LLVMBuilderRef builder = LLVMCreateBuilder(); 
LLVMPositionBuilderAtEnd(builder, bb);
LLVMValueRef lhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 1, 0), 
    LLVMConstInt(LLVMInt32Type(), 2, 0), NULL);
LLVMValueRef rhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 3, 0), 
    LLVMConstInt(LLVMInt32Type(), 4, 0), NULL);
LLVMBuildSub(build, lhs, rhs, NULL);

に関してLLVMGetFirstUse:与えられたValue、あなたはそれが使用されているすべての場所を反復することができます。インクリメント( )および逆参照( )できる使用リストの先頭を指すLLVMGetFirstUseイテレータ()を提供します。詳細については、を参照してください。LLVMUseRefLLVMGetNextUseLLVMGetUserllvm/Use.h

于 2012-10-30T23:09:05.917 に答える