LLVM 从 Value\* 返回常量整数

新手上路,请多包涵

我从这样的整数常量创建一个 llvm::Value* :

 llvm::Value* constValue = llvm::ConstantInt::get( llvmContext , llvm::APInt( node->someInt() ));

现在我想找回编译时常量值;

 int constIntValue = constValue->???

LLVM 程序员手册 中显示的示例似乎暗示 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*&)’

这里的正确方法是什么?

原文由 lurscher 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

Given llvm::Value* foo and you know that foo is actually a ConstantInt , I believe that the idiomatic LLVM code approach is to use dyn_cast as follows :

 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 dyn_cast


PS 请注意 castdyn_cast 是 LLVM 自己的 RTTI 实现的一部分。 dyn_cast 行为有点类似于标准 C++ dynamic_cast ,尽管在实现和性能上存在差异(可以在 这里阅读)。

原文由 Eli Bendersky 发布,翻译遵循 CC BY-SA 2.5 许可协议

Eli 的答案很棒,但它缺少最后一部分,即取回整数。完整的图片应该是这样的:

 if (ConstantInt* CI = dyn_cast<ConstantInt>(Val)) {
  if (CI->getBitWidth() <= 32) {
    constIntValue = CI->getSExtValue();
  }
}

当然也可以改成 <= 64 如果 constIntValue 是64位整数等。

正如 Eli 所写,如果您确信该值确实是 ConstInt 类型,您可以使用 cast<ConstantInt> 而不是 dyn_cast

原文由 Oak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题