【问题标题】:llvm createCall Calling a function with a bad signaturellvm createCall 调用签名错误的函数
【发布时间】:2016-12-18 10:41:41
【问题描述】:

我想在 LLVM 中创建一个函数,它是一个只有函数调用 foo(idx, mn) 的适配器。 foo的函数原型是void foo(unsigned char, const char*)

// adapter Function with only a function call foo(idx, mn)
llvm::Function* createCallFun(llvm::Module* M, llvm::Function* exit_f) {

    llvm::LLVMContext& Ctx = M->getContext();
    llvm::Function* foo_f = foo_prototype(Ctx, M);

    llvm::Constant* c = M->getOrInsertFunction("__call_fun", FunctionType::getVoidTy(Ctx), llvm::Type::getInt32Ty(Ctx), llvm::Type::getInt32Ty(Ctx), NULL);
    llvm::Function* call_fun_f = llvm::cast<llvm::Function>(c);

    llvm::BasicBlock* entry = llvm::BasicBlock::Create(llvm::getGlobalContext(), "entry", call_fun_f);
    llvm::IRBuilder<> builder(entry);

    llvm::Function::arg_iterator args = call_fun_f->arg_begin();
    llvm::Value* idx = &*args++;
    idx->setName("idx");
    llvm::Value* mn = &*args++;
    mn->setName("mn");
    llvm::Value* greater = builder.CreateICmpSGE(idx, mn, "tmp");

    std::vector<llvm::Value*> fun_args;
    fun_args.push_back(greater);
    fun_args.push_back(err_msg);
    builder.CreateCall(foo_f, fun_args);

    return call_fun_f;
}

然后我得到了这个错误:

lib/IR/Instructions.cpp:245: void llvm::CallInst::init(llvm::FunctionType*, llvm::Value*, llvm::ArrayRef, llvm::ArrayRef >, const llvm::Twine& ): 断言 `(i >= FTy->getNumParams() || FTy->getParamType(i) == Args[i]->getType()) && “调用带有错误签名的函数!”' 失败。

似乎 foo 的第一个参数类型不匹配。如何将 Value greater 转换为 unsigned char 类型?

【问题讨论】:

    标签: llvm


    【解决方案1】:

    我通过使用CreateZExt 强制转换greater 修复了这个错误。

    llvm::Value *castuchar =
        builder.CreateZExt(greater, llvm::Type::getInt8Ty(Ctx), "tmp1");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多