2012-05-20 5 views
7

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++

+0

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. –

Respuesta

12

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.

+0

Gracias por repetir. Pero ¿Puede decirme cuándo y cómo usar la API C++ de LLVM? – user1406531

+2

@ 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 –

2

Puede usar el backend de CPP (llc -march=cpp) para encontrar la asignación de cualquier IR dado a la API de C++.