2013-04-03 5 views
6

構造体型のLLVM値を作成しようとしています。私はLLVM-Cインタフェースを使用して機能を見つけるよ:LLVM構造体の値を作成する方法は?

store { i32, i32, i32 } { i32 1, i32 2, i32 3 }, { i32, i32, i32 }* %17, align 4 

しかし:すべてのメンバーがLLVMConstXXX(によって作成された一定の値である場合に

LLVMValueRef LLVMConstStruct (LLVMValueRef *ConstantVals, unsigned Count, LLVMBool Packed) 

は、これが正常に動作します)、それはのようなコードを生成しますメンバーが一定でない場合には問題があり、それはのようなものを生成します。

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() 
store { i32, i32, i32 } { i32 1, i32 %0, i32 3 }, { i32, i32, i32 }* %17, align 4 

そして、私はNVVM(NvidiaのPTXのバックエンド)にLLVMコードのこの部分を送信するとき、それは言う:

module 0 (27, 39): parse error: invalid use of function-local name

したがって、この構造体の値の作成が正しいかどうかはわかりません。私が必要とするのは、割り当てられたメモリではなく、値です。

誰でも知っていますか?

よろしく、 翔。

答えて

10

定数構造体は、名前に忠実なリテラルの一種で、一般的な値ではなく他の定数のみを含むことができます。その構造体を生成する正しい方法は、insertvalueです。上記の例では、次のようになります。

%0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() 
%1 = insertvalue {i32, i32, i32} {i32 1, i32 undef, i32 3}, i32 %0, 1 
store { i32, i32, i32 } %1, { i32, i32, i32 }* %17, align 4 
+0

ありがとう!!それは動作します! –

関連する問題