2009-08-21 30 views
10

Tôi đã xem xét một số LLVM lắp ráp được sản xuất bởi llvm-gcc gần đây và tôi đã nhận thấy một tuyên bố định kỳ mà tôi không chắc chắn mục đích của nó.Mục đích của dòng% "alloca point" xuất hiện trong mã llvm là gì?

Ví dụ, chương trình C sau:

int main(void) 
{ 
    void (*f)(void) = (0x21332); 
    f(); 
} 

Khi biên soạn với "llvm-gcc -emit-llvm -S" sẽ tạo ra đoạn mã sau (phần không liên quan bị loại bỏ):

define i32 @main() nounwind { 
entry: 
    %retval = alloca i32  ; <i32*> [#uses=1] 
    %f = alloca void()*  ; <void()**> [#uses=2] 
    %"alloca point" = bitcast i32 0 to i32  ; <i32> [#uses=0] 
    store void()* inttoptr (i64 135986 to void()*), void()** %f, align 4 
    %0 = load void()** %f, align 4  ; <void()*> [#uses=1] 
    call void %0() nounwind 
    br label %return 

Tôi quan tâm đến mục đích của dòng:

%"alloca point" = bitcast i32 0 to i32  ; <i32> [#uses=0] 

Dường như không làm bất cứ điều gì làm biến nó gán cho không bao giờ được sử dụng một lần nữa và bản thân bitcast là vô nghĩa. Tất cả những gì tôi có thể nghĩ là nó được chèn vào thực tế như là một nop cho các mục đích tạo/phân tích mã sau này, cho thấy các phần thú vị của mã.

+0

Tôi cũng tò mò trong dòng này; Tôi chỉ chạy qua nó tối nay trong khi nhìn vào một số công cụ tạo mã. Nó dường như là ranh giới alloca, nhưng tôi không biết tại sao. – Albinofrenchy

Trả lời

8

Từ nguồn llvm-gcc: gcc/llvm-convert.cpp, nó chỉ được sử dụng như một giá trị trợ giúp * và nó sẽ bị xóa bởi thẻ vượt qua lệnh xóa.

// Create a dummy instruction in the entry block as a marker to insert new 
// alloc instructions before. It doesn't matter what this instruction is, 
// it is dead. This allows us to insert allocas in order without having to 
// scan for an insertion point. Use BitCast for int -> int 
+0

Có điều này là đúng. Cũng đã hỏi câu hỏi này về danh sách gửi thư của LLVM và nhận được sự tương tự, chính xác: "Có sẵn như là một trình giữ chỗ để chèn thời gian: alloca đi trước bitcast và tạo mã thực tế bắt đầu sau đó. instcombine sẽ loại bỏ nó, và về cơ bản mọi thứ khác sẽ đơn giản bỏ qua nó. " –

-1

Tìm thấy điều này trên internets: Allocas có kích thước có thể được xác định tại thời gian biên dịch sẽ được phân bổ không gian trên ngăn xếp khi kích thước khung ngăn xếp được tính toán. Đối với phân bổ có kích thước biến, mã cụ thể mục tiêu sẽ phải thay đổi kích thước ngăn xếp, điều chỉnh con trỏ khung và con trỏ ngăn xếp khi cần thiết và điều chỉnh vị trí cho các tham số đi tới đầu ngăn xếp.

âm thanh như ở đó để làm cho một số không gian ngăn xếp hoạt động chính xác.

+0

Câu hỏi không phải là về chính alloca. OP hỏi về lệnh có tên là "alloca point", có vẻ như là một no-op. –

Các vấn đề liên quan