GCC 4
Section: GNU Tools (1)
Updated: 2003/12/05
機器相關選項(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的組成部分.一般說來GCC使用該機型本地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 ranges) 進行處理.
- -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, 1000 和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, names.
- -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 Object 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或 real-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'選項.
下面的`-m'選項用于MIPS家族的計算機:
- -mcpu=cpu-type
- 生成指令的時候,假設默認的機器類型是cpu-type .默認情況下的cpu-type是 default, GCC將選取任何機型上都是最長周期時間的指令,這樣才能使代碼在所有的MIPS處理器上以合理 的速度運行. cpu-type的其他選擇是r2000, r3000, r4000,和 r6000.雖然選定某個cpu-type后, GCC將針對選定的芯片安排對應的工作,但是如果 不指定?? -mips2或-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instruction set architecture)一級的代碼.
- -mips2
- 輸出MIPS ISA二級指令(可能的擴展,如平方根指令). -mcpu=r4000或-mcpu=r6000 選項必須和-mips2聯用.
- -mips3
- 輸出MIPS ISA三級指令(64位指令). -mcpu=r4000選項必須和-mips2聯用. (譯注:疑為-mips3)
- -mint64
-
- -mlong64
-
- -mlonglong128
- 這些選項目前不起作用.
- -mmips-as
- 產生用于MIPS匯編器的代碼,同時使用mips-tfile添加普通的調試信息.對于大多數平臺這是 默認選項,除了OSF/1參考平臺,它使用OSF/rose目標格式.如果打開了任一個-ggdb, -gstabs,或-gstabs+選項開關, mips-tfile程序就把stab封裝在MIPS ECOFF里面.
- -mgas
- 產生用于GNU匯編器的代碼.在OSF/1參考平臺上這是默認選項,它使用OSF/rose目標格式.
- -mrnames
-
- -mno-rnames
- -mrnames開關選項告訴輸出代碼使用MIPS軟件名稱說明寄存器,而不是硬件名稱(就是說,用 a0代替$4). GNU匯編器不支持-mrnames選項,而MIPS匯編器則運行MIPS C預處理器處理源文件. -mno-rnames是默認選項.
- -mgpopt
-
- -mno-gpopt
- -mgpopt開關選項要求在正文段中把所有的數據聲明寫到指令前面,使各種MIPS匯編器對短類型全局 或靜態數據項(short global or static data items)輸出單字內存訪問而不是雙字內存訪問.當打開編譯優化 時,這是默認功能.
- -mstats
-
- -mno-stats
- 每次處理完非嵌入函數(non-inline function)后, -mstats開關選項使編譯器向標準錯誤文件 輸出一行關于程序的統計資料(保存的寄存器數目,堆棧大小,等等).
- -mmemcpy
-
- -mno-memcpy
- -mmemcpy開關選項使所有的塊移動操作調用適當的string函數(memcpy或 bcopy),而不是生成嵌入代碼.
- -mmips-tfile
-
- -mno-mips-tfile
- 當MIPS匯編器生成mips-tfile文件(用于幫助調試)后, -mno-mips-tfile 開關選項阻止編譯器使用mips-tfile后期處理(postprocess)目標文件.不運行 mips-tfile就沒有調試器關注的局部變量.另外, stage2和stage3目標文件將把 臨時文件名傳遞給匯編器,嵌在目標文件中,這意味著不比較目標文件是否相同.
- -msoft-float
- 輸出包含浮點庫調用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機型本地C編譯器的相應部件, 但是不能直接用于交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數.
- -mhard-float
- 輸出包含浮點指令.如果編譯器沒有被改動,這就是默認選項.
- -mfp64
- 編譯器認為狀態字的FR置位(on),也就是說存在32 64-bit浮點寄存器,而不是32 32-bit 浮點寄存器.同時必須打開-mcpu=r4000和-mips3開關.
- -mfp32
- 認為存在32 32-bit浮點寄存器.這是默認選項.
-mabicalls
- -mno-abicalls
- 輸出(或不輸出) .abicalls, .cpload,和.cprestore偽指令,某些 System V.4版本用于位置無關代碼.
- -mhalf-pic
-
- -mno-half-pic
- -mhalf-pic開關選項要求把外部引用的指針放到數據段,并且載入內存,而不放到正文段.該選項目前 不起作用.
- -G num
- 把小于等于num字節的全局或靜態數據放到小的數據段或bss段,而不是普通的數據段或bss段. 這樣匯編器可以輸出基于全局指針(gp或$28),的單字內存訪問指令而非普通的雙字指令.默認情況下, 用MIPS匯編器時num是8,而GNU匯編器則為0.另外, -Gnum選項也被傳遞 給匯編器和連接器.所有的模塊必須在相同的-Gnum值下編譯.
- -nocpp
- 匯編用戶匯編文件(帶有`.s'后綴)時,告訴MIPS匯編器不要運行預處理器.
下面的`-m'選項用于Intel 80386族計算機: -m486
- -mno-486
- 控制是否生成對486優化的代碼.
- -msoft-float
- 輸出包含浮點庫調用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機型本地C編譯器的相應部件, 但是不能直接用于交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數.
在函數把浮點返回值放在80387寄存器棧的機器上,即使設置了`-msoft-float'選項,也可能會發出 一些浮點操作碼.
- -mno-fp-ret-in-387
- 不用FPU寄存器返回函數值.
通常函數調用約定把float和double的返回值放在FPU寄存器中,即使不存在FPU. 這種作法的理念是操作系統應該仿真出FPU.
而`-mno-fp-ret-in-387'選項使浮點值通過普通的CPU寄存器返回.