我扩展了LLVM Kaleidoscope示例以支持字符串。我添加了一个StringExprAST,它具有虚拟Codegen方法impl,如下所示:
Value *StringExprAST::Codegen() {
StringRef r(Val);
return ConstantDataArray::getString(getGlobalContext(), r, false);
}
我正在尝试连接字符串并使用其Codegen方法进行ConcatExprAST。在尝试访问ConstantDataArray中的数据时,我需要将Value *强制转换为ConstantDataArray *以便使用getAsString()方法。
我该怎么做?
感谢您的帮助。
答案 0 :(得分:0)
将Value
的任何子类型转换为另一个子类型的正确方法是cast<>()
,例如:
Value* v = ...
ConstantDataArray* result = cast<ConstantDataArray>(v);
但是,请记住,在您的示例中,您不返回类型为ConstantDataArray
的对象,但返回的返回类型为ConstantDataArray::getString()
,这不一定是{的实例{1}}本身,您只知道它是ConstantDataArray
(例如,它可能是Constant
,而不是ConstantAggregateZero
。
在任何情况下,如果您不确定ConstantDataArray
确实属于特定类型,请先执行v
(或使用the dyn_cast<>()
idiom),然后再执行{isa<>()
1}}。