首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用带有错误签名的函数的llvm createCall

调用带有错误签名的函数的llvm createCall
EN

Stack Overflow用户
提问于 2016-12-18 10:41:41
回答 1查看 1.4K关注 0票数 1

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

代码语言:javascript
运行
复制
// 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::CallInst::init(llvm::FunctionType*,llvm::Value*,llvm::ArrayRef,llvm::ArrayRef >,const llvm::Twine&):断言`(i >= FTy->getNumParams() \ FTy->getParamType(i) == Argsi->getType()) &“调用带有错误签名的函数!”失败。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 12:55:29

我通过使用greaterCreateZExt强制转换来修正这个错误。

代码语言:javascript
运行
复制
llvm::Value *castuchar =
    builder.CreateZExt(greater, llvm::Type::getInt8Ty(Ctx), "tmp1");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41207523

复制
相关文章

相似问题

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