Dado algún archivo C/C++ foo.c
:
> clang -S -emit-llvm foo.c
Produce foo.ll
que es un archivo LLVM IR.
El -emit-llvm
La opción también se puede pasar directamente al front-end del compilador, y no al controlador por medio de -cc1
:
> clang -cc1 foo.c -emit-llvm
Produce foo.ll
con su. -cc1
agrega algunas opciones geniales como -ast-print
. Echa un vistazo a -cc1 --help
para más detalles.
Para compilar LLVM IR más allá del ensamblaje, use el llc
herramienta:
> llc foo.ll
Produce foo.s
con ensamblaje (predeterminado a la arquitectura de la máquina en la que lo ejecuta). llc
es una de las herramientas LLVM - aquí está su documentación.
Usar
clang -emit-llvm -o foo.bc -c foo.c
clang -o foo foo.bc
Si tiene varios archivos de origen, probablemente desee utilizar la optimización del tiempo de enlace para generar un archivo de código de bits para todo el programa. Las otras respuestas dadas harán que termine con un archivo de código de bits para cada archivo fuente.
En su lugar, 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 final de vinculación, 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 da ambos un programa compilado y el bitcode correspondiente (program.bc). Luego puede modificar program.bc de la forma que desee y volver a compilar el programa modificado en cualquier momento haciendo
clang program.bc -o program
aunque tenga en cuenta que debe incluir las banderas de vinculación necesarias (para bibliotecas externas, etc.) en este paso nuevamente.
Tenga en cuenta que debe usar el enlazador dorado para que esto funcione. Si desea forzar 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 cualquiera de los pasos de vinculación anteriores.