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位整数等,你也可以改成&lt;= 64

正如 Eli 所写,如果您确信该值确实属于 ConstInt 类型,则可以使用 cast&lt;ConstantInt&gt; 而不是 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

如果您绝对确定 fooConstantInt 并且准备好被断言失败(如果不是),您可以使用 cast 而不是 @ 987654330@.


附:请注意 castdyn_cast 是 LLVM 自己的 RTTI 实现的一部分。 dyn_cast 的行为有点类似于标准 C++ dynamic_cast,但在实现和性能方面存在差异(read here 也可以)。

【讨论】:

根据你提供的链接,如果指针没有指向预期的类型,则cast会导致断言失败,dyn_cast会返回0,而不是相反. 如何检测这个ConstantInt是有符号还是无符号?

以上是关于LLVM 从 Value* 返回常量整数的主要内容,如果未能解决你的问题,请参考以下文章

提取不重复的整数

llvm CreateZExt, Value,CallInst

在 LLVM IR 中,将整数存储到向量的第二个元素中

llvm CreateZExt, Value,CallInst

如何关闭llvm中的常量折叠优化

如何获取 LLVM 全局变量常量值?