llvm jit llvm-ir

Llama LLVM Jit desde el programa c



llvm-ir (3)

He generado un archivo bc con el compilador en línea en llvm.org, y me gustaría saber si es posible cargar este archivo bc desde un programa ac o c ++, ejecutar el IR en el archivo bc con el jit llvm (mediante programación el programa c), y obtener los resultados.

¿Cómo puedo lograr esto?


Aquí hay un código de trabajo basado en el de Nathan Howell:

#include <string> #include <memory> #include <iostream> #include <llvm/LLVMContext.h> #include <llvm/Target/TargetSelect.h> #include <llvm/Bitcode/ReaderWriter.h> #include <llvm/ExecutionEngine/ExecutionEngine.h> #include <llvm/ModuleProvider.h> #include <llvm/Support/MemoryBuffer.h> #include <llvm/ExecutionEngine/JIT.h> using namespace std; using namespace llvm; int main() { InitializeNativeTarget(); llvm_start_multithreaded(); LLVMContext context; string error; Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error); ExecutionEngine *ee = ExecutionEngine::create(m); Function* func = ee->FindFunctionNamed("main"); typedef void (*PFN)(); PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func)); pfn(); delete ee; }

Una rareza fue que sin la inclusión final, ee es NULL. Extraño.

Para generar mi tst.bc, usé http://llvm.org/demo/index.cgi y la herramienta de línea de comandos llvm-as.


Desde la línea de comandos, puede usar el programa llvm lli para ejecutar un archivo bc. Si el archivo está en lenguaje ensamblador LLVM, primero deberá ejecutar llvm-as para crear un archivo de código de bits binario.

Es fácil hacer esto desde C. Le recomiendo que consulte la extensa documentación de LLVM: http://llvm.org/docs

El canal de irv LLVM, que tiene un enlace en esa página, está lleno de personas muy conocedoras que están dispuestas a responder preguntas.

Lo siento por la respuesta indirecta. Utilizo LLVM extensivamente, pero hago la generación directa de código no solo a tiempo.


Esto debería (más o menos) funcionar usando LLVM 2.6. Parece que hay más funciones de ayuda en SVN para crear un ModuleProvider perezoso sobre un archivo de código de bits. Sin embargo, no he intentado compilarlo, solo pegué algunos bits de una de mis aplicaciones JIT.

#include <string> #include <memory> #include <llvm/Bitcode/ReaderWriter.h> #include <llvm/ExecutionEngine/ExecutionEngine.h> #include <llvm/ModuleProvider.h> #include <llvm/Support/MemoryBuffer.h> #include <llvm/ExecutionEngine/JIT.h> using namespace std; using namespace llvm; int main() { InitializeNativeTarget(); llvm_start_multithreaded(); LLVMContext context; string error; auto_ptr<MemoryBuffer> buffer(MemoryBuffer::getFile("bitcode.bc")); auto_ptr<Module> module(ParseBitcodeFile(buffer.get(), context, &error)); auto_ptr<ModuleProvider> mp(new ExistingModuleProvider(module)); module.release(); auto_ptr<ExecutionEngine> ee(ExecutionEngine::createJIT(mp.get(), &error)); mp.release(); Function* func = ee->getFunction("foo"); typedef void (*PFN)(); PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func)); pfn(); }