LLVM:如何将CreateCall参数设置为BasicBlock名称?

时间:2019-01-20 18:08:18

标签: c++ llvm llvm-clang llvm-c++-api

我想创建一个外部函数调用,并且该函数正在获取intconst char*(特别是基本块名称,而不是自定义字符串)作为参数(或使用std::string也可以)。

但是我不知道将函数参数设置为const char*还是std::string。我唯一意识到的是 string 在LLVM中被视为Int8PtrTy

  LLVMContext &ctx = F->getContext();
  Constant *countfunc = F->getParent()->getOrInsertFunction(
        "bbexectr", Type::getVoidTy(ctx), Type::getInt32Ty(ctx), Type::getInt8PtrTy(ctx));

  for (Function::iterator ibb = ifn->begin(); ibb != ifn->end(); ++ibb)
  {
    BasicBlock *B = &*ibb;

    IRBuilder<> builder(B);
    builder.SetInsertPoint(B->getTerminator());

    std::string str = B->getName().str();
    const char* strVal = str.c_str();

    Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
    builder.CreateCall(countfunc, args);

我尝试了上层代码,但它给了我如下错误消息。

error: cannot convert ‘llvm::PointerType*’ to ‘llvm::Value*’ in initialization
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};

有什么办法可以解决该错误,还是有更好的方法将函数参数设置为基本块名称

1 个答案:

答案 0 :(得分:3)

LLVM中的类型和值不同。 llvm :: Type代表类型,而llvm :: Value代表值。由于Type和Value属于不同的类层次结构,因此无法使用llvm :: Type层次结构的子类来初始化llvm :: Value * args []。您可能想做的就是更改

Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};

收件人

 llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
 llvm::Value *args[] = {builder.getInt32(index), strVal};

CreateGlobalStringPtr()将创建一个全局字符串,并返回一个Int8PtrTy类型的指针。