2011-01-08 9 views
12

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

Este código lleva mucho tiempo, por lo que quiero hacer una recompilación estática de él. Además, puedo hacer un perfil de tiempo de ejecución y darle 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 forma más óptima al decodificador de hardware.

Gracias.

+1

Esto no es una respuesta, pero recuerdo que había programas para que Amiga "optimice" el código compilado para MC68000 para hacerlo funcionar más rápido en procesadores más nuevos, a costa de la compatibilidad. Pero no conozco ningún intento de este tipo para x86. – liori

+0

IMO, es posible que tenga un mejor momento utilizando algo como IDA y rayos X o Ollydbg para realizar ingeniería inversa del ensamblado en un lenguaje de nivel superior (C o C++) – Necrolis

+1

[RevGen] (http://stackoverflow.com/questions/ 9359487/the-source-code-of-revgen-tool) es uno de los traductores x86-> LLVM aquí. También tiene un traductor de x86 a binario estático. Utiliza Qemu y MIPS TCG modificado, que genera IR. – osgx

Respuesta

10

LLVM no puede hacerlo de la caja. Tendría que escribir un convertidor binario x86 a representación intermedia (IR) de LLVM. Esa sería una tarea muy no trivial. Si el código x86 fuera lo suficientemente simple, podría correlacionarse bastante bien con IR, pero algunas instrucciones x86 no se correlacionarán directamente, p. manipulaciones de punteros 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 al código X86 antes de que se ejecute. Podría averiguar cómo dividir el archivo de objeto en los bloques básicos y generar LLVM IR para cada bloque, descartar cosas (como pasar parámetros, etc.) y reemplazarlas con LLVM IR directo.

Aún así, es un gran trabajo. Probablemente sea más fácil reescribir el algoritmo desde cero.

Este proceso exacto se describe en "Dynamically Translating x86 to LLVM using QEMU"

+0

¿Hay algún proyecto para hacer lo mismo? – osgx

+0

No es probable. Simplemente no hay suficiente información en el código de máquina para que el optimizador de LLVM trabaje con él. El código tendría que ser revertido a una representación de alto nivel antes de que pudiera ser vectorizado y recompilado 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 recompila dinámicamente, pero no es probable que pueda vectorizar los cálculos, y la sobrecarga anularía cualquier ganancia de rendimiento. – user57368

+0

Para gastos generales: hay un código, que quiero ejecutar rápidamente. Puedo gastar 1 hora de funcionamiento del optimizador antes de ejecutar el nuevo código. El objetivo es obtener un código más rápido a partir de un tiempo más lento. El proceso de recompilación se debe hacer estáticamente, una vez. – osgx

1

El MAO project parece hacer parte de lo que quiere (x86> lenguaje intermedio).

edit: @osgx, tendrá que 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 auto modificación puede ser un desafío.)

+1

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

0

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

+0

interpretación necesaria solo para el código de auto modificación. El código estático se puede desmontar fácilmente (con cualquier desensamblador). Trabajar con código dinámico solo es posible si habrá un recompilador en tiempo de ejecución O si el código dinámico se puede desempaquetar en código estático (en mi caso, se empaqueta EXE al igual que UPX y se puede desempaquetar) – osgx

+0

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

+0

Bueno, técnicamente eso es cierto, pero nada digno de ingeniería es 100% posible. Entonces, ¿en teoría, 100%? nunca posible ... en la práctica, 99.98% muy posible ... de hecho está bien documentado sobre cómo superar las limitaciones teóricas y producir un producto valioso. – TechZilla