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):
generar todos los archivos
.ll
clang-3.8 -S -emit-llvm *.c
vincularlos en uno solo
llvm-link-3.8 -S -v -o single.ll *.ll
(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
Generar ensamblado (genera un archivo
optimised.s
)llc-3.8 optimised.ll
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