Estoy escribiendo un motor de scripts de LLVM que JIT compila el código de scripting en un lenguaje personalizado. Mi problema es que no puedo llamar a funciones externas (incluso la función C99 erf() está fallando).Vinculación del código JIT de LLVM a funciones externas de C++
Por ejemplo si extern la función erf "C",
extern "C" double erft(double x){
return erf(x);
}
y crear una función con enlace externo
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);
obtener el siguiente mensaje de error al ejecutar mi script con Erft (0.0):
LLVM ERROR: Program used external function 'erft' which could not be resolved!
Hacer el mapeo manualmente,
void ExecutionEngine::addGlobalMapping(const GlobalValue * erfF, void * erft);
me va a conseguir el error siguiente:
declaration of `void llvm::ExecutionEngine::addGlobalMapping(const llvm::GlobalValue*, void*)' outside of class is not definition
Obviamente estoy haciendo algo muy mal. Cualquier ayuda se agradece mucho
Una advertencia para futuros visitantes: las respuestas se refieren a métodos en desuso ... – antipattern
La respuesta a [esto] (https://stackoverflow.com/questions/48105342/llvm-jit-add-library-to-module) La pregunta muestra cómo hacer esto con métodos no desaprobados. –