2011-12-04 19 views
10

Mevcut bir AST'den IR oluştururken, AST'm bazı dize değerlerine sahiptir (derleme zamanında std::string'dan derlenmiştir) ve bunları bir ifadenin parçası olarak kullanmak için llvm::Value olarak güvenli bir şekilde ayarlamak istiyorum.LLVM String Değer nesneleri: Dize'yi bir Değerden nasıl alabilirim?

Bu durumda, dize değerleri yalnızca derleme zamanında değişkenler, işlevler veya sınıflar olarak şeyler çözüleceği anlamına geldiğinden, çalışma zamanında dizeye bağlanmam gerekmez. dize türü).

nedir llvm::Value ve olarak benim dize içerik tutmak için en iyi yolu hala (yuvalama ifadeler inşa edilir) derleme ileriki aşamalarında geri almak mümkün?

Daha somut olarak, beraber llvm::Value ayarlarsanız:

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

güvenli olarak nasıl dize değeri geri alabilirim? llvm::ConstantArray dizeleri sarmanın uygun yolu mu? C kodu char *x = "asdf"; üzerinde http://llvm.org/demo/ Running

cevap

5

Evet, ConstantArray burada kullanmanız gereken şeydir. Daha sonra değeri almak için sadece ConstantArray :: getAsCString() kullanın. Eğer iddialarınız açıksa, bir şeyler ters giderse (örneğin, diziyi sıfır sonlandırıcı ile diziden yakalamaya çalışacaksınız) ileri sürecektir.

3

verir:

Temelde
@.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 

, bir dize adresini almak için, bunu içeren bir küresel oluşturmak zorunda. Bunun nasıl yapılacağını bulmakta zorlanıyorsanız, C++ API çağrıları vermek için http://llvm.org/demo/'u değiştirebilirsiniz.

İlgili konular