2011-12-04 25 views
10

既存のASTからIRを構築するとき、私のASTには文字列値があります(コンパイル時にはstd::stringから構築されます)。llvm::Valueを式の一部として使用して安全に設定したいと思います。LLVM String Valueオブジェクト:値から文字列を取得するにはどうすればよいですか?

この場合、実行時に文字列値をバインドする必要はありません。文字列値は、コンパイル時に変数、関数、クラスとしての問題を解決するためだけに使用されます(言語ではネイティブ文字列タイプ)。

いただきましllvm::Valueとしての私の文字列の内容を維持するための最良の方法はまだ(ネスティング式が構築されています)コンパイルの後の段階でそれを取得することができ?私はllvm::Valueを設定している場合

より具体的には、:

llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str()); 

にはどうすれば安全に文字列値を取得するのですか? llvm::ConstantArrayは文字列をラップするのに適していますか? Cコードchar *x = "asdf";http://llvm.org/demo/を実行

答えて

5

はい、ConstantArrayはここで使用する必要があります。後で値を取得するには、ConstantArray :: getAsCString()を使用します。アサーションがオンになっていると、何かが間違っている場合にアサートされます(たとえば、ゼロターミネータなしの配列から文字列を取得しようとします)。

3

が与える:

基本的に
@.str = private unnamed_addr constant [5 x i8] c"asdf\00" 
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8 

は、文字列のアドレスを取得するために、あなたはそれを含むグローバル・構築する必要があります。方法を理解する上で問題がある場合は、http://llvm.org/demo/を出力C++ API呼び出しに切り替えることができます。

関連する問題