Quiero que clang compile mi C/C++código para LLVMbytecode en lugar de ejecutable binario. ¿Cómo puedo lograr eso? Y si obtengo el LLVMcódigo de bytes, ¿cómo puedo tomarlo para compilarlo en un ejecutable binario?
Básicamente quiero agregar algo de mi propio código al LLVMbytecode antes de compilarlo en el ejecutable binario.

Respuestas:
Dado algún archivo C / C ++
foo.c:Produce
foo.llun archivo IR LLVM.La
-emit-llvmopción también se puede pasar al front-end del compilador directamente, y no al controlador mediante-cc1:Produce
foo.llcon el IR.-cc1agrega algunas opciones interesantes como-ast-print. Echa un vistazo-cc1 --helppara más detalles.Para compilar LLVM IR más allá del ensamblaje, use la
llcherramienta:Produce
foo.scon ensamblaje (predeterminado en la arquitectura de la máquina en la que lo ejecuta).llces una de las herramientas de LLVM, aquí está su documentación .fuente
Utilizar
fuente
.odebe referirse a archivos de objetos binarios,.sa 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-ldsolo une varios archivos IR en uno.bcse usa; también, tenga en cuenta quellvm-ldpuede actuar como interfaz para la cadena de herramientas del sistema, es decir, mi respuesta anteriorllvm-ld -nativedebería funcionar como se esperaba ...foo.bces 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.8pero puede usar cualquier otra versión):generar todos los
.llarchivosvincularlos en uno solo
(Opcional) Optimice su código (quizás un análisis de alias)
Generar ensamblaje (genera un
optimised.sarchivo)Crear ejecutable (nombrado
a.out)fuente
-Sopció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.llyoptimised.llahora deberían verse diferentes (en cuanto al código) y también podría mostrar el informe para ver si hay alguna diferencia.-basicaaaes un indicador incorrecto,-basicaadebe usarse en su lugar.¿Leíste la
clangdocumentación ? Probablemente estés buscando-emit-llvm.fuente