2013-04-20 41 views
0

我擴展了LLVM Kaleidoscope示例以支持字符串。我添加了一個StringExprAST,它具有虛擬代碼生成方法IMPL如下:如何在LLVM中將值*轉換爲ConstantDataArray *

Value *StringExprAST::Codegen() { 
    StringRef r(Val); 
    return ConstantDataArray::getString(getGlobalContext(), r, false); 
} 

我試圖連接字符串,並與它的代碼生成方法ConcatExprAST。在嘗試訪問ConstantDataArray中的數據時,爲了使用getAsString()方法,我需要將Value *轉換回ConstantDataArray *。

我該怎麼做?

感謝您的任何幫助。

+0

不是'cast (v)'工作嗎? – Oak 2013-04-20 20:10:53

+0

if(ConstantDataArray * cda = dyn_cast (v)){ StringRef r = cda-> getAsString(); – 2013-04-20 21:45:39

+0

ConstantDataArray * cda = cast (v);拋出此錯誤:斷言失敗:(isa (Val)&&「cast ()argument of incompatible type!」),function cast,file /Users/rcatlin1/lldb/llvm/include/llvm/Support/Casting.h,第208行。 – 2013-04-20 22:03:50

回答

0

投的Value任何亞型到另一個正確的方法是通過cast<>(),如:

Value* v = ... 
ConstantDataArray* result = cast<ConstantDataArray>(v); 

但是,請記住,在你的榜樣,你不回ConstantDataArray類型的對象,但你返回返回類型爲ConstantDataArray::getString()的東西,它不一定是ConstantDataArray本身的一個實例,您只需要知道這是一個Constant(例如,它可能是ConstantAggregateZero,它不是ConstantDataArray)。

在任何情況下,如果你不知道,v是一種特定類型的確實,與isa<>()首先檢查它(或使用the dyn_cast<>() idiom),執行cast<>()之前。

+0

cast (v)確實有效。問題原來是我的輸入數據。感謝以上有關ConstantAggregateZero的信息。 – 2013-04-25 18:35:50