Я пытаюсь вызвать метод для объекта из моего скомпилированного JIT-кода llvm.Вызов метода из JIT-кода
Я прочитал здесь ответ (Can I bind an existing method to a LLVM Function* and use it from JIT-compiled code?), но мой случай немного отличается, так как мой метод требует аргумента.
Если я все правильно понимаю, мне нужно обернуть мой метод функцией, но как я могу сохранить указатель на мой экземпляр для использования в качестве первого аргумента при вызове?
Вот краткий пример (некоторые несущественные опущен части)
class Foo:
{
public:
Foo();
float getValue(char * name);
};
float fooWrap(Foo *foo, char * name)
{
foo->getValue(name);
}
Foo::Foo()
{
// snipped llvm init stuff
std::vector<llvm::Type*> fun_args;
fun_args.push_back(llvm::Type::getInt8Ty(context)); // Pointer to this instance (pretty sure is wrong)
fun_args.push_back(llvm::Type::getInt8PtrTy(context)); // char array *
llvm::FunctionType *FT = llvm::FunctionType::get(llvm::Type::getFloatTy(context), fun_args, false);
llvm::Function * F = llvm::Function::Create(FT, llvm::Function::ExternalLinkage, "foo", module);
engine->addGlobalMapping(F, &fooWrap);
// later
llvm::Value *instance = llvm::ConstantInt::get(context, llvm::APInt((intptr_t) &this)); // wont compile, can't construct APInt from intptr_t
std::vector<llvm::Value*> args;
args.push_back(instance);
args.push_back(builder.CreateGlobalStringPtr("test"));
builder.CreateCall(F, args);
}
Любая помощь будет принята с благодарностью.
Ах, отлично! Спасибо за вашу помощь! – Shootfast