2011-03-03 17 views
13

¿Hay una manera fácil de pasar de llvm ir al código fuente de trabajo?llvm ir a lenguaje de origen legible para los humanos?

Específicamente, me gustaría comenzar con un código simple de C++ que simplemente modifica los POD (principalmente matrices de ints, flotantes, etc.), convertirlo a llvm ir, realizar un análisis simple y traducirlo y luego convertirlo volver al código de C++?

Realmente no me importa que cualquiera de los nombres se rompa, solo me gustaría poder hackear con la fuente antes de hacer las optimizaciones dependientes de la máquina.

+5

El ensamblaje LLVM es relativamente legible, siempre que esté familiarizado con los detalles de bajo nivel. Puede indicar a 'llc' que genere el código C (' -march = c'), pero el resultado no será bueno. – delnan

Respuesta

6

Existe un problema aquí ... puede que no sea posible representar fácilmente el IR en el idioma.

Es decir, es probable que sea capaz de conseguir algunos representación, pero podría ser menos legible.

La cuestión es que el IR no se ocupa de alto nivel semántico, y sin ella ...

preferiría que le aconsejaría a aprender a leer el IR. Puedo leer un poco sin demasiado esfuerzo, y estoy lejos de ser un gran experto.

De lo contrario, puede codificar en C desde el IR. No será mucho más similar a su código C++, pero tal vez se sienta mejor sin los nodos ssa y phi.

+0

buenos consejos. gracias – Dan

+0

¿qué es un nodo phi? phi =? – paulm

+0

@paulm: Es [intrínseco a SSA] (http://en.wikipedia.org/wiki/Static_single_assignment_form). –

27

Hay muchas opciones en realidad. Los 2 que probablemente le interesen son -march=c y -march=cpp, que son opciones de llc.

Run:

llc -march=c -o code.c code.ll 

Esto convertirá el código binario LLVM en code.ll de nuevo a C y ponerlo en code.c.

También:

llc -march=cpp -o code.cpp code.ll 

Esto es diferente que el motor de salida C. De hecho, escribirá código C++ que se puede ejecutar para reconstruir el IR. Utilizo este personal para incrustar LLVM IR en un programa sin tener que lidiar con el análisis de archivos de código de bits ni nada.

-march=cpp tiene más opciones que puede ver con llc --help, como -cppgen= que controla la cantidad de IR que la salida C++ reconstruye.

+2

Con mis propias compilaciones (recientes, es decir, 4.0) de LLVM, 'llc --version' enumera aproximadamente 30 objetivos, pero C y C++ no están incluidos. Intenté usar el apt-get de Ubuntu para instalar el LLVM anterior (3.8) y ver que incluye el backend de C++, pero no el backend de C. La página "Creación de LLVM con CMake" (llvm.org/docs/CMake.html) indica que todos los destinos se crean de forma predeterminada. ¿Los objetivos C y C++ han sido eliminados recientemente? – user2023370

+0

Lo mismo aquí, 4.0 SVN build no tiene los back-end c y cpp – aerkenemesis

7

CppBackend fue eliminado. No tenemos opciones -march = cpp y -march = c desde 2016-05-05, r268631.

+5

¿Alguna otra información, como por qué o el aviso de desaprobación? – Coder256

+1

http://releases.llvm.org/3.1/docs/ReleaseNotes.html#changes "El backend de C se ha eliminado. Tenía numerosos problemas, hasta el punto de no poder compilar ningún programa no trivial". –

Cuestiones relacionadas