使用c ++ api将c ++回调函数转换为llvm

时间:2013-07-09 05:31:47

标签: c++ callback llvm llvm-c++-api

我想使用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​​可以这样吗?

我真的很感激任何想法。

谢谢

1 个答案:

答案 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);