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
Respuesta
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.
¡Gracias! Nunca había visto esa página de demostración, eso es exactamente lo que estaba buscando. – chameco
@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. –
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 –
- 1. ejecutando el programa x86 _on_ llvm
- 2. Buscando el compilador x86 de 16 bits
- 3. Idioma para el compilador basado en LLVM
- 4. Llamar LLVM Jit desde el programa c
- 5. mov instrucción en ensamblado x86
- 6. Apple LLVM compilador error 3.1
- 7. CMake, elija el compilador Xcode
- 8. Cargando un ensamblado generado por el compilador de Roslyn
- 9. Recompile un código x86 con LLVM a uno más rápido x86
- 10. Cargando el ensamblado WinRT desde .NET
- 11. Convertir a ARC - LLVM compilador 3.0 Error
- 12. frontend al compilador basado en LLVM
- 13. C++ g ++ llvm-clang perfil de compilador
- 14. Force x86 CLR en un ensamblado .NET 'Any CPU'
- 15. Cómo escribir código de auto modificación en ensamblado x86
- 16. ¿Cuáles son algunos consejos para optimizar el código de ensamblado generado por un compilador?
- 17. Iterating C++ vector desde el final hasta el comienzo
- 18. Generando código LLVM desde Java
- 19. Cómo medir el tiempo de ejecución de los comandos de ensamblado x86 y x86-64 en los ciclos del procesador?
- 20. Código de ejecución en un procesador diferente (ensamblado x86)
- 21. Utilice el compilador de TypeScript desde el nodo
- 22. Portando Mathematica a Octave
- 23. Crenshaw's "Construyamos un compilador": ¿Transcripción a C y x86 Assembler?
- 24. ¿Cómo desconectar el ensamblador integrado de LLVM?
- 25. Idioma de salida del compilador - LLVM IR vs C
- 26. Acceso al teclado en modo protegido en el ensamblaje x86
- 27. Portando un sitio web desde Symfony 1.4 a 2.0
- 28. de LLVM para GHC
- 29. Infraestructura del compilador LLVM para las arquitecturas VLIW
- 30. compilador C desde dónde?
No habrá una asignación de uno a uno. No hay atajos aquí. –
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
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