-print-libgclearcase/" target="_blank" >cc-file-name
和`-print-file-name=libgcc.a'一樣.
-print-prog-name=program
類似於`-print-file-name',但是查找程序program如`cpp'.
優化選項(OPTIMIZATION OPTION)
這些選項控制多種優化措施:
-O
-O1
優化.對於大函數,優化編譯占用稍微多的時間和相當大的內存.
不使用`-O'選項時,編譯器的目標是減少編譯的開銷,使編譯結果能夠調試.語句是獨
立的:如果在 兩條語句之間用斷點中止程序,你可以對任何變量重新賦值,或者在函
數體內把程序計數器指到其他語句,以及從源程序中 精確地獲取你期待的結果.
不使用`-O'選項時,只有聲明了register的變量才分配使用寄存器.編譯結果比不用
`-O'選項的PCC要略遜一籌.
使用了`-O'選項,編譯器會試圖減少目標碼的大小和執行時間.
如果指定了`-O'選項, `-fthread-jumps'和`-fdefer-pop'選項將被 打開.在有del
ay slot的機器上, `-fdelayed-branch'選項將被打開.在即使沒有幀指針 (frame
pointer)也支持調試的機器上, `-fomit-frame-pointer'選項將被打開.某些機器上
還可能會打開其他選項.
-O2
多優化一些.除了涉及空間和速度交換的優化選項,執行幾乎所有的優化工作.例如不
進行循環展開(loop unrolling)和函數內嵌(inlining).和-O選項比較,這個選項既
增加了編譯時間,也提高了生成代碼的 運行效果.
-O3
優化的更多.除了打開-O2所做的一切,它還打開了-finline-functions選項.
-O0
不優化.
如果指定了多個-O選項,不管帶不帶數字,最後一個選項才是生效的選項.
諸如`-fflag'此類的選項描述一些機器無關的開關.大多數開關具有肯定和否定兩種
格式; `-ffoo'開關選項的否定格式應該是`-fno-foo'.下面的列表只展示了一種格
式---那個不是 默認選項的格式.你可以通過去掉或添加`no-'構造出另一種格式.
-ffloat-store
不要在寄存器中存放浮點變量.這樣可以防止某些機器上不希望的過高精度,如6800
0的浮點寄存器(來自 68881)保存的精度超過了double應該具有的精度.
對於大多數程序,過高精度只有好處.但是有些程序嚴格依賴於IEEE浮點數的定義.對
這樣的程序可以使用 `-ffloat-store'選項.
-fmemoize-lookups
-fsave-memoized
使用探索法(heuristic)進行更快的編譯(僅對C++).默認情況下不使用探索法.由於
探索法只對某些輸入文件 有效,其他程序的編譯速度會變得更慢.
第一次編譯器必須對成員函數(或對成員數據的引用)建立一個調用.它必須(1)判斷
出這個類是否實現了那個名字的 成員函數; (2)決定調用哪個成員函數(涉及到推測
需要做哪種類型轉換); (3)檢查成員函數對調用者是否可見.所有這些構成 更慢的
編譯.一般情形,第二次對成員函數(或對成員數據的引用)建立的調用,必須再次經過
相同長度的處理.這意味著象 這樣的代碼
cout << "This " << p << " has " << n << " legs.\n";
對整個三步驟要做六次遍歷.通過使用軟件緩存, ``命中''能夠顯著地減少這種代價
然而不幸的是,使用這種緩存 必須實現其他機制,帶來了它自己的開銷. `-fmemoi
ze-lookups'選項打開軟件緩存.
因為函數的正文環境不同,函數對成員和成員函數的訪問權(可見性)也可能不同, g
++可能需要刷新緩存. 使用`-fmemoize-lookups'選項,每編譯完一個函數就刷新緩
存.而`-fsave-memoized'選項 也啟用同樣的緩存,但是當編譯器發覺最後編譯的函
數的正文環境產生的訪問權和下一個待編譯的函數相同,編譯器就 保留緩存內容.這
對某個類定義許多成員函數時非常有用:除了某些其他類的友函數,每個成員函數擁
有和其他成員函數完全一樣 的訪問權,因而無需刷新緩存.
-fno-default-inline
默認為不要把成員函數內嵌,因為它們定義在類的作用域內(僅C++).
-fno-defer-pop
一旦函數返回,參數就立即彈出.對於那些調用函數後必須彈出參數的機器,編譯器一
般情況下讓幾次函數調用的參數 堆積在棧上,然後一次全部彈出.
-fforce-mem
做數學運算前把將要使用的內存操作數送入寄存器.通過把內存訪問轉換成潛在的公
共子表達式,它可能產生較好的目標碼. 如果它們不是公共子表達式,指令組合應該
消除各自的寄存器載荷.我樂意傾聽不同意見.
-fforce-addr
做數學運算前把將要使用的內存地址常數送入寄存器.它可能和`-fforce-mem'一樣
產生較好的 目標碼.我樂意傾聽不同意見.
-fomit-frame-pointer
對於不需要幀指針(frame pointer)的函數,不要在寄存器中保存幀指針.這樣能夠避
免保存,設置和恢復 幀指針的指令;同時對許多函數提供一個額外的寄存器. 但是在
大多數機器上將無法調試.
某些機器上,如Vax,這個選項無效,因為標准調用序列自動處理幀指針,通過假裝不存
在而不保存任何東西.機器描述宏 FRAME_POINTER_REQUIRED控制目標機是否支持這
個選項.
-finline-functions
把所有簡單的函數集成進調用者.編譯器探索式地決定哪些函數足夠簡單,值得這種
集成.
如果集成了所有給定函數的調用,而且函數聲明為static,那麼一般說來GCC有權不按
匯編代碼輸出函數.
-fcaller-saves
允許在寄存器裡分配數值,但是這個方案通常受到各個函數調用的沖擊,因此GCC生成
額外的代碼,在函數調用的 前後保存和復原寄存器內容.僅當生成代碼看上去優於反
之結果時才實現這樣的分配.
某些機器上該選項默認為允許,通常這些機器沒有調用保護寄存器代替使用.
-fkeep-inline-functions
即使集成了某個函數的所有調用,而且該函數聲明為static,仍然輸出這個函數一個
獨立的,運行時可調用 的版本.
-fno-function-cse
不要把函數地址存入寄存器;讓調用固定函數的指令顯式給出函數地址.
這個選項產生效率較低的目標碼,但是如果不用這個選項,某些不尋常的hack,改變匯
編器的輸出,可能因優化而帶來 困惑.
-fno-peephole
禁止任何機器相關的peephole優化.
-ffast-math
這個選項出於速度優化,允許GCC違反某些ANSI或IEEE規則/規格.例如,它允許編譯器
假設sqrt 函數的參數是非負數.
這個選項不被任何`-O'選項打開,因為對於嚴格依靠IEEE或ANSI規則/規格實現的數
學函數,程序可能 會產生錯誤的結果.
下列選項控制特定的優化. `-O2'選項打開下面的大多數優化項,除了`-funroll-lo
ops'和 `-funroll-all-loops'項.
而`-O'選項通常打開`-fthread-jumps'和`-fdelayed-branch' 優化項,但是特定的
機器上的默認優化項有可能改變.
如果特別情況下非常需要``微調''優化,你可以使用下面的選項.
-fstrength-reduce
執行循環強度縮小(loop strength reduction)優化,並且消除重復變量.
-fthread-jumps
執行優化的地點是,如果某個跳轉分支的目的地存在另一個條件比較,而且該條件比
較包含在前一個比較語句之內,那麼 執行優化.根據條件是true或者false,前面那條
分支重定向到第二條分支的目的地或者緊跟在第二條分支後面.
-funroll-loops
執行循環展開(loop unrolling)優化.僅對循環次數能夠在編譯時或運行時確定的循
環實行.
-funroll-all-loops
執行循環展開(loop unrolling)優化.對所有循環實行.通常使程序運行的更慢.
-fcse-follow-jumps
在公共子表達式消元(common subexpression elimination)的時候,如果沒有其他路
徑到達某個跳轉的 目的地,就掃過這條jump指令.例如,如果CSE遇到帶有else從句的
if語句,當條件測試為 false時, CSE就跟在jump後面.
-fcse-skip-blocks
它類似於`-fcse-follow-jumps'選項,但是CSE跟在條件跳轉後面,條件跳轉跳過了
語句塊(block).如果CSE遇到一條簡單的if語句,不帶else從句, `-fcse-skip-bloc
ks'選項將導致CSE跟在if產生的跳轉後面.
-frerun-cse-after-loop
執行循環優化後,重新進行公共子表達式消元.
-felide-constructors
如果看上去合理就省略構造子(僅C++).根據這個選項,對於下面的代碼, GNU C++直
接從調用foo 初始化y,而無需通過臨時變量:
A foo (); A y = foo ();
如果沒有這個選項, GNU C++首先通過調用類型A 合適的構造子初始化y;然後把 fo
o的結果賦給臨時變量;最後,用臨時變量替換`y'的初始值.
ANSI C++標准草案規定了默認行為(`-fno-elide-constructors').如果程序的構造
子存在 副效應, `-felide-constructors'選項能夠使程序有不同的表現,因為可能
忽略一些構造子的調用.
-fexpensive-optimizations
執行一些相對開銷較大的次要優化.
-fdelayed-branch
如果對目標機支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed bra
nch)指令後面的指令空隙.
-fschedule-insns
如果對目標機支持這個功能,它試圖重新排列指令,以便消除因數據未緒造成的執行
停頓.這可以幫助浮點運算或內存訪問 較慢的機器調取指令,允許其他指令先執行,
直到調取指令或浮點運算完成.
-fschedule-insns2
類似於`-fschedule-insns'選項,但是在寄存器分配完成後,需要一個額外的指令調
度過程.對於 寄存器數目相對較少,而且取內存指令大於一個周期的機器,這個選項
特別有用.
目標機選項(TARGET OPTION)
缺省情況下, GNU CC編譯出本機類型的目標碼.然而也可以把他安裝成交叉編譯器,
為其他機型編譯程序.事實上,針對不同的目標機,可以同時安裝GNU CC相應的配置
然後用`-b'選項指定 目標機種.
順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)
為缺省版本,但是有時候你希望使用 其他版本.
-b machine
參數machine指出編譯的目標機種.這個選項用於安裝為交叉編譯器的GNU CC.
參數machine的值和配置GNU CC交叉編譯器時設置的機器類型一樣.例如,如果交叉編
譯器配置有 `configure i386v',意思是編譯80386上的System V目標碼,那麼你可以
通過`-b i386v'運行交叉編譯器.
如果沒有指定`-b'選項,通常指編譯本機目標碼.
-V version
參數version指出運行哪個版本的GNU CC.這個選項用於安裝了多個版本的GCC.例如
,如果 version是`2.0',意味著運行GNU CC 2.0版.
如果沒有指定`-V'選項,缺省版本取決於GNU CC的安裝方式,一般說來推薦使用通用
版本.
機器相關選項(MACHINE DEPENDENT OPTION)
每一種目標機型都有自己的特別選項,這些選項用`-m '開關引導,選擇不同的硬件型
號或配置---例如, 68010還是68020,有沒有浮點協處理器.通過指定選項,安裝 編譯
器的一個版本能夠為所有的型號或配置進行編譯.
此外,編譯器的某些配置支持附加的特殊選項,通常是為了在命令行上兼容這個平台
的其他編譯器.
下面是針對68000系列定義的`-m'選項:
-m68000
-mc68000
輸出68000的目標碼.如果編譯器按基於68000的系統配置,這個選項就是缺省選項.
-m68020
-mc68020
輸出68020的目標碼(而不是68000).如果編譯器按基於68020的系統配置,這個選項就
是缺省選項.
-m68881
輸出包含68881浮點指令的目標碼.對於大多數基於68020的系統這是缺省選項,除非
設置編譯器時指定了 -nfp .
-m68030
輸出68030的目標碼.如果編譯器按基於68030的系統配置,這個選項就是缺省選項.
-m68040
輸出68040的目標碼.如果編譯器按基於68040的系統配置,這個選項就是缺省選項.
-m68020-40
輸出68040的目標碼,但是不使用新指令.生成的代碼可以在68020/68881上,也可以在
68030或 68040上較有效地運行.
-mfpa
輸出包含SUN FPA浮點指令的目標碼.
-msoft-float
輸出包含浮點庫調用的目標碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GC
C使用該機型本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自
己管理提供合適的函數庫用於交叉編譯.
-mshort
認為int類型是16位寬,相當於short int.
-mnobitfield
不使用位域(bit-field)指令. `-m68000'隱含指定了`-mnobitfield'.
-mbitfield
使用位域指令. `-m68020'隱含指定了`-mbitfield'.如果你使用未改裝的gcc,這就
是 默認選項.
-mrtd
采用另一種函數調用約定,函數接受固定數目的參數,用rtd指令返回,該指令返回時
彈出棧內的參數.這個 方法能夠使調用者節省一條指令,因為他這裡不需要彈出參數
這種調用約定不兼容UNIX的正常調用.因此如果你需要調用UNIX編譯器編譯的庫函數
,你就不能使用這個選項.
此外,所有參數數量可變地函數必須提供函數原型(包括printf);否則編譯器會生成
錯誤的調用代碼.
另外,如果調用函數時攜帶了過多的參數,編譯器將生成嚴重錯誤的代碼. (正常情況
下,多余的參數被安全無害的忽略.)
68010和68020處理器支持rtd指令,但是68000不支持.
下面是針對VAX定義的`-m'選項:
-munix
禁止輸出某些跳轉指令(aobleq等等), VAX的UNIX匯編器無法跨越長范圍(long ran
ges) 進行處理.
-mgnu
如果使用GNU匯編器,則輸出那些跳轉指令,
-mg
輸出g-format浮點數,取代d-format.
下面是SPARC支持的`-m'選項開關:
-mfpu
-mhard-float
輸出包含浮點指令的目標碼.這是缺省選項.
-mno-fpu
-msoft-float
輸出包含浮點庫調用的目標碼. 警告:沒有為SPARC提供GNU浮點庫.一般說來使用該
機型本地C編譯器 的相應部件,但是不能直接用於交叉編譯.你必須自己安排,提供用
於交叉編譯的庫函數.
-msoft-float改變了輸出文件中的調用約定;因此只有用這個選項編譯整個程序才有
意義.
-mno-epilogue
-mepilogue
使用-mepilogue (缺省)選項時,編譯器總是把函數的退出代碼放在函數的尾部.任何
在函數中間 的退出語句(例如C中的return語句)將產生出跳轉指令指向函數尾部.
使用-mno-epilogue選項時,編譯器盡量在每個函數退出點嵌入退出代碼.
-mno-v8
-mv8
-msparclite
這三個選項選擇不同種類的SPARC系統.
默認情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7目標碼.
-mv8生成SPARC v8目標碼.他和v7目標碼唯一的區別是,編譯器生成整數乘法和整數
除法指令, SPARC v8支持該指令,而v7體系不支持.
-msparclite生成SPARClite目標碼.增加了SPARClite支持的整數乘法,整數除法單步
掃描 (integer divide step and scan (ffs))指令. v7體系不支持這些指令.
-mcypress
-msupersparc
這兩個選項選擇處理器型號,針對處理器進行代碼優化.
-mcypress選項(默認項)使編譯器對Cypress CY7C602芯片優化代碼, SparcStation
/SparcServer 3xx系列使用這種芯片.該選項也適用於老式的SparcStation 1, 2,
IPX 等機型..
-msupersparc選項使編譯器對SuperSparc處理器優化代碼, SparcStation 10, 100
0 和2000系列使用這種芯片.同時該選項啟用完整的SPARC v8指令集.
下面是針對Convex定義的`-m'選項:
-mc1
輸出C1的目標碼.當編譯器對C1配置時,這是默認選項.
-mc2
輸出C2的目標碼.當編譯器對C2配置時,這是默認選項.
-margcount
在每個參數列表的前面放置一個參數計數字(argument count word).某些不可移植
的Convex和Vax 程序需要這個參數計數字. (調試器不需要他,除非函數帶有變長參
數列表;這個信息存放在符號表中.)
-mnoargcount
忽略參數計數字.如果你使用未改裝的gcc,這是默認選項.
下面是針對AMD Am29000定義的`-m'選項:
-mdw
生成的目標碼認為DW置位,就是說,字節和半字操作由硬件直接支持.該選項是默認選
項.
-mnodw
生成的目標碼認為DW沒有置位.
-mbw
生成的目標碼認為系統支持字節和半字寫操作.該選項是默認選項.
-mnbw
生成的目標碼認為系統不支持字節和半字寫操作.該選項隱含開啟了`-mnodw'選項.
-msmall
使用小內存模式,小內存模式假設所有函數的地址位於某個256 KB段內,或者所有函
數的絕對地址小於256K.這樣 就可以用call指令代替const, consth, calli指令序
列.
-mlarge
假設不能使用call指令;這是默認選項.
-m29050
輸出Am29050的目標碼.
-m29000
輸出Am29000的目標碼.這是默認選項.
-mkernel-registers
生成的目標碼引用gr64-gr95寄存器而不是gr96-gr127寄存器.該選項可以用於編譯
內核代碼,內核需要一組全局寄存器,這些全局寄存器和用戶模式使用的寄存器完全
無關.
注意,使用這個選項時, `-f'選項中的寄存器名字必須是normal, user-mode, name
s.
-muser-registers
使用普通全局寄存器集gr96-gr127.這是默認選項.
-mstack-check
在每次堆棧調整後插入一條__msp_check調用.這個選項常用於內核代碼.
下面是針對Motorola 88K體系定義的`-m'選項:
-m88000
生成的目標碼可以在m88100和m88110上正常工作.
-m88100
生成的目標碼在m88100上工作的最好,但也可以在m88110上運行.
-m88110
生成的目標碼在m88110上工作的最好,可能不能在m88100上運行.
-midentify-revision
在匯編器的輸出端包含一條ident指令,記錄源文件名,編譯器名字和版本,時標,以及
使用的編譯選項,
-mno-underscores
在匯編器的輸出端,符號名字前面不添加下劃線.默認情況是在每個名字前面增加下
劃線前綴.
-mno-check-zero-division
-mcheck-zero-division
早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些
選項可以避免包含(或可以 顯明包含)附加的代碼,這些代碼能夠檢查除零錯,發送例
外信號. GCC所有88K的配置默認使用 `-mcheck-zero-division'選項.
-mocs-debug-info
-mno-ocs-debug-info
包含(或忽略)附加的調試信息(關於每個棧架結構中寄存器的使用), 88Open Objec
t Compatibility Standard, ``OCS'',對此信息做了說明. GDB不需要這些額外信息
DG/UX, SVr4,和Delta 88 SVr3.2的默認配置是包含調試信息,其他88k機型的默認
配置是忽略這個信息.
-mocs-frame-position
-mno-ocs-frame-position
強制(或不要求)把寄存器值存儲到棧架結構中的指定位置(按OCS的說明). DG/UX,
Delta88 SVr3.2和 BCS的默認配置使用`-mocs-frame-position'選項;其他88k機型
的默認配置是 `-mno-ocs-frame-position'.
-moptimize-arg-area
-mno-optimize-arg-area
控制如何在堆棧結構中存儲函數參數. `-moptimize-arg-area'節省空間,但是有可
能宕掉某些 調試器(不是GDB). `-mno-optimize-arg-area'證實比標准選項好.默認
情況下GCC不優化參數域.
-mshort-data-
num通過和r0關聯,產生較小的數據引用(data reference),這樣就可以用單指令調入
一個數值(而不是平常的雙指令).用戶通過選項中的num控制改變哪種數據引用.例
如,如果你指定了 `-mshort-data-512',那麼受影響的數據引用是小於512字節的數
據移動. -mshort-data-num選項對大於64K的num 無效.
-mserialize-volatile
-mno-serialize-volatile
產生,或不產生代碼來保證對易變內存訪問的結果一致.
對於常用的處理器子型號, GNU CC始終默認保證這種一致性.如何實現結果一致取決
於處理器子型號.
m88100處理器不對內存引用重新安排,因此訪問結果始終一致.如果使用了`-m88100
'選項, GNU CC 不產生任何針對結果一致的特別指令.
m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指
令可能在先前的存儲指令之前執行. 多處理器環境下,亂序訪問擾亂了易變內存訪問
的結果一致.因此當使用`-m88000'或`-m88110' 選項時, GNU CC在適當的時候產生
特別的指令迫使執行順序正確.
這些用於保證一致性的額外代碼有可能影響程序的性能.如果你確認能夠安全地放棄
這種保證,你可以使用 `-mno-serialize-volatile'選項.
如果你使用`-m88100'選項,但是需要在m88110處理器上運行時的結果一致,你應該加
上 `-mserialize-volatile'選項.
-msvr4
-msvr3
打開(`-msvr4')或關閉(`-msvr3')和System V第四版(SVr4)相關的 編譯器擴展.效
果如下:
*
輸出哪種匯編語法(你可以使用`-mversion-03.00'選項單獨選擇).
*
`-msvr4'使C預處理器識別`#pragma weak'指令
*
`-msvr4'使GCC輸出額外的聲明指令(declaration directive),用於SVr4.
除了SVr4配置, `-msvr3'是所有m88K配置的默認選項.
-mtrap-large-shift
-mhandle-large-shift
包含一些指令,用於檢測大於31位的位移(bit-shift);根據相應的選項,對這樣的位
移發出自陷 (trap)或執行適當的處理代碼.默認情況下, GCC對大位移不做特別處理
-muse-div-instruction
很早以前的88K型號沒有(div)除法指令,因此默認情況下GCC避免產生這條指令.而這
個選項告訴GCC該指令是 安全的.
-mversion-03.00
在DG/UX配置中存在兩種風格的SVr4.這個選項修改-msvr4 ,選擇hybrid-COFF或 re
al-ELF風格.其他配置均忽略該選項.
-mwarn-passed-structs
如果某個函數把結構當做參數或結果傳遞, GCC發出警告.隨著C語言的發展,人們已
經改變了傳遞結構的約定, 它往往導致移植問題.默認情況下, GCC不會發出警告.
下面的選項用於IBM RS6000:
-mfp-in-toc
-mno-fp-in-toc
控制是否把浮點常量放到內容表(TOC)中,內容表存放所有的全局變量和函數地址.默
認情況下, GCC把浮點常量放到 這裡;如果TOC溢出, `-mno-fp-in-toc'選項能夠減
少TOC的大小,這樣就可以避免溢出.
下面的`-m'選項用於IBM RT PC:
-min-line-mul
對於整數乘法使用嵌入代碼.這是默認選項.
-mcall-lib-mul
對於整數乘法使用lmul$$ .
-mfull-fp-blocks
生成全尺寸浮點數據塊,包括IBM建議的最少數量的活動空間(scratch space).這是
默認選項.
-mminimum-fp-blocks
不要在浮點數據塊中包括額外的活動空間.這樣就產生較小但是略慢的可執行程序,
因為活動空間必須動態分配.
-mfp-arg-in-fpregs
采用不兼容IBM調用約定的調用序列,通過浮點寄存器傳送浮點參數.注意,如果指定
了這個選項, varargs.h和stdargs.h將無法支持浮點單元.
-mfp-arg-in-gregs
使用正常的調用約定處理浮點參數.這是默認選項.
-mhc-struct-return
通過內存返回大於一個字的結構,而不是通過寄存器.用於兼容MetaWare HighC (hc
)編譯器.使用 `-fpcc-struct-return'選項可以兼容Portable C編譯器(pcc).
-mnohc-struct-return
如果可以,通過寄存器返回某些大於一個字的結構.這是默認選項.如果打算兼容IBM
提供的編譯器,請使用 `-fpcc-struct-return'或`-mhc-struct-return'選項.