2012-05-20 24 views
7

Tôi thấy khó hiểu được LLVM C++ API.I bạn có muốn hỏi bạn không? Có mối quan hệ nào giữa LLVM C++ API và LLVM IR không? Ngoài ra, tôi muốn biết rằng làm thế nào để sử dụng LLVM C++ API?Chính xác là LLVM C++ API

+0

Nếu bạn chỉ muốn tạo ra IR (và có thể chạy một số vượt qua nó), bạn có thể sẽ tốt hơn bằng cách sử dụng LLVM C bindings, chúng đẹp, sạch sẽ và tối giản. –

Trả lời

12

Để (rất đơn giản), LLVM là thư viện C++ để viết trình biên dịch. C++ API của nó là giao diện người dùng bên ngoài của thư viện sử dụng để thực hiện trình biên dịch của họ.

Có một mức độ đối xứng giữa LLVM IR và một phần của LLVM C++ API - phần được sử dụng để xây dựng IR. Một nguồn lực rất tốt để có được một cảm giác đối xứng này là http://llvm.org/demo/. Ví dụ, bạn có thể biên dịch mã C này:

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

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

Cũng như C cuộc gọi API ++ (Tôi sẽ không dán nó ở đây vì đầu ra là dài, nhưng bạn có thể tự mình thử). Việc làm này, bạn sẽ thấy, ví dụ như icmp hướng dẫn từ mã IR thực hiện ở trên như:

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

ICmpInst là một lớp học đó là một phần của ++ API C sử dụng để tạo icmp hướng dẫn. Một tham chiếu tốt cho C++ API là Programmer's manual.

+0

Cảm ơn bạn đã phát lại.Bạn có thể cho tôi biết Khi nào và cách sử dụng API LLVM C++? – user1406531

+2

@ user1406531: Tôi hy vọng bạn nhận ra rằng câu hỏi của bạn quá chung chung. Tại sao bạn sử dụng LLVM? Để kết thúc? Bạn dự định xây dựng cái gì trên nó? Nếu bạn có câu trả lời chính xác cho những câu hỏi này, tôi nghĩ rằng sau khi dành thời gian đọc hướng dẫn và tài liệu LLVM, bạn sẽ nhận ra cách LLVM C++ API có thể giúp bạn –

2

Bạn có thể sử dụng chương trình phụ trợ CPP (llc -march=cpp) để tìm hiểu ánh xạ từ bất kỳ IR đã cho nào tới API C++.