LLVM从Value *获得常量整数

时间:2011-03-15 16:58:07

标签: c++ llvm

我从一个整数常量创建一个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*&)’

这里的正确方法是什么?

2 个答案:

答案 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
}

如果您完全确定 fooConstantInt并准备好在断言失败的情况下被击中,则可以使用{{ 1}}而不是cast


P.S。请注意dyn_castcast是LLVM自己的RTTI实现的一部分。 dyn_cast的行为与标准C ++ dyn_cast有些相似,但实现和性能存在差异(可能是read here)。