Trước tiên, để khắc phục sự hiểu lầm rõ ràng: LLVM là một khuôn khổ để thao tác mã ở định dạng IR. Không có ASTs trong tầm nhìn (*) - bạn đọc IR, chuyển đổi/thao tác/phân tích nó, và bạn viết IR trở lại.
Reading IR là thực sự đơn giản:
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;
}
[...]
}
Mã này chấp nhận một tên tập tin. Đây phải là một tệp IRV LLVM (văn bản). Sau đó nó tiếp tục phân tích nó thành một Module
, đại diện cho một mô-đun IR trong định dạng trong bộ nhớ trong của LLVM. Điều này sau đó có thể được thao tác với các thẻ LLVM khác nhau có hoặc bạn thêm vào của riêng bạn. Hãy xem một số ví dụ trong cơ sở mã LLVM (chẳng hạn như lib/Transforms/Hello/Hello.cpp
) và đọc phần này - http://llvm.org/docs/WritingAnLLVMPass.html.
Tách IR trở lại vào tệp thậm chí còn dễ dàng hơn. Lớp Module
chỉ tự ghi vào luồng:
some_stream << *Mod;
Vậy đó.
Bây giờ, nếu bạn có bất kỳ cụ câu hỏi về sửa đổi cụ thể mà bạn muốn làm để mã IR, bạn nên thực sự hỏi một cái gì đó tập trung hơn. Tôi hy vọng câu trả lời này cho bạn thấy làm thế nào để phân tích cú pháp IR và viết nó trở lại.
(*) IR không có đại diện AST bên trong LLVM, bởi vì nó là ngôn ngữ giống như lắp ráp đơn giản. Nếu bạn đi một bước lên, tới C hoặc C++, bạn có thể sử dụng Clang để phân tích cú pháp đó thành ASTs, và sau đó thực hiện các thao tác ở mức AST. Clang sau đó biết làm thế nào để sản xuất LLVM IR từ AST của nó. Tuy nhiên, bạn phải bắt đầu với C/C++ ở đây, và không phải LLVM IR. Nếu LLVM IR là tất cả những gì bạn quan tâm, hãy quên đi AST.
Nguồn
2012-02-07 06:11:15
Cảm ơn Eli. Câu trả lời của bạn rất hữu ích. – MetallicPriest
Cảnh báo, tôi nghĩ rằng nó nên là "parseIRFile" với chữ thường p. http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722
@ user2027722: yep, API LLVM thay đổi thường xuyên đến nỗi khó có thể cập nhật mẫu. Tôi có một repo Github cho rằng: https://github.com/eliben/llvm-clang-samples mà tôi làm giữ như đồng bộ nhất có thể, và nó là một nguồn gốc của sự thật hơn so với ngẫu nhiên SO câu trả lời –