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?
Odpowiedz
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.
Dziękuję za powtórkę. Ale czy możesz mi powiedzieć, kiedy i jak korzystać z API LLVM C++? – user1406531
@ 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 –
Możesz użyć zaplecza CPP (llc -march=cpp
), aby znaleźć mapowanie z dowolnego IR na API C++.
- 1. Co to jest kontekst LLVM?
- 2. Generowanie kodu LLVM C++ API jako backendu
- 3. Co to jest wirtualna sekcja LLVM w kontekście plików obiektowych?
- 4. Co to jest najlepsza praktyka dla publicznego interfejsu API C++?
- 5. Co to jest "Przenośny C++"?
- 6. //! [0] C++ - co to jest?
- 7. Co to jest "==" w C?
- 8. Co to jest "wtykowy" interfejs API?
- 9. Co to jest interfejs API systemu Windows?
- 10. Co to jest interfejs API NaCl Socket?
- 11. Firebase - Co to jest klucz interfejsu API
- 12. Co to jest C++ analog C# byte []?
- 13. Co to jest odpowiednik API Fetch API XMLHttpRequest.send (plik)?
- 14. Co to jest strefa MsgPack "
- 15. Co to jest „Class :: *”
- 16. Lua, co to jest Lua?
- 17. Co to jest wstawianie?
- 18. Co to jest klasa inline C++?
- 19. Co to jest "upakowana" struktura w C?
- 20. Co to jest ".. ::." w języku C#?
- 21. Co to jest odpowiednik UINT32_MAX w C++?
- 22. Co to jest ekwiwalent C# Java DecimalFormat?
- 23. Co to jest wersja C++ Java ArrayList
- 24. Co to jest wymazywanie typów w C++?
- 25. Co to jest bash escape character "\ c"?
- 26. Co to jest "kategoria" w Objective-C?
- 27. Co to jest "^" w Objective-C
- 28. Co to jest void * w języku C#?
- 29. Co to jest wskaźnik Singleton w C?
- 30. Co to jest obiekt skalarny w C++?
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. –