Cómo hacer clang comstackr a llvm IR

Quiero clang para comstackr mi código C/C++ a LLVM bytecode en lugar de ejecutable binario. ¿Cómo puedo lograr eso? Y si obtengo el LLVM byte de LLVM , ¿cómo puedo llevarlo a comstackrlo en un ejecutable binario?

Básicamente, quiero agregar algo de mi propio código al bytecode LLVM antes de comstackr en ejecutable binario.

Dado un poco de archivo C / C ++ foo.c :

 > clang -S -emit-llvm foo.c 

Produce foo.ll que es un archivo IR de LLVM.

La opción -emit-llvm también se puede pasar al front-end del comstackdor directamente, y no al controlador mediante -cc1 :

 > clang -cc1 foo.c -emit-llvm 

Produce foo.ll con el IR. -cc1 agrega algunas opciones geniales como -ast-print . Consulte -cc1 --help para obtener más detalles.


Para comstackr LLVM IR más allá del ensamblaje, use la herramienta llc :

 > llc foo.ll 

Produce foo.s con ensamblaje ( foo.s en la architecture de la máquina en la que lo ejecuta). llc es una de las herramientas de LLVM: aquí está su documentación .

Utilizar

 clang -emit-llvm -o foo.bc -c foo.c clang -o foo foo.bc 

Si tiene varios archivos fuente, probablemente desee utilizar la optimización de tiempo de enlace para generar un archivo de código de bits para todo el progtwig. Las otras respuestas dadas harán que termines con un archivo de código de bits para cada archivo fuente.

En cambio, desea comstackr con optimización de tiempo de enlace

 clang -flto -c program1.c -o program1.o clang -flto -c program2.c -o program2.o 

y para el paso de enlace final, agregue el argumento -Wl, -plugin-opt = also-emit-llvm

 clang -flto -Wl,-plugin-opt=also-emit-llvm program1.o program2.o -o program 

Esto le proporciona un progtwig comstackdo y el código de bit correspondiente (program.bc). Luego puedes modificar program.bc de la forma que quieras y recomstackr el progtwig modificado en cualquier momento haciendo

 clang program.bc -o program 

aunque tenga en cuenta que debe incluir cualquier indicador de enlazador necesario (para bibliotecas externas, etc.) en este paso nuevamente.

Tenga en cuenta que debe utilizar el vinculador de oro para que esto funcione. Si desea obligar a clang a usar un enlazador específico, cree un enlace simbólico a ese enlazador llamado “ld” en un directorio especial llamado “fakebin” en algún lugar de su computadora, y agregue la opción

 -B/home/jeremy/fakebin 

a cualquier paso de vinculación anterior.

¿ clang documentación de clang ? Probablemente estés buscando -emit-llvm .

Si tiene varios archivos y no desea tener que escribir cada archivo, le recomiendo que siga estos simples pasos (estoy usando clang-3.8 pero puede usar cualquier otra versión):

  1. generar todos los archivos .ll

     clang-3.8 -S -emit-llvm *.c 
  2. vincularlos en uno solo

     llvm-link-3.8 -S -v -o single.ll *.ll 
  3. (Opcional) Optimice su código (tal vez algún análisis de alias)

     opt-3.8 -S -O3 -aa -basicaaa -tbaa -licm single.ll -o optimised.ll 
  4. Generar ensamblado (genera un archivo optimised.s )

     llc-3.8 optimised.ll 
  5. Crear ejecutable (llamado a.out )

     clang-3.8 optimised.s