机器相关选项(MACHINE DEPENDENT OPTION)
每一种目标机型都有自己的特别选项 , 这些选项用 `-m ' 开关引导 , 选择不同的硬件型号或配置 --- 例如 , 68010 还是 68020, 有没有浮点协处理器 . 通过指定选项 , 安装 编译器的一个版本能够为所有的型号或配置进行编译 .
此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台的其他编译器.
下面是针对68000系列定义的`-m'选项:
-
-m68000
- -mc68000
-
输出
68000
的目标码
.
如果编译器按基于
68000
的系统配置
,
这个选项就是缺省选项
.
- -mc68020
-
输出
68020
的目标码
(
而不是
68000).
如果编译器按基于
68020
的系统配置
,
这个选项就是缺省选项
.
-
输出包含
68881
浮点指令的目标码
.
对于大多数基于
68020
的系统这是缺省选项
,
除非设置编译器时指定了
-nfp .
-
输出
68030
的目标码
.
如果编译器按基于
68030
的系统配置
,
这个选项就是缺省选项
.
-
输出
68040
的目标码
.
如果编译器按基于
68040
的系统配置
,
这个选项就是缺省选项
.
-
输出
68040
的目标码
,
但是不使用新指令
.
生成的代码可以在
68020/68881
上
,
也可以在
68030
或
68040
上较有效地运行
.
-
输出包含
SUN FPA
浮点指令的目标码
.
-
输出包含浮点库调用的目标码
.
警告:
所需的库不是
GNU CC
的组成部分
.
一般说来
GCC
使用该机型本地
C
编译器的相应部件
,
但是作交叉编译时却不能直接使用
.
你必须自己管理提供合适的函数库用于交叉编译
.
-
认为
int
类型是
16
位宽
,
相当于
short int.
-
不使用位域
(bit-field)
指令
. `-m68000'
隐含指定了
`-mnobitfield'.
-
使用位域指令
. `-m68020'
隐含指定了
`-mbitfield'.
如果你使用未改装的
gcc,
这就是 默认选项
.
-
采用另一种函数调用约定
,
函数接受固定数目的参数
,
用
rtd
指令返回
,
该指令返回时弹出栈内的参数
.
这个 方法能够使调用者节省一条指令
,
因为他这里不需要弹出参数
.
这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数,你就不能使用这个选项.
此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成错误的调用代码.
另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况下,多余的参数被安全无害的忽略.)
68010和68020处理器支持rtd指令,但是68000不支持.
下面是针对VAX定义的`-m'选项:
-
-munix
-
禁止输出某些跳转指令
(aobleq
等等
), VAX
的
UNIX
汇编器无法跨越长范围
(long ranges)
进行处理
.
-
如果使用
GNU
汇编器
,
则输出那些跳转指令
,
-
输出
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
程序需要这个参数计数字
. (
调试器不需要他
,
除非函数带有变长参数列表
;
这个信息存放在符号表中
.)
-
忽略参数计数字
.
如果你使用未改装的
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
不优化参数域
.
-
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
对大位移不做特别处理
.
-
很早以前的
88K
型号没有
(div)
除法指令
,
因此默认情况下
GCC
避免产生这条指令
.
而这个选项告诉
GCC
该指令是 安全的
.
-
在
DG/UX
配置中存在两种风格的
SVr4.
这个选项修改
-msvr4 ,
选择
hybrid-COFF
或
real-ELF
风格
.
其他配置均忽略该选项
.
-
如果某个函数把结构当做参数或结果传递
, 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
将无法支持浮点单元
.
-
使用正常的调用约定处理浮点参数
.
这是默认选项
.
-
通过内存返回大于一个字的结构
,
而不是通过寄存器
.
用于兼容
MetaWare HighC (hc)
编译器
.
使用
`-fpcc-struct-return'
选项可以兼容
Portable C
编译器
(pcc).
-
如果可以
,
通过寄存器返回某些大于一个字的结构
.
这是默认选项
.
如果打算兼容
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)
一级的代码
.
-
输出
MIPS ISA
二级指令
(
可能的扩展
,
如平方根指令
). -mcpu=r4000
或
-mcpu=r6000
选项必须和
-mips2
联用
.
-
输出
MIPS ISA
三级指令
(64
位指令
). -mcpu=r4000
选项必须和
-mips2
联用
. (
译注
:
疑为
-mips3)
- -mlong64
- -mlonglong128
-
这些选项目前不起作用
.
-
产生用于
MIPS
汇编器的代码
,
同时使用
mips-tfile
添加普通的调试信息
.
对于大多数平台这是 默认选项
,
除了
OSF/1
参考平台
,
它使用
OSF/rose
目标格式
.
如果打开了任一个
-ggdb, -gstabs,
或
-gstabs+
选项开关
, mips-tfile
程序就把
stab
封装在
MIPS ECOFF
里面
.
-
产生用于
GNU
汇编器的代码
.
在
OSF/1
参考平台上这是默认选项
,
它使用
OSF/rose
目标格式
.
- -mno-rnames
-
-mrnames
开关选项告诉输出代码使用
MIPS
软件名称说明寄存器
,
而不是硬件名称
(
就是说
,
用
a0
代替
$4). GNU
汇编器不支持
-mrnames
选项
,
而
MIPS
汇编器则运行
MIPS C
预处理器处理源文件
. -mno-rnames
是默认选项
.
- -mno-gpopt
-
-mgpopt
开关选项要求在正文段中把所有的数据声明写到指令前面
,
使各种
MIPS
汇编器对短类型全局 或静态数据项
(short global or static data items)
输出单字内存访问而不是双字内存访问
.
当打开编译优化 时
,
这是默认功能
.
- -mno-stats
-
每次处理完非嵌入函数
(non-inline function)
后
, -mstats
开关选项使编译器向标准错误文件 输出一行关于程序的统计资料
(
保存的寄存器数目
,
堆栈大小
,
等等
).
- -mno-memcpy
-
-mmemcpy
开关选项使所有的块移动操作调用适当的
string
函数
(memcpy
或
bcopy),
而不是生成嵌入代码
.
- -mno-mips-tfile
-
当
MIPS
汇编器生成
mips-tfile
文件
(
用于帮助调试
)
后
, -mno-mips-tfile
开关选项阻止编译器使用
mips-tfile
后期处理
(postprocess)
目标文件
.
不运行
mips-tfile
就没有调试器关注的局部变量
.
另外
, stage2
和
stage3
目标文件将把 临时文件名传递给汇编器
,
嵌在目标文件中
,
这意味着不比较目标文件是否相同
.
-
输出包含浮点库调用
.
警告:
所需库不是
GNU CC
的一部分
.
一般说来使用该机型本地
C
编译器的相应部件
,
但是不能直接用于交叉编译
,
你必须自己安排
,
提供交叉编译适用的库函数
.
-
输出包含浮点指令
.
如果编译器没有被改动
,
这就是默认选项
.
-
编译器认为状态字的
FR
置位
(on),
也就是说存在
32 64-bit
浮点寄存器
,
而不是
32 32-bit
浮点寄存器
.
同时必须打开
-mcpu=r4000
和
-mips3
开关
.
-
认为存在
32 32-bit
浮点寄存器
.
这是默认选项
.
-mabicalls
-
-mno-abicalls
-
输出
(
或不输出
) .abicalls, .cpload,
和
.cprestore
伪指令
,
某些
System V.4
版本用于位置无关代码
.
- -mno-half-pic
-
-mhalf-pic
开关选项要求把外部引用的指针放到数据段
,
并且载入内存
,
而不放到正文段
.
该选项目前 不起作用
.
-
把小于等于
num
字节的全局或静态数据放到小的数据段或
bss
段
,
而不是普通的数据段或
bss
段
.
这样汇编器可以输出基于全局指针
(gp
或
$28),
的单字内存访问指令而非普通的双字指令
.
默认情况下
,
用
MIPS
汇编器时
num
是
8,
而
GNU
汇编器则为
0.
另外
, -Gnum
选项也被传递 给汇编器和连接器
.
所有的模块必须在相同的
-Gnum
值下编译
.
-
汇编用户汇编文件
(
带有
`.s'
后缀
)
时
,
告诉
MIPS
汇编器不要运行预处理器
.
下面的`-m'选项用于