2012-05-20 14 views
7

Odkryłem, że trudno zrozumieć API LLVM C++. Czy chciałbyś zapytać? Czy istnieje związek między API LLVM C++ i LLVM IR? Ponadto chciałbym wiedzieć, jak korzystać z API LLVM C++?Co to jest LLVM C++ API?

+0

Jeśli chcesz wygenerować tylko podczerwień (i prawdopodobnie przepuścić trochę), prawdopodobnie lepiej byłoby użyć wiązań LLVM C, są ładne, czyste i minimalistyczne. –

Odpowiedz

12

Aby (bardzo) uprościć, LLVM jest biblioteką C++ do pisania kompilatorów. Jego API C++ to zewnętrzny interfejs użytkownika biblioteki, który wykorzystuje do implementacji swojego kompilatora.

Istnieje pewien stopień symetrii między LLVM IR i częścią API LLVM C++ - część używana do budowania IR. Bardzo dobrym źródłem informacji na temat tej symetrii jest http://llvm.org/demo/. Na przykład, można skompilować ten kod C:

int factorial(int X) { 
    if (X == 0) return 1; 
    return X*factorial(X-1); 
} 

Do 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 
} 

Jak również do C++ API (nie będę wkleić go tutaj, bo wyjście jest długa, ale możesz spróbować sam). Spowoduje to, zobaczysz, na przykład instrukcja z kodem IR icmp powyżej wykonywane jako:

ICmpInst* int1_5 = new ICmpInst(*label_4, ICmpInst::ICMP_EQ, int32_X, const_int32_1, ""); 

ICmpInst jest klasa, która jest częścią API C++ użyte do wygenerowania icmp instrukcjami. Dobrym odniesieniem dla API C++ jest Programmer's manual.

+0

Dziękuję za powtórkę. Ale czy możesz mi powiedzieć, kiedy i jak korzystać z API LLVM C++? – user1406531

+2

@ user1406531: Mam nadzieję, że zdajesz sobie sprawę, że twoje pytanie jest zbyt ogólne. Dlaczego w ogóle korzystasz z LLVM? W jakim celu? Co masz zamiar na nim zbudować? Jeśli masz dokładne odpowiedzi na te pytania, myślę, że po przeczytaniu samouczka i dokumentacji LLVM zrozumiesz, w jaki sposób API LLVM C++ może ci pomóc –

2

Możesz użyć zaplecza CPP (llc -march=cpp), aby znaleźć mapowanie z dowolnego IR na API C++.