gcc手册四

gcc手册四

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.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 汇编器时 num 是 8, 而 GNU 汇编器则为 0. 另外 , -G num 选项也被传递 给汇编器和连接器 . 所有的模块必须在相同的 -G num 值下编译 .

 

-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寄存器返回.

你可能感兴趣的:(gcc手册四)