Quiero que clang compile mi C/C++
código para LLVM
bytecode en lugar de ejecutable binario. ¿Cómo puedo lograr eso? Y si obtengo el LLVM
código de bytes, ¿cómo puedo tomarlo para compilarlo en un ejecutable binario?
Básicamente quiero agregar algo de mi propio código al LLVM
bytecode antes de compilarlo en el ejecutable binario.
Respuestas:
Dado algún archivo C / C ++
foo.c
:Produce
foo.ll
un archivo IR LLVM.La
-emit-llvm
opción también se puede pasar al front-end del compilador directamente, y no al controlador mediante-cc1
:Produce
foo.ll
con el IR.-cc1
agrega algunas opciones interesantes como-ast-print
. Echa un vistazo-cc1 --help
para más detalles.Para compilar LLVM IR más allá del ensamblaje, use la
llc
herramienta:Produce
foo.s
con ensamblaje (predeterminado 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 .fuente
Utilizar
fuente
.o
debe referirse a archivos de objetos binarios,.s
a archivos de ensamblaje y algo más (por convención.ll
) a archivos IR LLVM. De lo contrario, es fácil confundirse. Clang / LLVM ahora no tiene un enlazador propio para objetos binarios (aunque uno está en proceso). El enlazador LLVMllvm-ld
solo une varios archivos IR en uno.bc
se usa; también, tenga en cuenta quellvm-ld
puede actuar como interfaz para la cadena de herramientas del sistema, es decir, mi respuesta anteriorllvm-ld -native
debería funcionar como se esperaba ...foo.bc
es un archivo de código de bits LLVMclang -emit-llvm -o test.bc -c test.c && file test.bc: test.bc: LLVM IR bitcode
.Si tiene varios archivos de origen, probablemente quiera 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 termines con un archivo de código de bits para cada archivo fuente.
En cambio, desea compilar con link-time-optimization
y para el paso final de vinculación, agregue el argumento -Wl, -plugin-opt = also-emit-llvm
Esto le da tanto un programa compilado y el código binario correspondiente a la misma (program.bc). Luego puede modificar program.bc de la forma que desee y volver a compilar el programa modificado en cualquier momento haciendo
aunque tenga en cuenta que debe incluir cualquier indicador de enlace necesario (para bibliotecas externas, etc.) en este paso nuevamente.
Tenga en cuenta que debe usar 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
a cualquier paso de enlace anterior.
fuente
Si tiene varios archivos y no desea tener que escribir cada archivo, le recomendaría que siga estos pasos simples (estoy usando
clang-3.8
pero puede usar cualquier otra versión):generar todos los
.ll
archivosvincularlos en uno solo
(Opcional) Optimice su código (quizás un análisis de alias)
Generar ensamblaje (genera un
optimised.s
archivo)Crear ejecutable (nombrado
a.out
)fuente
-S
opción (en el paso 2), especifico que me gustaría producir la salida en LLVM IR. Básicamente, coloque todos los archivos * .ll en uno solo. Hago esto para verificar que las optimizaciones realmente cambian el código, es decir,single.ll
yoptimised.ll
ahora deberían verse diferentes (en cuanto al código) y también podría mostrar el informe para ver si hay alguna diferencia.-basicaaa
es un indicador incorrecto,-basicaa
debe usarse en su lugar.¿Leíste la
clang
documentación ? Probablemente estés buscando-emit-llvm
.fuente