2016-06-18 6 views
2

へのポインタを取得し、私はLLVM-IRにおける文字列型を実装すると、次のように私の計画は次のとおりです。LLVM-IRにおける配列の最初の要素

文字列変数が宣言されると、I8にメモリを割り当てます* 。

変数が初期化されると、その文字列をどこかに格納し、最初に割り当てられたアドレスの最初の要素にポインタを格納し、文字列の長さをメンバ変数に保存します。

問題は、最初の要素へのポインタを取得できないということです。 IRBuilder(C++ API)を使用して は、私はまだ、次のコードを作成しました:

%str2 = alloca i8* 
    %1 = alloca [4 x i8] 
    store [4 x i8] c"foo\00", [4 x i8]* %1 
    %2 = getelementptr [4 x i8], [4 x i8]* %1, i32 0 
    store [4 x i8]* %2, i8** %str2 

しかし、これにLLCを呼び出すと、次のエラーを与える:

error: stored value and pointer type do not match 
    store [4 x i8]* %2, i8** %str2 
     ^

にLLVM-IRを発するように打ち鳴らすを使用して

%str2 = alloca i8*, align 8 
store i8* %str, i8** %1, align 8 
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8** %str2, align 8 

これはimhoと非常によく似ていますが、同じではありません。次のコードは、文字列の代わりに同じchar(char *文字列)コードです。

Clangは文字列をグローバル定数にします(うまくいけば必要ありません).getelementptrのオフセットパラメータを使用し、タイプi8 *をストア命令に渡します。

残念ながら、ストア命令に明示的に型を渡すためのAPIメソッドを見つけることができませんでした。オフセットパラメータを使用しました(これは助けにもならないでしょう)。

最終的に私の質問は:最初の配列要素へのポインタを適切に取得して保存するにはどうすればよいですか?

コメント内のリンクの場合と同様に、事前

+0

保存する方法については、ここで答えをチェックスタック上の文字列http://stackoverflow.com/questions/37101965/create-local-string-using-llvm/37103913#comment61836647_37103913 –

+0

研究の時間と私はそれを見つけられませんでした。私をそこに向かわせてくれてありがとう! – Ragnar1349

答えて

0

のおかげでは、解決策はI8に[NXのI8] *をbitcastすることです*

%str2 = alloca i8* 
%1 = alloca [4 x i8] 
store [4 x i8] c"foo\00", [4 x i8]* %1 
%2 = bitcast [4 x i8]* %1 to i8* 
store i8* %2, i8** %str2 
関連する問題