2013-08-14 30 views
8

Tôi đang cố gắng tìm ra tùy chọn trình biên dịch nào được kích hoạt cho GCC (4.7.3, cài đặt Macports trên Mac OS X 10.6.8). Tôi biết các phương pháp sau:Tùy chọn trình biên dịch GCC: bộ tùy chọn được bật nào là chính xác?

  1. Sử dụng tùy chọn -Q với một tập tin đầu vào đơn giản như đề nghị của GCC 4.3.3 compiler options enabled:

    gcc -Q -v -o hello hello.c 
    
  2. Sử dụng -Q --help = x kết hợp (đối với các giá trị của x, xem GCC documentation) ví dụ:

    gcc -Q --help=target 
    
  3. Để xem định nghĩa được kích hoạt:

    01.235.
    echo "" | gcc -E -dM - | sort 
    

Tuy nhiên, khi tôi chạy phương pháp 1 và 2 với cùng một bộ tùy chọn tối ưu tôi nhận được hai bộ tùy chọn bật/tắt khác nhau.

$ gcc -Q -v -O3 -march=native -o hello hello.c 

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
options passed: -v -D__DYNAMIC__ hello.c -march=corei7-avx -mcx16 -msahf 
-mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 
-mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 
-mno-lzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=32 
--param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx 
-fPIC -mmacosx-version-min=10.6.8 -O3 
options enabled: -Wnonportable-cfstrings -fPIC -falign-labels 
-fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg 
-fcaller-saves -fcombine-stack-adjustments -fcommon -fcompare-elim 
-fcprop-registers -fcrossjumping -fcse-follow-jumps -fdebug-types-section 
-fdefer-pop -fdelete-null-pointer-checks -fdevirtualize -fearly-inlining 
... 

trong khi

$ gcc -Q -O3 -march=native --help=optimizers 

-falign-functions     [enabled] 
-falign-jumps      [enabled] 
-falign-labels      [enabled] 
-falign-loops      [enabled] 
-fasynchronous-unwind-tables  [enabled] 
-fbranch-count-reg     [enabled] 
-fbranch-probabilities    [disabled] 
-fbranch-target-load-optimize  [disabled] 
-fbranch-target-load-optimize2  [disabled] 
-fbtr-bb-exclusive     [disabled] 
-fcaller-saves      [enabled] 
-fcombine-stack-adjustments   [enabled] 
-fcommon       [enabled] 
-fcompare-elim      [enabled] 
-fconserve-stack     [disabled] 
-fcprop-registers     [enabled] 
-fcrossjumping      [enabled] 
-fcse-follow-jumps     [enabled] 
-fcx-fortran-rules     [disabled] 
-fcx-limited-range     [disabled] 
-fdata-sections      [disabled] 
-fdce        [enabled] 
-fdefer-pop       [enabled] 
-fdelayed-branch     [disabled] 
-fdelete-null-pointer-checks  [enabled] 
-fdevirtualize      [enabled] 
-fdse        [enabled] 
-fearly-inlining     [enabled] 
... 

Nhìn vào tùy chọn -falign chức năng, -falign-nhảy, -falign-nhãn và -falign-vòng Phương pháp 2 tuyên bố tất cả họ đã được kích hoạt, trong khi Phương pháp 1 nói chỉ -falign-label được kích hoạt. Tùy chọn -fdce và -fdse được bật theo Phương pháp 2 nhưng không được bật theo Phương pháp 1.

Câu hỏi: Tôi nên tin tưởng phương pháp nào?

Lưu ý bên: danh sách phương pháp 2 không đầy đủ, vì các tùy chọn được nhóm và chỉ (các) nhóm được yêu cầu với tùy chọn --help = được liệt kê. Để xem tất cả tùy chọn trong phương pháp 2 chạy:

$ gcc -Q -O3 -march=native --help=optimizers --help=target --help=c 
--help=common --help=warnings | sort 

Trả lời

1

Từ tài liệu GCC:

--help = {class | [^] vòng loại} [, ...] In (trên đầu ra tiêu chuẩn) mô tả các tùy chọn dòng lệnh được trình biên dịch hiểu phù hợp với tất cả các lớp và vòng loại được chỉ định.

trong khi

Nếu tùy chọn -Q xuất hiện trên dòng lệnh trước khi --help = tùy chọn, sau đó các văn bản mô tả được hiển thị bởi --help = được thay đổi. Thay vì mô tả các tùy chọn được hiển thị, chỉ báo được cho là cho dù tùy chọn được bật, tắt hay được đặt thành giá trị cụ thể (giả sử rằng trình biên dịch biết điều này tại thời điểm tùy chọn --help = được sử dụng)

dường như --help đơn giản chỉ ra đó lựa chọn một thể cho phép, trong khi -Q cho phép một để xem nếu nó thực sự được kích hoạt.Ngoài ra:

Đầu ra là nhạy cảm với những tác động của dòng lệnh trước tùy chọn

+0

Thật vậy, -Q đổi đầu ra để hiển thị những tùy chọn được kích hoạt và nó được sử dụng trong cả hai phương pháp 1 và 2 Câu hỏi đặt ra là, tuy nhiên, tại sao các kết quả lại khác nhau khi cung cấp một tệp nguồn C đơn giản (phương thức 1) hoặc --help (phương pháp 2). Phương pháp 1 có đơn giản là không đầy đủ? – zan

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