Cómo aprender clang y LLVM y qué conocimientos necesitas
He estado usando mucho Clang/LLVM últimamente y actualmente estoy dividido entre LLVM IR e IBM WCode. Para aprender Clang/LLVM, realmente depende de lo que estés haciendo, si estás mirando la implementación C, Objective-C de Clang, o estás intentando hacer cosas de nivel AST con Clang, o estás intentando hacer algo con LLVM. IR, o está intentando agregar funciones de optimización de LLVM, o está intentando agregar nuevas funciones de Clang/LLVM, estas son preguntas importantes en este momento, por lo que necesita saber lo que desea y luego leer sobre ello, en lugar de simplemente comenzar con uno que es demasiado grande. Comienza el gran trozo.
En cualquier caso, antes de leer el código fuente, primero debes comprender los conceptos básicos de los principios de compilación. Debe comprender varios pasos básicos de nuestro compilador, como el análisis léxico, el análisis de sintaxis, el análisis semántico, la generación de código y otros procesos. Con estas ideas básicas, no se perderá en el océano del código Clang, como ver Sema Which. En esta etapa, ¿puedes corresponder a palabras como , AST y CodeGen si quieres saber sobre C, C, Objective-C, etc.? Si desea comprender la implementación de lenguajes como C, C, Objective-C, etc., debe centrarse principalmente en Lexer, Parser, AST, Sema, etc. Además, si quieres entenderlo, entiende por qué se implementa de esa manera, como en C. Luego debe tener un estándar C, estar familiarizado con el lenguaje común del estándar C y al menos poder distinguir entre Declaración, Definición, Valor L, Valor R, etc., porque encontrará que Clang tiene muchas declaraciones. Si no comprende estas declaraciones, es difícil entender por qué aparecen tantas declaraciones. Para esta parte del código, lo leería cuando quisiera comprender una determinada parte de la implementación, en lugar de leerlo uno al lado del otro.
Si es como yo y necesita tratar con LLVM IR directamente, necesitará saber más sobre el lenguaje LLVM IR, el Manual de referencia del lenguaje LLVM, pero sé que leer dicho documento directamente es Tanto abstracto como aburrido, como yo. Entonces lo mejor que puede hacer es volcar el archivo .ll de su programa C/C, luego leerlo, modificarlo y ver qué sucede. Además, en esta etapa, necesita más conocimientos sobre enlazadores, archivos de objetos, tablas de símbolos, etc., para poder realizar mejor este trabajo. La mayor parte del código en esta etapa está en Clang CodeGen, por lo que debe leer el código más concentrado, pero aún así inevitablemente necesitará comenzar con el controlador, etc. para comprender la situación completa, pero si solo desea comprender IR, entonces la mayor parte del código está en CodeGen y la mayor parte del código fuente de Clang está en CG****.
Si estás escribiendo un backend de LLVM, esta es la parte de la que sé menos, pero lo bueno de LLVM es que está bastante bien documentado, porque inmediatamente encontré esto: Escribir un backend de LLVM, luego los dioses de la fantasía llenaron el vacío: código LLVM independiente del objetivo generador de código LLVM independiente del objetivo