Как вызвать указатель, указывающий на функцию C

У меня есть указатель на функцию, которую мне нужно вызвать, минуя llvm::Module::getOrInsertFunction. Этот пример не работает:

static int add(int x, int y);
llvm::Value *one, *two;

llvm::Constant* addfn 
   = llvm::ConstantInt::get(JB->getIntPtrTy(DataLayout), (intptr_t)add); 
llvm::Type* args[] = { Int32Ty, Int32Ty };
llvm::FunctionType* ftype = llvm::FunctionType::get(Int32Ty, args);
addfn = llvm::ConstantExpr::getPointerCast(addfn, ftype);
CreateCall(addfn, one, two);

Есть ли способ? Или я должен вызвать getOrInsertFunction?


person cktan    schedule 25.10.2014    source источник


Ответы (1)


Похоже, это работает:

static int add(int x, int y) { return x + y; }

llvm::Constant* addfn 
  = llvm::ConstantInt::get(Builder->getIntPtrTy(DataLayout), (intptr_t)add);
llvm::FunctionType* ftype = 0;
{
    llvm::Type* args[] = { Int32Ty, Int32Ty };
    ftype = ftype->get(Int32Ty, args);
}
llvm::Constant* pp 
  = llvm::ConstantExpr::getIntToPtr(addfn, llvm::PointerType::getUnqual(ftype));
addfn = llvm::ConstantExpr::getPointerCast(pp, ftype->getPointerTo());
jit_value_t sum = JB->CreateCall2(addfn, Value1, Value2);
person cktan    schedule 28.10.2014