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?
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
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
Để 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
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