首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将CreateCall参数设置为BasicBlock名称?

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

Stack Overflow用户
提问于 2019-01-20 18:08:17
回答 1查看 1.4K关注 0票数 3

我想要创建一个外部函数调用,这个函数将参数作为intconst char*(特别是BASICBLOCK名称,而不是自定义字符串)(或者std::string可以很好)。

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

代码语言:javascript
复制
  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);

我尝试了上面的代码,但是它给了我一条错误消息,如下所示。

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

是否有任何解决错误的方法,或者是否有更好的方法将函数参数设置为基本块名

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-20 23:52:39

LLVM中的类型和值是不同的。类型表示类型,而llvm::Value表示值。因为类型和值属于不同的类层次结构,所以llvm::Value *args[]不能用llvm::Type层次结构的子类初始化。你可能想要做的是改变

代码语言:javascript
复制
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};

代码语言:javascript
复制
 llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
 llvm::Value *args[] = {builder.getInt32(index), strVal};

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54279398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档