En primer lugar, para corregir un malentendido obvio: LLVM es un marco para manipular código en formato IR. No hay AST a la vista (*): lee IR, lo transforma/manipula/analiza, y vuelve a escribir IR.
lectura IR es muy simple:
int main(int argc, char** argv)
{
if (argc < 2) {
errs() << "Expected an argument - IR file name\n";
exit(1);
}
LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;
Module *Mod = ParseIRFile(argv[1], Err, Context);
if (!Mod) {
Err.print(argv[0], errs());
return 1;
}
[...]
}
Este código acepta un nombre de archivo. Esto debería ser un archivo LLVM IR (textual). A continuación, pasa a analizarlo en un Module
, que representa un módulo de IR en el formato interno en memoria de LLVM. Esto puede ser manipulado con los diferentes pases que LLVM tiene o usted puede agregar por su cuenta. Eche un vistazo a algunos ejemplos en la base de código LLVM (como lib/Transforms/Hello/Hello.cpp
) y lea esto - http://llvm.org/docs/WritingAnLLVMPass.html.
Escupir IR nuevamente en un archivo es aún más fácil. La clase Module
simplemente escribe a sí mismo a una corriente:
some_stream << *Mod;
Eso es todo.
Ahora, si tiene alguna preguntas específicas sobre específicos modificaciones que quiere hacer con el código de IR, que realmente debería pedir algo más centrado. Espero que esta respuesta te muestre cómo analizar el IR y escribirlo de nuevo.
(*) IR no tiene una representación AST dentro de LLVM, porque es un lenguaje simple de ensamblaje. Si subes un escalón hacia arriba, hacia C o C++, puedes usar Clang para analizar eso en ASTs, y luego hacer manipulaciones en el nivel de AST. Clang sabe cómo producir LLVM IR desde su AST. Sin embargo, debe comenzar con C/C++ aquí, y no LLVM IR. Si LLVM IR es lo único que te importa, olvídate de los AST.
Gracias Eli. Tu respuesta fue muy útil. – MetallicPriest
Heads up, creo que debería ser "parseIRFile" con una p minúscula. http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722
@ user2027722: sí, las API de LLVM cambian tan a menudo que es difícil mantener las muestras actualizadas. Tengo un repositorio de Github para eso: https://github.com/eliben/llvm-clang-samples que mantengo lo más sincronizado posible, y es más una fuente de verdad que SO al azar. –