1

私はllvmが初めてで、小さなllvm IRビルダーを書いています。IRBuilder とこれらすべての Create* 関数を使用して IR を生成します。私がやろうとしているのは、以前に割り当てられたllvm::Valueの値を持つ新しい SSA ローカル変数を作成するロード命令を作成することです。

私が期待していたもの:

%2 = load i32* %1

%2ロード命令の結果と% 1以前に割り当てられた値 (CreateAlloca)

これが私が試したものです:

// Get Ptr from Val
Value* ptr = ConstantExpr::getIntToPtr((Constant*)loc[n],PointerType::getUnqual(builder->getInt32Ty()));

// Générate load instruction with the new Ptr
builder->CreateLoad(ptr);

そして、ここに私が持っているものがあります:

%2 = load i32* null

locは、すべての llvm::Value* を含む配列です

私が間違っていることを教えてください。それとも、私が悪い道を進んでいるのですか?ありがとう。

4

1 に答える 1

1

ConstantExpr::getIntToPtr()定数式を作成します。したがって、実際には、生成しようとしているものは次の IR と同等です。

%2 = load i32* inttoptr (i32 %1 to i32*)

しかし、定数式はその名前からわかるように、定数のみをサポートし %1 は定数ではないため、これは違法です。ConstantExpr::getIntToPtr()それを検証するために最初の引数として aが必要Constantですが、強制的に定数にキャストされた非定数値を渡しました。

非定数整数をポインターに変換する正しい方法は、 を使用することIRBuilder::createIntToPtrです。ただし、前の値 ( loc[n]) は を介し​​て作成されたと言っているので、allocaそれは既にポインターであり、変換を実行する必要はありません。実行するだけですbuilder->CreateLoad(loc[n])

ちなみに、LLVM で値を定数にキャストする適切な方法は、c スタイルのキャストではなくcast<>、 のように を使用することですcast<Constant>(loc[n])

于 2013-05-22T13:38:28.197 に答える