我想使用c ++ api将c回调函数转换为llvm函数。 我的示例c ++函数如下所示。
extern "C" void bindMe(int(*compare)(const int a))
{
llvm::LLVMContext& context = llvm::getGlobalContext();
llvm::Module *module = new llvm::Module("top", context);
llvm::IRBuilder<> builder(context);
//I want to create the corresponding llvm function here which is called compareLLVM
llvm::BasicBlock *entry = llvm::BasicBlock::Create(context, "entrypoint", compareLLVM);
builder.SetInsertPoint(entry);
module->dump();
}
基本上我想将bindMe函数的参数(一个c回调函数)转换为相应的llvm函数。使用API可以这样吗?
我真的很感激任何想法。
谢谢
答案 0 :(得分:2)
compare
是指向函数的已编译代码所在的指针。那里没有源代码 - 事实上,它甚至可能没有从C编译 - 因此LLVM没有太多可以用它做,并且你不能将它转换为LLVM Function
对象。
你可以做的是插入对该函数的调用:从Value
指针创建一个LLVM compare
,将其强制转换为适当的类型,然后创建一个调用将该铸造指针作为函数的指令。使用API插入此类调用将类似于:
Type* longType = Type::getInt64Ty(context);
Type* intType = Type::getInt32Ty(context);
Type* funcType = FunctionType::get(intType, intType, false);
// Insert the 'compare' value:
Constant* ptrInt = ConstantInt::get(longType, (long long)compare);
// Convert it to the correct type:
Value* ptr = ConstantExpr::getIntToPtr(ptrInt, funcType->getPointerTo());
// Insert function call, assuming 'num' is an int32-typed
// value you have already created:
CallInst* call = builder.CreateCall(ptr, num);