LLVM 从 Value* 返回常量整数
Posted
技术标签:
【中文标题】LLVM 从 Value* 返回常量整数【英文标题】:LLVM get constant integer back from Value* 【发布时间】:2011-03-15 16:58:06 【问题描述】:我从这样的整数常量创建一个 llvm::Value*:
llvm::Value* constValue = llvm::ConstantInt::get( llvmContext , llvm::APInt( node->someInt() ));
现在我想取回编译时常量值;
int constIntValue = constValue->???
LLVM Programmer manual 中显示的示例似乎暗示 cast 在使用类型(而不是类型加指针)模板参数时将接受指针,但我很确定从 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*&)’
这里的正确方法是什么?
【问题讨论】:
【参考方案1】:Eli 的答案很棒,但它缺少最后一部分,即取回整数。完整的图片应该是这样的:
if (ConstantInt* CI = dyn_cast<ConstantInt>(Val))
if (CI->getBitWidth() <= 32)
constIntValue = CI->getSExtValue();
当然,如果constIntValue
是64位整数等,你也可以改成<= 64
。
正如 Eli 所写,如果您确信该值确实属于 ConstInt
类型,则可以使用 cast<ConstantInt>
而不是 dyn_cast
。
【讨论】:
【参考方案2】:鉴于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
并且准备好被断言失败(如果不是),您可以使用 cast
而不是 @ 987654330@.
附:请注意 cast
和 dyn_cast
是 LLVM 自己的 RTTI 实现的一部分。 dyn_cast
的行为有点类似于标准 C++ dynamic_cast
,但在实现和性能方面存在差异(read here 也可以)。
【讨论】:
根据你提供的链接,如果指针没有指向预期的类型,则cast
会导致断言失败,dyn_cast
会返回0,而不是相反.
如何检测这个ConstantInt是有符号还是无符号?以上是关于LLVM 从 Value* 返回常量整数的主要内容,如果未能解决你的问题,请参考以下文章
llvm CreateZExt, Value,CallInst