Я хочу перевести функцию обратного вызова c в функцию llvm, используя API 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?
Я буду очень признателен за любые идеи.
Спасибо
compare
указатель на то, где находится скомпилированный код функции. Там нет исходного кода — на самом деле, он даже не был скомпилирован из C — поэтому с ним LLVM мало что может сделать, и вы не можете преобразовать его в LLVM Function
объект.
Что ты Можно сделать, это вставить вызов этой функции: создать LLVM Value
От этого 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);
Других решений пока нет …