2012-04-29 14 views
11

Recientemente, en un intento de afinar mis habilidades de ensamblaje, escribí un compilador MUY simple para un lenguaje de juguete en C++. Se ejecuta de una sola pasada y emite código directamente durante la fase de análisis a varias secuencias de cadenas, cada una representando una sección del código (es decir, una representa section .bss, mientras que otras representan .data y .text). Después, estas secuencias de cadenas se escriben en un archivo, y uso NASM y gcc para ensamblarlas y vincularlas. Sé que este enfoque de un solo paso es terriblemente ineficiente, pero una vez más, esto fue más un ejercicio de comprensión de la etapa de generación de código que otra cosa. De todos modos, me gustaría modificar mi código para emitir directamente LLVM IL en lugar de ensamblar en bruto, nuevamente como un ejercicio de aprendizaje. ¿Hay alguna guía de nivel introductorio a LLVM IL? O, mejor aún, ¿una herramienta para determinar el código IL equivalente para una línea de ensamblaje? Miré, y solo encontré la especificación completa, que es MUCHO más información de la que necesito.Portando el compilador desde el ensamblado x86 hasta LLVM

+0

No habrá una asignación de uno a uno. No hay atajos aquí. –

+0

Me doy cuenta de esto, solo estoy buscando una guía sobre cómo emitir cosas básicas, como reservar datos, cmp y saltos condicionales, etc. – chameco

+0

Los documentos de LLVM. tiene un (al menos un) tutorial que lo guiará a través de la creación de un compilador para un lenguaje de juguete. – Mat

Respuesta

14

La referencia de idioma de LLVM IR es available here. Tenga en cuenta que es una página de referencia detallada, no un tutorial. No existe una correspondencia directa de 1 a 1 entre el ensamblaje x86 y LLVM IR, aunque dado que LLVM IR es de nivel superior y más general que el ensamblado x86, no debería ser demasiado difícil adaptar un compilador para que emita x86 a LLVM IR.

La documentación oficial de LLVM viene con un detailed tutorial, que es absolutamente el mejor lugar de inicio para usted: realiza un compilador de juguetes desde un lenguaje de programación de alto nivel simplista a LLVM IR. Al trabajarlo, aprenderá muchos de los conceptos clave de LLVM y luego podrá usar efectivamente la referencia de lenguaje antes mencionada.

Si encuentra algún problema con el tutorial, infórmenos al rastreador de errores de LLVM o a la lista de correo. Se espera que el tutorial sea funcional y cualquier problema informado será reparado.

Otro buen recurso inicial para entender LLVM IR es el online demo page. Le permite compilar fragmentos de código C en línea a LLVM IR (sin instalar nada), y debe ser muy útil para entender cómo se pueden representar constructos de programación básica en LLVM IR.

+2

¡Gracias! Nunca había visto esa página de demostración, eso es exactamente lo que estaba buscando. – chameco

+0

@chameco: la página de demostración es realmente útil, personalmente la uso a menudo para comprobar qué tipo de optimización Clang puede realizar (o no). Realmente ayuda a que la gente vea la luz y evite que tengan un nivel demasiado bajo en su código. –

+0

Tengo una versión ligeramente modificada de la página que también le permite ver el lenguaje ensamblador para otros objetivos de LLVM: http://ellcc.org/demo –

Cuestiones relacionadas