Encontré difícil de entender la API LLVM C++. Me gustaría preguntarle? ¿Existe alguna relación entre LLVM C++ API y LLVM IR? Además, quiero saber cómo usar la API LLVM C++?¿Qué es exactamente la API LLVM C++
Respuesta
Para (en gran medida) simplificar, LLVM es una biblioteca C++ para escribir compiladores. Su API C++ es la interfaz externa que los usuarios de la biblioteca emplean para implementar su compilador.
Hay un grado de simetría entre LLVM IR y parte de LLVM C++ API, la parte utilizada para construir IR. Un muy buen recurso para obtener una idea de esta simetría es http://llvm.org/demo/. Por ejemplo, puede compilar el código C:
int factorial(int X) {
if (X == 0) return 1;
return X*factorial(X-1);
}
En LLVM IR:
define i32 @factorial(i32 %X) nounwind uwtable readnone {
%1 = icmp eq i32 %X, 0
br i1 %1, label %tailrecurse._crit_edge, label %tailrecurse
tailrecurse: ; preds = %tailrecurse, %0
%X.tr2 = phi i32 [ %2, %tailrecurse ], [ %X, %0 ]
%accumulator.tr1 = phi i32 [ %3, %tailrecurse ], [ 1, %0 ]
%2 = add nsw i32 %X.tr2, -1
%3 = mul nsw i32 %X.tr2, %accumulator.tr1
%4 = icmp eq i32 %2, 0
br i1 %4, label %tailrecurse._crit_edge, label %tailrecurse
tailrecurse._crit_edge: ; preds = %tailrecurse, %0
%accumulator.tr.lcssa = phi i32 [ 1, %0 ], [ %3, %tailrecurse ]
ret i32 %accumulator.tr.lcssa
}
Así como a C llamadas a la API ++ (no voy a pegar aquí porque la salida es larga, pero puedes probarlo tú mismo). Al hacer esto, verá, por ejemplo, la instrucción icmp
a partir del código IR por encima de realizar como:
ICmpInst* int1_5 = new ICmpInst(*label_4, ICmpInst::ICMP_EQ, int32_X, const_int32_1, "");
ICmpInst
es una clase que es parte de la API C++ utilizado para crear icmp
instrucciones. Una buena referencia para la API de C++ es Programmer's manual.
Gracias por repetir. Pero ¿Puede decirme cuándo y cómo usar la API C++ de LLVM? – user1406531
@ user1406531: Espero que se den cuenta de que su pregunta es demasiado general. ¿Por qué usas LLVM en absoluto? ¿A que final? ¿Qué planeas construir sobre eso? Si tiene respuestas exactas para estas preguntas, creo que después de pasar algún tiempo leyendo el tutorial y la documentación de LLVM, se dará cuenta de cómo LLVM C++ API puede ayudarlo –
Puede usar el backend de CPP (llc -march=cpp
) para encontrar la asignación de cualquier IR dado a la API de C++.
- 1. ¿Qué es exactamente súper en Objective-C?
- 2. ¿Qué es exactamente la instrucción PHI hace y cómo usarlo en LLVM
- 3. ¿Qué es hash exactamente?
- 4. ¿Qué es exactamente sun.jnu.encoding?
- 5. ¿Qué es exactamente OWASP?
- 6. ¿Qué es exactamente Java?
- 7. ¿Qué es exactamente OData?
- 8. ¿Qué es exactamente Parrot?
- 9. ¿Qué es exactamente JSON?
- 10. ¿Qué es exactamente NoSQL?
- 11. ¿Qué es exactamente "manejar"?
- 12. ¿Qué es exactamente Rake?
- 13. ¿Qué es exactamente WPF?
- 14. ¿Qué es Container.DataItem exactamente?
- 15. ¿Qué es exactamente Heroku?
- 16. ¿Exactamente qué es PLINQ?
- 17. ¿Qué es LINQ exactamente?
- 18. ¿qué significa exactamente la plataforma de palabras y api?
- 19. ¿Qué es CLI/C++ exactamente? ¿Cómo difiere de C++ "normal"?
- 20. ¿Qué es exactamente una "Consola"?
- 21. ¿Qué es la sesión de NHibernate exactamente?
- 22. ¿Qué es exactamente "programación basada en interfaz"?
- 23. ¿Qué es exactamente este error?
- 24. ¿Qué es exactamente Appdomain reciclaje
- 25. ¿Qué es exactamente un marco?
- 26. ¿Qué es exactamente una ROM?
- 27. ¿Qué es exactamente Puerto escuchando
- 28. Eclipse - ¿Qué es exactamente un generador?
- 29. ¿Qué es exactamente una sección crítica?
- 30. ¿Qué es exactamente una regla de definición en C++?
Si solo desea generar el IR (y probablemente ejecute algunos pasos sobre él), probablemente sea mejor que utilice los enlaces LLVM C, son agradables, limpios y minimalistas. –