Po pierwsze, aby naprawić oczywiste nieporozumienie: LLVM to framework do manipulowania kodem w formacie IR. Nie widać żadnych AST (*) - czytasz IR, transformujesz/manipulujesz/analizujesz, a Ty odpisujesz IR.
Reading IR jest bardzo prosta:
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;
}
[...]
}
Kod ten przyjmuje nazwę pliku. Powinien to być plik IR LLVM (tekstowy). Następnie przetwarza go na Module
, który reprezentuje moduł podczerwieni w wewnętrznym formacie pamięci w LLVM. Można to następnie zmanipulować za pomocą różnych przejść, które LLVM ma lub dodajesz sam. Spójrz na kilka przykładów w bazie kodu LLVM (takich jak lib/Transforms/Hello/Hello.cpp
) i przeczytaj to - http://llvm.org/docs/WritingAnLLVMPass.html.
Pętla podczerwona z powrotem do pliku jest jeszcze łatwiejsza. Klasa Module
po prostu zapisuje się do strumienia:
some_stream << *Mod;
To wszystko.
Teraz, jeśli masz jakiekolwiek konkretne pytania dotyczące specyficznych modyfikacji chcesz zrobić do kodu IR, należy naprawdę coś zapytać bardziej skoncentrowany. Mam nadzieję, że ta odpowiedź pokazuje, jak przetworzyć IR i zapisać go.
(*) IR nie ma reprezentacji AST wewnątrz LLVM, ponieważ jest to prosty język podobny do zestawu. Jeśli pójdziesz o jeden krok w górę, do C lub C++, możesz użyć Clanga, by przeanalizować to w AST, a następnie wykonać manipulacje na poziomie AST. Clang wie, jak wytworzyć LLVM IR ze swojej AST. Jednak musisz zacząć od C/C++ tutaj, a nie LLVM IR. Jeśli potrzebujesz LLVM IR, zapomnij o AST.
Dzięki Eli. Twoja odpowiedź była bardzo pomocna. – MetallicPriest
Podejrzewam, myślę, że powinien to być "parseIRFile" z małymi literami p. http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722
@ user2027722: tak, interfejsy API LLVM zmieniają się tak często, że aktualizowanie próbek jest bardzo trudne. Mam repozytorium Github dla tego: https://github.com/eliben/llvm-clang-samples, które robię, zachowuję jak zsynchronizowane, jak to możliwe, i to jest bardziej źródło prawdy niż losowe odpowiedzi SO –