2007年12月4日星期二

GCC 手册 4



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,也可以在6803068040上较有效地运行.

-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);否则编译器会生成错误的调用代码.

另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况下,多余的参数被安全无害的忽略.)

6801068020处理器支持rtd指令,但是68000不支持.

下面是针对VAX定义的`-m'选项:

-munix
禁止输出某些跳转指令(aobleq等等), VAXUNIX汇编器无法跨越长范围(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).某些不可移植的ConvexVax 程序需要这个参数计数字. (调试器不需要他,除非函数带有变长参数列表;这个信息存放在符号表中.)

-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
生成的目标码可以在m88100m88110上正常工作.
-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.2BCS的默认配置使用`-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选项对大于64Knum 无效.

-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-COFFreal-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.hstdargs.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-typedefault, 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函数(memcpybcopy),而不是生成嵌入代码.

-mmips-tfile
-mno-mips-tfile
MIPS汇编器生成mips-tfile文件(用于帮助调试), -mno-mips-tfile 开关选项阻止编译器使用mips-tfile后期处理(postprocess)目标文件.不运行 mips-tfile就没有调试器关注的局部变量.另外, stage2stage3目标文件将把 临时文件名传递给汇编器,嵌在目标文件中,这意味着不比较目标文件是否相同.

-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汇编器时num8,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寄存器返回函数值.

通常函数调用约定把floatdouble的返回值放在FPU寄存器中,即使不存在FPU. 这种作法的理念是操作系统应该仿真出FPU.

`-mno-fp-ret-in-387'选项使浮点值通过普通的CPU寄存器返回.



没有评论: