2011-02-04 39 views
8

Tôi đang biên soạn chương trình C này và so sánh các mã lắp ráp tạo:Tại sao LLVM thêm hai hướng dẫn bổ sung cho cùng một chương trình?

int main(){ return 0; } 

GCC cho chức năng này chính (cc hello.c -S):

_main: 
LFB2: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    movl $0, %eax 
    leave 
    ret 

LLVM cho chức năng chính này (clang hello.c -S):

_main: 
Leh_func_begin0: 
    pushq %rbp 
Ltmp0: 
    movq %rsp, %rbp 
Ltmp1: 
    movl $0, %eax 
    movl $0, -4(%rbp) 
    popq %rbp 
    ret 
Leh_func_end0: 

movl $0, -4(%rbp)popq %rbp cần thiết cho mục đích gì? Di chuyển một cái gì đó trên ngăn xếp và popping nó trực tiếp sau đó có vẻ vô dụng với tôi.

+10

Có vẻ như một chút không công bằng khi so sánh đầu ra của trình biên dịch mà không sử dụng trình tối ưu hóa. –

Trả lời

9

Trên thực tế, chúng có thể so sánh. Nghỉ là một hướng dẫn cao cấp:

Từ hướng dẫn Intel:

16-bit: C9 LEAVE A Valid Valid Set SP to BP, then pop BP. 
32-bit: C9 LEAVE A N.E. Valid Set ESP to EBP, then pop EBP. 
64-bit: C9 LEAVE A Valid N.E. Set RSP to RBP, then pop RBP. 

về cơ bản, nghỉ là tương đương với

movq %rbp, %rsp 
popq %rbp 
+1

Như tôi đã hiểu, 'leave' không đắt hơn hay ít hơn so với' mov'/'pop' giống hệt nhau, nhưng' enter' thì đắt hơn so với chỉ 'add' ing vào con trỏ stack. –

+0

Điều đó giải thích tại sao tôi hầu như không bao giờ thấy một trình biên dịch tạo ra các lệnh 'enter' ... –

2

Dường như LLVM đang sử dụng một chức năng truyền thống prolog/Epilog, trong khi GCC là lợi dụng thực tế là điểm mấu chốt không cần phải dọn dẹp

+0

Ahah, vì vậy GCC luôn cho rằng chức năng chính của tôi là điểm khởi đầu, nhưng LLVM thì không? –

+0

Không, gcc đang lợi dụng thực tế là nội dung chức năng trống. –

+3

Tôi không đồng ý về cả hai số. 'eax' đang được thiết lập, epilog vẫn xảy ra thông qua' leave'. Việc thực hiện hiệu quả nhất là 'movl $ 0, $ eax' rồi' ret', không làm phiền với ngăn xếp. Đó là những gì gcc thực hiện trên '-O3', điều này thực sự lợi dụng một chức năng thực tế trống rỗng. Như là, hai là tương đương, mặc dù tôi không biết làm thế nào đắt tiền để lại được so với mov/pop. –

9

Các hướng dẫn movl $0, -4(%rbp) là chết, bởi vì đây là mã được tối ưu hóa. Hãy thử chuyển qua số -O cho cả hai trình biên dịch để xem những thay đổi nào.

+2

Chris tìm kiếm các trích dẫn" mã "khi bạn viết các bit mã. –

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