Vuelva a compilar un código x86 con LLVM a uno más rápido x86

¿Es posible ejecutar el compilador LLVM con la entrada de código x86 de 32 bits? Hay un algoritmo enorme que no tengo código fuente y quiero que se ejecute más rápido en el mismo hardware. ¿Puedo traducirlo de x86 a x86 con optimizaciones?

Este código se ejecuta durante mucho tiempo, por lo que quiero hacer una recopilación estática del mismo. Además, puedo hacer un perfil de tiempo de ejecución y dar pistas a LLVM, qué ramas son más probables.

El código original está escrito para x86 + x87 y no usa SSE / MMX / SSE2. Después de la recompilación, tiene posibilidades de usar x86_64 y / o SSE3. Además, el código se regenerará de manera más óptima al decodificador de hardware.

Gracias.

preguntado el 08 de enero de 11 a las 22:01

Esta no es una respuesta, pero recuerdo que había programas para que Amiga "optimizara" el código compilado para MC68000 para que funcionara más rápido en procesadores más nuevos, a costa de la compatibilidad. Pero no conozco tal intento para x86. -

En mi opinión, es posible que tenga un mejor momento usando algo como IDA & hex-rays u Ollydbg para realizar ingeniería inversa del ensamblaje en un lenguaje de nivel superior (C o C ++) -

RevGen es uno de los traductores x86-> LLVM aquí. También tiene traductor de x86 a binario estático. Utiliza Qemu y MIPS TCG modificado, que genera IR. -

También hay dagger.repzret.org - Daga, que puede descompilar a LLVM IR. -

3 Respuestas

LLVM no puede hacer esto de inmediato. Tendría que escribir un convertidor de representación intermedia (IR) binario x86 a LLVM. Esa sería una tarea muy no trivial. Si el código x86 fuera lo suficientemente simple, podría mapear bastante de cerca a IR, pero algunas instrucciones x86 no se mapearán directamente, por ejemplo, manipulaciones de puntero de pila.

Editar: también podría considerar probar un enfoque similar al que hace QEMU. QEMU traduce los binarios sobre la marcha, que cuando ejecuto el código PowerPC, cada bloque básico se traduce en código X86 antes de que se ejecute. Puede descubrir cómo dividir su archivo de objeto en los bloques básicos y generar LLVM IR para cada bloque, descartando cosas (como el paso de parámetros, etc.) y reemplazándolo con LLVM IR directo.

Sin embargo, sigue siendo un GRAN trabajo. Probablemente sea más fácil reescribir el algoritmo desde cero.

Este proceso exacto se describe en "Traducir dinámicamente x86 a LLVM usando QEMU"

Respondido 08 Feb 13, 01:02

¿Hay proyectos para hacer lo mismo? - osgx

No es probable. Simplemente no queda suficiente información en el código de la máquina para que funcione el optimizador de LLVM. El código tendría que someterse a ingeniería inversa para obtener una representación de alto nivel antes de que pudiera vectorizarse y recompilarse de manera útil para 64 bits, y los compiladores simplemente no son tan buenos para hacer inferencias. Es posible que pueda usar un emulador x86 que realice una recompilación dinámica, pero no es probable que pueda vectorizar las matemáticas, y la sobrecarga anularía cualquier mejora en el rendimiento. - user57368

Para gastos generales: hay un código que quiero ejecutar rápido. Puedo pasar 1 hora ejecutando el optimizador antes de ejecutar el nuevo código. El objetivo es obtener un código más rápido en un tiempo más lento. El proceso de recompilación debe realizarse estáticamente, una vez. - osgx

y hay un antiguo proyecto de HP personals.ac.upc.edu/vmoya/docs/bala.pdf que hace una recompilación dinámica del código de máquina nativo para hacerlo más rápido. - osgx

Hasta donde yo sé, no existen tales proyectos, pero en un momento hubo un proyecto para usar LLVM para compilar código JIT para QEMU (code.google.com/p/llvm-qemu), que está estrechamente relacionado. - Daniel Dunbar

La Proyecto MAO parece hacer parte de lo que quieres (x86-> idioma intermedio).

editar: @osgx, deberá consultar el sitio web de mao para conocer el estado del proyecto y los detalles de los programas que pueden manejar. (Sin embargo, el código de modificación automática puede ser un desafío).

respondido 18 nov., 13:16

Hola. ¿Qué estatus de MAO? ¿Qué parte de x86 / x86_64 puede manejar? ¿Puede funcionar con código auto-modificado (empaquetado con UPX, por ejemplo)? osgx

Por lo que sé, es imposible desensamblar el código x86 al 100% correctamente. Como los datos y el código se entremezclan y también debido a las instrucciones de longitud variable. La única forma de desmontarlo correctamente es interpretarlo sobre la marcha.

respondido 27 mar '12, 19:03

la interpretación solo es necesaria para el código que se modifica automáticamente. El código estático se puede desmontar fácilmente (con cualquier desmontador). Trabajar con código dinámico es posible solo si habrá un recompilador en tiempo de ejecución O si el código dinámico se puede descomprimir en código estático (en mi caso, EXE empaquetado como se usa UPX y se puede descomprimir) - osgx

@osgx: no es cierto. Por ejemplo, las técnicas de desincronización pueden confundir fácilmente a los desensambladores. - Molnarg

Bueno, técnicamente eso es cierto, pero nada que valga la pena ingeniar es 100% posible. así que en teoría, ¿100%? nunca es posible ... en la práctica, 99.98% muy posible ... de hecho, está bien documentado cómo superar las limitaciones teóricas y producir resultados valiosos. - JM Becker

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.