перевод функции обратного вызова c ++ в llvm с использованием API c ++

Я хочу перевести функцию обратного вызова 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?

Я буду очень признателен за любые идеи.

Спасибо

2

Решение

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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]