c llvm clang

clang download



Cómo hacer clang compilar a llvm IR (5)

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

Quiero clang para compilar 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 compilarlo en un ejecutable binario?

Básicamente, quiero agregar algo de mi propio código al bytecode LLVM antes de compilar 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 compilador 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 compilar LLVM IR más allá del ensamblaje, use la herramienta llc :

> llc foo.ll

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


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 programa. Las otras respuestas dadas harán que termines con un archivo de código de bits para cada archivo fuente.

En cambio, desea compilar 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 programa compilado y el código de bit correspondiente (program.bc). Luego puedes modificar program.bc de la forma que quieras y recompilar el programa 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.


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


Utilizar

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