Связывание кода JIT LLVM с внешними функциями C ++

Я пишу механизм сценариев LLVM, который JIT компилирует код сценариев на пользовательском языке. Моя проблема в том, что я не могу вызывать внешние функции (даже функция C99 erf () не работает).

Например, если я извлекаю «C» из функции erf,

extern "C" double erft(double x){
return erf(x);
}

и создаю функцию с внешней связью

std::vector<const Type*> Double1(1,Type::getDoubleTy(getGlobalContext()));
FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),Double1,false);
Function *erft = Function::Create(FT,Function::ExternalLinkage,"erft",TheModule);

получаю следующее сообщение об ошибке при запуске моего скрипта с erft (0.0):

LLVM ERROR: Программа использовала внешнюю функцию erft, которую не удалось разрешить!

Выполнение сопоставления вручную,

void ExecutionEngine::addGlobalMapping( const GlobalValue *  erfF, void *  erft); 

приведет к следующей ошибке:

объявление `void llvm :: ExecutionEngine :: addGlobalMapping (const llvm :: GlobalValue *, void *) 'вне класса не является определением

Очевидно, я делаю что-то очень не так. Любая помощь будет принята с благодарностью

18
задан Reese Moore 13 December 2010 в 04:30
поделиться