我从一个整数常量创建一个llvm :: Value *,如下所示:
llvm::Value* constValue = llvm::ConstantInt::get( llvmContext , llvm::APInt( node->someInt() ));
现在我想要检索编译时常量值;
int constIntValue = constValue->???
LLVM Programmer manual中显示的示例似乎意味着强制转换<>在使用类型(而不是类型加指针)模板参数时会接受指针,但是我很确定从2.8开始失败:
llvm::Value* foo = 0;
llvm::ConstantInt* intValue = & llvm::cast< llvm::ConstantInt , llvm::Value >(foo );
//build error:
//error: no matching function for call to ‘cast(llvm::Value*&)’
这里的正确方法是什么?
答案 0 :(得分:32)
Eli的答案很棒,但它缺少最后一部分,即整数回归。全貌应如下所示:
if (ConstantInt* CI = dyn_cast<ConstantInt>(Val)) {
if (CI->getBitWidth() <= 32) {
constIntValue = CI->getSExtValue();
}
}
当然,如果<= 64
是64位整数等,您也可以将其更改为constIntValue
。
正如Eli所写,如果您确信值的确属于ConstInt
类型,则可以使用cast<ConstantInt>
代替dyn_cast
。
答案 1 :(得分:26)
鉴于llvm::Value* foo
并且您知道foo
实际上是ConstantInt
,我相信惯用的LLVM代码方法是使用dyn_cast
,如下所示:
if (llvm::ConstantInt* CI = dyn_cast<llvm::ConstantInt>(foo)) {
// foo indeed is a ConstantInt, we can use CI here
}
else {
// foo was not actually a ConstantInt
}
如果您完全确定 foo
是ConstantInt
并准备好在断言失败的情况下被击中,则可以使用{{ 1}}而不是cast
。
P.S。请注意dyn_cast
和cast
是LLVM自己的RTTI实现的一部分。 dyn_cast
的行为与标准C ++ dyn_cast
有些相似,但实现和性能存在差异(可能是read here)。