如何检查llvm callInst是否包含bitcast?

时间:2016-10-14 17:58:22

标签: c++ llvm llvm-ir

My llvm ir看起来像这样:

call void bitcast (void (%struct.type1*, %opencl.image2d_t addrspace(1)*, i32, %struct.type1*)* @_Z36functype1 to void (%struct.type2*, %opencl.image2d_t addrspace(1)*, i32, %struct.type1*)*)(%struct.type2* sret %19, %opencl.image2d_t addrspace(1)* %237, i32 %238, %struct.type1* byval %sic_payload)

我想检查调用是实际的函数调用还是带有bitcast的调用。有谁知道怎么做?

我试过了:

const CallInst *pInstCall = dyn_cast<CallInst>(&*it);
if (!pInstCall) continue;
dyn_cast<BitCastInst >(pInstCall->getCalledFunction());

但这似乎不起作用。

1 个答案:

答案 0 :(得分:4)

您正在寻找

if (auto *CstExpr = dyn_cast<ConstantExpr>(it->getOperand(0))) {
  // BitCastInst is an *Instrution*, here you have a *ConstantExpr* Bitcast
  if (CstExpr.isCast()) {
     // do something...
  }
}