2011-06-26 9 views
6

Tengo una pregunta relacionada con la fluctuación de LLVM: ¿Puedo obligar a la fluctuación de LLVM a emitir el código nativo en direcciones de memoria continua? y ser PIC? lo que quiero hacer es mover guardar el código JIT en un archivo y cargarlo para su ejecución más adelante ..¿Puede la fluctuación de LLVM emitir el código nativo en las direcciones de memoria de continus?

lo que quiero decir con "carga" es simplemente leer los bits del archivo en el búfer que no quiero para generar duende o algo así

He aquí un ejemplo: Supongamos que tengo fichero fuente C, que contienen:

Global variables 
---------------- 
Function Foo() 
---------------- 
Function Too() 

cuando lo solicite el código JIT Quiero que el JIT para estar en las direcciones de memoria continus:

0x100: Global Vars (take 16 Byte) 
0x110: Foo() Code (take 32 Byte) 
0x130: Too() Code (take 32 Byte) 
0x150: end. 
+0

¿Por qué quieres usar JIT para hacer esto? Parece un trabajo para el compilador regular. ¿Por qué estás evitando ELfs? Crear una biblioteca compartida le ahorrará mucho trabajo. NSAM puede generar [Flat-Form Binary] (http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc6.html) pero dudo que ejecutarlos sea así de fácil. –

+0

no veo soporte completo de elf en LLVM para X86, ¿me equivoco? el segundo problema que si elijo generar elf, necesito un cargador para ejecutar el código, y esto es lo que trato de evitar. el problema es que quiero ejecutar el jit en otro proceso, así que necesito mover el código JIT al proceso de ejecución. – user552285

+0

IIRC, x86 ELF debe ser uno de los generadores de código mejor compatibles, junto con PowerPC. llvm.org parece tener un tiempo de inactividad en este momento, por lo que no puedo verificar. (Editar: Encontradas 2.9 notas de la versión en la caché de Google, busque "problemas conocidos con el servidor x86" y observe qué tan pequeño es: http://webcache.googleusercontent.com/search?q=cache:TRAHCRHR-D8J:llvm .org/releases/2.9/docs/ReleaseNotes.html + llvm + release + notes + 2.9 & cd = 2 & hl = de & ct = clnk & gl = de & source = www.google.de) – delnan

Respuesta

7

Para almacene el código JIT en alguna región de la memoria, puede escribir la versión especial de JITMemoryManager (include/llvm/ExecutionEngine/JITMemoryManager.hlib/ExecutionEngine/JIT/JITMemoryManager.cpp). Hay un ejemplo de MM personalizado de JIM aquí: unittests/ExecutionEngine/JIT/JITTest.cpp, es un RecordingJITMemoryManager que registra las llamadas principales de JIT MM.

Como puedo ver (como LLVM 2.9), ARM JIT tiene isPIC establecido en False y X86 JIT es capaz de generar código PIC.

El mayor problema, parece, es la carga del código precompilado.

Cuestiones relacionadas