在我通过LLVM C ++ API生成的一些代码中,有一段时间我给了一个函数的原始地址。我将其转换为函数指针并按如下方式调用它:
llvm::FunctionType* ft = llvm::FunctionType::get(...);
llvm::Constant* iptr = llvm::ConstantInt::get(
engine->getDataLayout()->getIntPtrType(state.context, 0), (uint64_t) pointer);
llvm::Value* fptr = llvm::ConstantExpr::getIntToPtr(iptr,
llvm::PointerType::get(ft, 0));
llvm::Value* retval = state.builder.CreateCall(fptr, params);
这很好用--- 但是我希望能够设置一些函数属性来帮助优化:具体来说,readnone
。
不幸的是,我发现这样做的唯一API就是llvm::Function
,而我没有。我希望属性是函数类型的属性,因为它在C中的工作方式,但llvm::FunctionType
似乎没有属性API。
有关如何执行此操作的任何建议吗?
答案 0 :(得分:2)
您可以通过CallInst
API(以及CallInst::addAttribute
的相似内容)使用任何功能属性注释InvokeInst
。这意味着如果您计划通过一个readnone
指针和一个不指针的指针调用,则需要拥有不同的调用站点。