这是命令 powerpc-linux-gnu-g++-4.8,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
gcc - GNU 项目 C 和 C++ 编译器
概要
海湾合作委员会 [-c|-S|-E[-标准= ]
[-g[-PG.[-O水平]
[-W警告...] [-W迂腐]
[-IDIR...] [-LDIR...]
[-D宏[=定义]...] [-U宏]
[-f选项...] [-m机器选项...]
[-o 输出文件] [@文件] 入档...
这里只列出最有用的选项; 其余部分见下文。 克++ 接受
大部分相同的选项 GCC.
商品描述
当您调用 GCC 时,它通常会进行预处理、编译、组装和链接。
“整体选项”允许您在中间阶段停止此过程。 为了
例如, -c 选项表示不运行链接器。 然后输出由对象组成
汇编器输出的文件。
其他选项被传递到一个处理阶段。 一些选项控制
预处理器和其他编译器本身。 还有其他选项控制汇编程序和
链接器; 其中大部分都没有在这里记录,因为您很少需要使用它们中的任何一个。
大多数可以与 GCC 一起使用的命令行选项对 C 程序很有用; 什么时候
一个选项只对另一种语言(通常是 C++)有用,解释是这样说的
明确地。 如果特定选项的描述未提及来源
语言,您可以将该选项用于所有支持的语言。
这款 GCC 程序接受选项和文件名作为操作数。 许多选项具有多
字母名称; 因此多个单字母选项可能 而不去 分组: -dv 很
来自不同 -d -v.
您可以混合使用选项和其他参数。 在大多数情况下,您使用的顺序并不
事情。 当您使用多个同类选项时,顺序很重要; 例如,如果
你指定 -L 不止一次,按照指定的顺序搜索目录。 还,
的位置 -l 选项很重要。
许多选项的名称很长,以 -f 或 -W- -例如,
-fmove 循环不变量, -格式 等等。 其中大部分既有正面也有负面
形式; 的否定形式 -ffoo is -fno-foo. 本手册仅记录其中之一
两种形式,以非默认形式为准。
配置
附加选项 总结
这是所有选项的摘要,按类型分组。 说明如下
部分。
整体 附加选项
-c -S -E -o 文件 -无规范前缀 -管 -通过退出代码 -x language -v
-### - 帮帮我[=程[,...]] --目标帮助 - 版 -包装器 @文件 -f插件=文件
-fplugin-arg-姓名=ARG -fdump-ada-规范[-瘦] -fada-spec-父=单元
-fdump-go-spec=文件
C 语言选择 附加选项
-ansi -标准= -fgnu89-内联 - 辅助信息 文件名
-fallow-无参数可变函数 -fno-asm -fno 内置 -fno-内置-功能
-寄养 -f独立 -fopenmp -fms-扩展 -fplan9-扩展 -三合字母
-传统 -传统-cpp -休耕单精度 -fcond-不匹配
-亚麻矢量转换 -f 有符号位域 -fsigned-char -f 无符号位域
-funsigned-char
C + +中 语言选择 附加选项
-fabi版本=n -fno-访问控制 -fcheck-新 -fconstexpr-深度=n
-ffriend 注射 -fno-elide-构造函数 -fno-enforce-eh-规格 -ffor-范围
-fno-范围 -fno-gnu-关键字 -fno-隐式模板
-fno-隐式内联模板 -fno-实现内联 -fms-扩展
-fno-nonansi-builtins -fnothrow-选择 -fno 操作员名称 -fno-可选诊断
-f宽容 -fno-漂亮模板 -弗雷波 -fno-rtti -fstats
-ftemplate-backtrace-limit=n -f模板深度=n -fno-线程安全-静态
-保险丝-cxa-atexit -fno-弱 -nostdinc++ -fno-默认内联
-fvisibility-inlines-hidden -fvisibility-ms-compat -fext-数字文字 -侘
-Wconversion-null -Wctor-dtor-隐私 -W删除非虚拟dtor -Wliteral-后缀
-收窄 -Wno例外 -Wnon-virtual-dtor -重新订购 -Weffc++ -Wstrict-null-哨兵
-Wno-非模板朋友 -Wold风格铸造 -Woverloaded-虚拟 -Wno-pmf-转换
-Wsign-促销
Objective-C的 和 目标C ++ 语言选择 附加选项
-f 常量字符串类=类名 -fgnu-运行时 -fnext-运行时 -fno-nil-接收器
-fobjc-abi-版本=n -fobjc-call-cxx-cdtors -fobjc-直接调度 -fobjc-异常
-fobjc-gc. -fobjc-nilcheck -fobjc-std=objc1 -freplace-objc 类 -f 零链接
-gen-decls -Wassign-拦截 -Wno-协议 -W选择器 -W严格选择器匹配
-Wundeclared-选择器
语言选择 独立 (Independent) 附加选项
-fmessage-长度=n -fdiagnostics-显示位置=[一旦|每一行]
-fno 诊断显示选项 -fno-诊断-显示-插入符号
警告 附加选项
-f仅语法 -fmax-错误=n -W迂腐 -迂腐的错误 -w -维克斯特拉 -墙
-地址 -Waggregate-返回 -Waggressive 循环优化 -数组边界
-Wno-属性 -Wno-内置宏重新定义 -Wc++-兼容 -Wc++11-兼容 -Wcast-对齐
-Wcast 质量 -Wchar-下标 - 打砸了 -W评论 -W转换 -W覆盖不匹配
-Wno-cpp -Wno-弃用 -Wno-deprecated-声明 -Wdisabled-优化
-Wno-除以零 -W双提升 -空体 -Wenum-比较 -Wno-endif-标签
-错误 -错误=* -W 致命错误 -Wfloat-等于 -格式 -W格式=2
-Wno-格式包含-nul -Wno-格式-额外参数 -Wformat-非文字 -Wformat-安全
-W格式-y2k -Wframe-大于=LEN -Wno-free-nonheap-object -Wjump-未命中-init
-Wignored 预选赛 - 隐含的 -Wimplicit 函数声明 -Wimplicit-int
-Winit-自我 -赢线 -W 可能未初始化 -Wno-int-to-pointer-cast
-Wno-无效偏移量 -Winvalid-pch -W大于=LEN -Wunsafe 循环优化
-W逻辑运算 -长长 -Wmain -W 可能未初始化 -Wmissing-大括号
-Wmissing-field-initializers 缺少字段初始化器 -Wmissing-include-dirs 缺少包含目录 -Wno-muflap -Wno-多字符
-W非空 -Wno-溢出 -Woverlength-字符串 -打包 -Wpacked-bitfield-compat
-Wpadd - 括号 -Wpedantic-ms 格式 -Wno-pedantic-ms 格式 -W指针算法
-Wno-指向 int-cast 的指针 -冗余声明 -Wno-返回本地地址 -Wreturn 类型
-W序列点 -W阴影 -Wsign-比较 -Wsign-转换
-Wsizeof-指针内存访问 -Wstack-保护器 -Wstack 用法=LEN -Wstrict-别名
-Wstrict-别名=n -Wstrict-溢出 -Wstrict-溢出=n
-Wsuggest-属性=[纯|常量|不归路|格式] -Wmissing 格式属性 -W开关
-Wswitch-默认值 -Wswitch枚举 -Wsync-nand -W系统标头 -蹦床
-字形 -Wtype-限制 -文德夫 -Wun初始化 -未知编译指示 -Wno-pragmas
-Wun 后缀浮点常量 -未使用 -未使用的功能 -Wunused-标签
-Wunused-local-typedefs -Wunused-参数 -Wno-未使用的结果 -未使用值
-Wunused-变量 -未使用但设置参数 -未使用但设置变量 -无用演员
-Wvariadic-宏 -Wvector-操作-性能 -Wvla -Wvolatile 寄存器变量
-Wwrite-字符串 -Wzero 作为空指针常量
C 和 仅 Objective-C 警告 附加选项
-Wbad-函数转换 -Wmissing-声明 -Wmissing-参数类型
-Wmissing 原型 -Wnested-externs -Wold 风格声明 -Wold-style-定义
-Wstrict-原型 -传统的 -Wtraditional 转换
-W声明后声明 -W指针符号
调试 附加选项
-d信件 -转储规格 -转储机 -转储版本 -fsanitize =.样式 -fdbg-cnt-列表
-fdbg-cnt=反值列表 -f禁用-ipa-通行证名称 -f禁用-rtl-通行证名称
-f禁用-rtl-通行证=范围列表 -f禁用树-通行证名称 -f禁用树-经过-
姓名=范围列表 -fdump-noaddr -fdump-未编号 -fdump-未编号的链接
-fdump 翻译单元[-n] -fdump 类层次结构[-n] -fdump-ipa-全部
-fdump-ipa-cgraph -fdump-ipa-内联 -fdump 通行证 -fdump-统计 -fdump-树-全部
-fdump-tree-原始[-n] -fdump-tree-优化[-n] -fdump-树-cfg -fdump-tree-别名
-fdump-树-ch -fdump-树-ssa[-n] -fdump-树-pre[-n] -fdump-树-ccp[-n]
-fdump-树-dce[-n] -fdump-tree-gimple[-生的] -fdump-树-挡泥板[-n]
-fdump-树-dom[-n] -fdump-树-dse[-n] -fdump-树-phiprop[-n] -fdump-树-phiopt[-n]
-fdump-tree-forwprop[-n] -fdump-tree-copyrename[-n] -fdump-树-nrv -fdump-树-vect
-fdump-树接收器 -fdump-树-sra[-n] -fdump-tree-forwprop[-n] -fdump-树-fre[-n]
-fdump-树-vrp[-n] -ftree-向量化器-详细=n -fdump-tree-storeccp[-n]
-fdump-final-insns=文件 -fcompare-调试[=选择] -f比较调试秒
-feliminate-dwarf2-dups -fno-消除未使用的调试类型
-feliminate-未使用的调试符号 -femit-class-debug-always -可取的-样-通过
-可取的-样-通过=范围列表 -fdebug-types-节 -fmem-报告-wpa -fmem-报告
-fpre-ipa-mem-报告 -fpost-ipa-mem-报告 -f轮廓弧 -fopt-信息
-fopt-信息-选项[=文件] -随机种子=绳子 -fsched-详细=n -fsel-sched-详细
-fsel-sched-dump-cfg -fsel-sched-流水线详细 -fstack-使用 -ftest-覆盖
-ftime-报告 -fvar-跟踪 -fvar-跟踪任务
-fvar-跟踪-分配-切换 -g -g水平 -g切换 -gcoff -侏儒-版本 -ggdb
-grecord-gcc-开关 -gno-record-gcc-开关 -gtabs -gtabs+ -gstrict-矮人
-gno-严格矮人 -gvm -gxcoff -gxcoff+ -fno-合并调试字符串
-fno-dwarf2-cfi-asm -fdebug-前缀-映射=旧=新 -femit-struct-debug-baseonly
-femit-struct-debug-reduced -femit-struct-debug-详细[=规格表] -p -PG.
-打印文件名=图书馆 -print-libgcc-文件名 -打印多目录
-打印多库 -打印多操作系统目录 -打印程序名称=程序
-打印搜索目录 -Q -打印系统根目录 -打印-sysroot-标头-后缀 -保存临时
-保存临时工=cwd -保存临时工=对象 -时间[=文件]
优化 附加选项
-fagressive-loop-optimizations -falign 函数[=n] -falign 跳跃[=n]
-falign 标签[=n] -falign循环[=n] - 联想数学 -fauto-inc-dec
-fbranch-概率 -fbranch-目标-加载-优化 -fbranch-目标-加载-优化2
-fbtr-bb-独家 -fcaller-保存 -fcheck-数据-deps -f组合堆栈调整
-fconserve 堆栈 -fcompare-elim -fcprop-寄存器 -f越野跳跃 -fcse 跟随跳跃
-fcse-跳过块 -fcx-fortran-规则 -fcx-有限范围 -fdata-sections. -fdce
-fdelayed-分支 -fdelete-空指针检查 -f去虚拟化 -fdse - 害怕内联
-fipa-sra - 昂贵的优化 -ffat-lto-对象 -ffast-数学 -finite-math-only
-float-存储 -fexcess-精度=样式 -fforward-传播 -ffp-合同=样式
-f函数部分 -fgcse -fgcse-重新加载后 -fgcse-las -fgcse-lm
-f石墨身份 -fgcse-sm -fhoist-相邻负载 -fif-转换 -fif-转换2
-findirect-内联 -finline-函数 -finline 函数调用一次 -finline-限制=n
-finline-小功能 -fipa-cp -fipa-cp-克隆 -fipa-pta -fipa 配置文件
-fipa-纯常量 -fipa 参考 -fira-算法=算法 -fira区域=地区
-fira-提升机压力 -fira-loop-压力 -fno-ira-共享保存槽
-fno-ira-共享溢出槽 -fira-详细=n -fivots -fkeep-内联函数
-fkeep-静态常量 -floop块 -floop-交换 -floop-strip-mine
-floop-nest-优化 -floop-全部并行化 -flto -flto-压缩级别
-flto-分区=ALG -flto 报告 -fmerge-all-常量 -fmerge-常量
-f模调度 -fmodulo-sched-allow-regmoves -fmove 循环不变量 挡泥板
-fmudflair -fmudflapth -fno-分支计数-reg -fno-默认内联 -fno-延迟弹出
-fno-函数-cse -fno-guess-分支概率 -fno-内联 -fno-数学错误号
-fno-窥视孔 -fno-窥视孔2 -fno-调度块间 -fno-计划规范 -fno 有符号零
-fno-toplevel-重新排序 -fno-捕获数学 -fno-零初始化-in-bss
-fomit帧指针 -f 优化注册移动 -foptimize-sibling-calls
-f 部分内联 -f剥离循环 -f预测共同点 -fprefetch 循环数组
-fprofile-报告 -fprofile-更正 -fprofile-目录=径 -fprofile-生成
-fprofile-生成=径 -fprofile 使用 -fprofile-使用=径 -f 配置文件值
-倒数数学 - 自由 -fregmove -frename-寄存器 -freorder块
-freorder-块和分区 -freorder 函数 -frerun-cse-循环后
-freschedule模调度循环 -基础数学 -fsched2-使用超级块
-fsched-压力 -fsched-spec-负载 -fsched-spec-负载危险
-fsched-stalled-insns-dep [=n] -fsched-stalled-insns[=n] -fsched-group-启发式
-fsched-关键路径启发式 -fsched-spec-insn-启发式 -fsched-rank-启发式
-fsched-last-insn-启发式 -fsched-dep-count-启发式 -fschedule-insns
-fschedule-insns2 -fsection-锚点 -f 选择性调度 -f选择性调度2
-fsel-sched-流水线 -fsel-sched-pipelined-outer-loops -f收缩包装
-f信令-nans -f单精度常量 -fsplit-ivs-in-unroller
-fsplit-wide-类型 -fstack-保护器 -fstack-保护器-所有 -fstrict-别名
-fstrict-溢出 -fthread-跳转 -跟踪器 -ftree-位-ccp -ftree-内置调用-dce
-ftree-ccp -ftree-ch -ftree-合并内联变量 -ftree-合并变量 -ftree-复制-prop
-ftree-copyrename -ftree-dce -ftree-支配-选择 -ftree-dse -ftree-forwprop
-ftree-fre -ftree-loop-if 转换 -ftree-loop-if-convert-stores -ftree-循环-im
-ftree-phiprop -ftree-循环分布 -ftree-循环分布模式
-Ftree-Loop-Ivcanon -ftree-循环-线性 -ftree-循环优化 -ftree-并行循环=n
-ftree-pre -ftree-部分预 -ftree-pta -ftree-重新关联 -ftree-水槽 -ftree-slsr
-ftree-sra -ftree-switch 转换 -ftree尾合并 -树三
-ftree-vect-循环版本 -ftree-矢量化 -ftree-vrp -一次一次的乐趣
-funroll-所有循环 - 有趣的循环 -funsafe 循环优化
-funsafe-数学优化 -funswitch循环 -f 展开器中的变量扩展
-fvect-成本模型 -fvpt -fweb -f整个程序 -fwpa -保险丝-ld=链接
-fuse 链接器插件 --参数 姓名=折扣值 -O -氧气 -氧气 -氧气 -氧气 -你 -奥法斯特 -Og
预处理器 附加选项
-A题=回答 -一种-题[=回答] -C -DD -dI -dM -dN -D宏[=定义] -E -H
-irafter DIR -包括 文件 -宏 文件 -前缀 文件 -i 带前缀 DIR
-iwithprefixbefore DIR -ISystem. DIR -imultilib DIR -isysroot DIR -M -MM -MF -MG
-MP -MQ -公吨 -nostdinc -P -fdebug-cpp -ftrack-宏扩展 -fworking-目录
-重新映射 -三合字母 -undef -U宏 -Wp,选项 -X预处理器 选项 -无集成-cpp
汇编 附加选项
-哇,选项 -X汇编程序 选项
链接 附加选项
对象文件名 -l图书馆 -无启动文件 -无默认库 -nostdlib -馅饼 -r动态 -s
-静态的 -静态libgcc -静态-libstdc++ -静态-libasan -静态libtsan -共享
-共享-libgcc -象征性的 -T 脚本 -Wl,选项 -Xlinker 选项 -u 符号
目录 附加选项
-B字首 -IDIR -iplugindir=DIR -我引用DIR -LDIR -规格=文件 -一世- --系统根=DIR
--no-sysroot-后缀
系统 依赖的 附加选项
AAArch64 附加选项 -mbig-endian -小端 -mgeneral-regs-仅 -mcmodel=微小
-mcmodel=小 -mcmodel=大 -严格对齐 -momit 叶帧指针
-mno-省略叶帧指针 -mtls-方言=desc -mtls-方言=传统
-mfix-皮质-a53-835769 -mno-修复皮质-a53-835769 -三月=姓名 -单片机=姓名
-mtune=姓名
适应症 顿悟 附加选项 -mhalf-reg-文件 -mprefer-short-insn-regs -mbranch-成本=NUM
-mcmove -mnops=NUM -msoft-cmpsf -msplit-洛希 -mpost-公司 -mpost-修改
-mstack 偏移量=NUM -mround-最近的 -mlong 通话 -mshort-电话 -msmall16 -mfp-模式=模式
-mvect-双 -最大向量对齐=NUM -msplit-vecmove-早期 -m1reg-章
ARM 附加选项 -mapcs-框架 -mno-apcs-框架 -马比=姓名 -mapcs-堆栈检查
-mno-apcs-堆栈检查 -mapcs-浮动 -mno-apcs-浮动 -mapcs-可重入
-mno-apcs-可重入 -msched-序言 -mno-sched-序言 -小端 -mbig-endian
-mwords-小端 -mfloat-abi=姓名 -mfp16-格式=姓名 -拇指互通
-mno-拇指互操作 -单片机=姓名 -三月=姓名 -mfpu=姓名 -m结构大小边界=n
-mabort-on-return -mlong 通话 -mno-长通话 -ms单图片库
-mno-单图片库 -mpic-寄存器=章 -mnop-fun-dll 导入 -mpoke-功能名称
-拇指 -马尔姆 -mtpcs-帧 -mtpcs-叶框 -mcaller-超级互通
-mcallee-超级互通 -mtp=姓名 -mtls-方言=方言 -mword-重定位
-mfix-皮质-m3-ldrd -munaligned-访问
AVR 附加选项 -mmcu=MCU -积累参数 -mbranch-成本=成本 -mcall-序言 -mint8
-mno-中断 -放松 -严格-X -mtiny-stack -Waddr-空间转换
Blackfin处理器 附加选项 -单片机=CPU[-修订版] -msim -momit 叶帧指针
-mno-省略叶帧指针 -mspecld-异常 -mno-specld-异常 -mcsync-异常
-mno-csync-异常 -mlow-64k -mno-low64k -mstack-检查-l1 -mid-共享库
-mno-id-共享库 -mshared-library-id=n -mleaf-id-共享库
-mno-leaf-id-共享库 -msep-数据 -mno-sep-数据 -mlong 通话 -mno-长通话
-mfast-fp -minline-plt -多核 -mcorea -mcoreb -msdram -micplb
C6X 附加选项 -mbig-endian -小端 -三月=CPU -msim -msdata=数据类型
CRIS 附加选项 -单片机=CPU -三月=CPU -mtune=CPU -mmax-堆栈帧=n
-melinux-堆栈大小=n -metrax4 -metrax100 -mp调试 -mcc-init -mno-副作用
-mstack对齐 -mdata-对齐 -mconst-对齐 -m32 位 -m16 位 -m8 位
-mno-序言-尾声 -mno-gotplt -梅尔夫 -maout -melinux -mlinux -SIM -sim2
-mmul-bug-解决方法 -mno-mul-bug-解决方法
CR16 附加选项 -mmac -mcr16cplus -mcr16c -msim -mint32 -mbit 操作 -mdata-模型=模型
达尔文 附加选项 -all_load -allowable_client -拱 -arch_errors_fatal -仅架构
-加载时绑定 -束 -bundle_loader -客户名称 -兼容性_版本
-当前版本 -dead_strip -依赖文件 -dylib_文件 -dylinker_安装_名称
-动态 -动态库 -导出符号列表 -文件列表 -平面命名空间
-force_cpusubtype_ALL -force_flat_命名空间 -headerpad_max_install_names -i框架
-图像库 -在里面 -安装名称 -keep_private_externs -多模块
-乘法定义 -multiply_define_unused -noall_load
-no_dead_strip_inits_and_terms -nofix预绑定 -nomultidefs -noprebind
-noseglink编辑 -pagezero_size -预绑定 -prebind_all_twolevel_modules -private_bundle
-read_only_relocs -扇区对齐 -教派对象符号 -为什么加载 -段1地址 -sectcreate
-教派对象符号 -扇区 -隔离地址 -segs_read_only_addr -segs_read_write_addr
-段地址表 -seg_addr_表文件名 -seglinkedit -segprot -segs_read_only_addr
-segs_read_write_addr -单模块 -静态的 -子库 -sub_umbrella
-twolevel_命名空间 -雨伞 -不明确的 -unexported_symbols_list.
-weak_reference_mismatches -加载了什么 -F -古斯 -gfull -mmacosx-版本-min=版本
-内核 -mon-byte-bool
DEC 阿尔法 附加选项 -mno-fp-regs -msoft-浮动 -miee -mieee-不准确
-符合标准 -mfp 陷阱模式=模式 -mfp-舍入模式=模式 -mtrap-精度=模式
-mbuild-常量 -单片机=cpu类型 -mtune=cpu类型 -mbwx -最大 -mfix -mcix
-mfloat-vax -mfloat-ieee -meexplicit-relocs -msmall-数据 -mlarge 数据 -msmall-文本
-m大文本 -mmemory-延迟=次
FR30 附加选项 -msmall-模型 -mno-lsim
利夫 附加选项 -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-浮动 -msoft-浮动
-malloc-cc -mfixed-cc -mdword -mno-双字 -mdouble -mno-双 -媒体 -mno媒体
-mmuladd -mno-muladd -mfdpic -minline-plt -mgprel-ro -multilib-库-pic
-mlinked-fp -mlong 通话 -恶意标签 -图书馆图片 -macc-4 -macc-8 -mpack
-mno包 -mno-flags -mcond-移动 -mno-cond-移动 -moptimize-membar
-mno-优化-membar -mscc -mno-scc -mcond 执行 -mno-条件执行 -mvliw-分支
-mno-vliw-分支 -mmulti-条件执行 -mno-多条件执行 -mnested-cond-exec
-mno-嵌套条件执行 -mtomcat-统计 -mTLS -mtls -单片机=CPU
GNU / Linux的 附加选项 -mglibc -mulibc -仿生 -机器人 -tno-android-cc -tno-android-ld
H8 / 300 附加选项 -放松 -mh -多发性硬化症 -mn -mexr -mno-exr -mint32 -malign-300
高压聚丙烯酰胺 附加选项 -三月=建筑类型 -mbig-开关 -mdisable-fpregs
-m禁用索引 -mfast-间接调用 -甲烷气体 -mgnu-ld -mhp-ld
-mfixed-范围=寄存器范围 -mjump-in-延迟 -mlinker-opt -mlong 通话
-mlong-加载-存储 -mno-大开关 -mno-禁用-fpregs -mno-禁用-索引
-mno-fast-间接调用 -一氧化锰气体 -mno-跳转延迟 -mno-长加载存储
-mno-便携式运行时 -mno-软浮动 -mno-空间-regs -msoft-浮动 -mpa-risc-1-0
-mpa-risc-1-1 -mpa-risc-2-0 -便携式运行时 -mschedule=cpu类型 -mspace-regs
-msio -mwsio -munix=Unix标准 -nolibdld -静态的 -线程
i386 和 x86 64 附加选项 -mtune=cpu类型 -三月=cpu类型 -mfpmath=单元 -masm=方言
-mno-花式数学-387 -mno-fp-ret-in-387 -msoft-浮动 - 整个范围内 -mrtd.
-malign-双 -mpreferred-堆栈边界=NUM -mincoming-堆栈边界=NUM -mcld
-mcx16 -msahf -mmmovbe -mcrc32 -mrecip -mrecip=选择 -mvzeroupper -mprefer-avx128 -mmx
-MSSE -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx -mavx2 -梅斯 -mpclmul
-mfsgsbase -mrdrnd -mf16c -mfma -msse4a -m3dnow -mpopcnt -mabm -mbmi -MTBM -mfma4
-mxop -mlzcnt -mbmi2 -mrtm -mlwp -多线程 -mno-align-stringops
-minline-all-stringops -minline-stringops-动态 -mstringop-策略=ALG
-mpush-args -maccumulate-传出参数 -m128位长双精度 -m96位长双精度
-mlong-double-64 -mlong-double-80 -mregparm=NUM -msseregparm -mveclibabi=类型
-mvect8-ret-内存 -mpc32 -mpc64 -mpc80 -mstack重新对齐 -momit 叶帧指针
-mno-红区 -mno-tls-direct-seg-refs -mc模型=代码模型 -马比=姓名
-maddress 模式=模式 -立方米 -立方米 -mx32 -mlarge-数据阈值=NUM -msse2avx -mfentry
-m8bit-idiv -mavx256-拆分未对齐负载 -mavx256-分割未对齐存储
i386 和 x86 64 Windows 附加选项 -控制台 -麦西格温 -mno-cygwin -mdll
-mnop-fun-dll 导入 -线程 - 穆尼码 -mwin32 -mwindows -fno-设置堆栈可执行文件
IA-64 附加选项 -mbig-endian -小端 -mgnu-as -mgnu-ld -mno-pic
-mvolatile-asm-停止 -mregister 名称 -msdata -mno-sdata -mconstant-gp -自动图片
-mfused-madd -minline-float-divide-min-latency -minline-float-divide-max-吞吐量
-mno-内联浮点除法 -minline-int-divide-min-latency
-minline-int-divide-max-吞吐量 -mno-内联-int-除法 -minline-sqrt-min-延迟
-minline-sqrt-max-吞吐量 -mno-内联-sqrt -mdwarf2-asm -几乎停止位
-mfixed-范围=寄存器范围 -mtls-大小=tls-大小 -mtune=cpu类型 -milp32 -mlp64
-msched-br-数据规范 -msched-ar-数据规范 -msched-控制规范 -msched-br-in-数据规范
-msched-ar-in-数据规范 -msched-in-control-spec -msched-规范-ldc
-msched-规范-控制-ldc -msched-prefer-非数据规范-insns
-msched-首选非控制规范-insns -每个周期后的 msched 停止位
-msched-count-spec-in-关键路径 -msel-sched-不检查控制规范
-msched-fp-mem-deps-零成本 -msched-max-内存-insns-硬限制
-msched-max-内存-insns=最大insns
LM32 附加选项 -mbarrel-shift-启用 -mdivide 启用 -mmultiply 启用
-msign-extend 启用 -muser 启用
M32R/D 附加选项 -m32r2 -m32rx -m32r -调试 -恶性循环 -mno-对齐循环
-错发率=数 -mbranch-成本=数 -模型=代码大小模型类型 -msdata=数据-
类型 -mno-flush-func -mflush-函数=姓名 -mno-冲洗陷阱 -mflush-trap=数 -G NUM
M32C 附加选项 -单片机=CPU -msim -memregs=数
M680x0 附加选项 -三月=拱 -单片机=CPU -mtune=调 -立方米 -立方米 -m68020-40
-m68020-60 -立方米 -立方米 -立方米 -单片机32 -立方米 -m5206e -m528x -立方米 -立方米
-mcfv4e -mbitfield -mno-位域 -MC68000 -MC68020 -mnobitfield -mrtd. -mno-rtd
-mdiv -mno-div -mshort -mno-短 -mhard-浮动 -立方米 -msoft-浮动 -mpcrel
-恶意-int -严格对齐 -msep-数据 -mno-sep-数据 -mshared-library-id=n
-mid-共享库 -mno-id-共享库 -mxgot -mno-xgot
微芯 附加选项 -mhardlit -mno-强光 -mdiv -mno-div -mrelax-立即数
-mno-放松-立即数 -mwide 位域 -mno 宽位域 -m4byte 函数
-mno-4byte 函数 -mcallgraph-数据 -mno-callgraph-数据 -mslow-字节
-mno-慢字节 -mno-lsim -小端 -mbig-endian -立方米 -立方米
-mstack-增量
环境保护部 附加选项 -mabs差异 -商城选择 -平均 -m基础=n -mbitops -MC=n -mclip
-mconfig=姓名 -mcop -MCOP32 -MCOP64 -mivc2 -MDC -mdiv -meb -梅尔 -mio-易失性 -毫升
-mleadz -毫米 -最小最大 -mult -mno-选项 -重复 -多发性硬化症 -饱和 -msdram -msim -msimnovec
-mtf -mtiny=n
微风 附加选项 -msoft-浮动 -mhard-浮动 -msmall-分界线 -单片机=CPU -mmemcpy
-mxl-软-mul -mxl-软div -mxl-桶移位 -mxl 模式比较 -mxl-堆栈检查
-mxl-gp-opt -mno-clearbss -mxl-乘高 -mxl-浮动转换 -mxl-浮点-sqrt
-mbig-endian -小端 -mxl-重新排序 -mxl-模式-应用模型
MIPS 附加选项 -这 -EB -三月=拱 -mtune=拱 -mips1 -mips2 -mips3 -mips4
-mips32 -mips32r2 -mips64 -mips64r2 -mips16 -mno-mips16 -mflip-mips16
-minterlink-mips16 -mno-interlink-mips16 -马比=ABI -mabicalls -mno-abicalls.
-mshared -mno-共享 -mplt -mno-plt -mxgot -mno-xgot -mgp32 -mgp64 -mfp32
-mfp64 -mhard-浮动 -msoft-浮动 -mno-浮动 -单浮点数 -mdouble-浮点数 -mdsp
-mno-dsp -MDSPR2 -mno-dspr2 -mmcu -mmno-单片机 -mfpu=fpu型 -msmartmips
-mno-smartmips - 单人 -mno-配对-单 -mdmx -mno-mdmx -mips3d
-mno-mips3d -MMT -mno-mt -mlsc -mno-llsc -mlong64 -mlong32 -msym32 -mno-sym32
-GNUM -mlocal-sdata -mno-本地-sdata -mextern-sdata -mno-外部-sdata -mgpopt
-mno-goopt - 嵌入数据 -mno-嵌入式数据 -muninit-const-in-rodata
-mno-uninit-const-in-rodata -mcode-可读=设置 -msplit-地址
-mno-拆分地址 -meexplicit-relocs -mno-显式重新定位 -mcheck-零除法
-mno-check-零除法 -mdivide-trap -m分界线 -mmemcpy -mno-memcpy
-mlong 通话 -mno-长通话 -疯了 -mno-疯狂 -mfused-madd -mno-融合-madd -nocpp
-mfix-24k -mno-修复-24k -mfix-R4000 -mno-修复-r4000 -mfix-R4400 -mno-修复-r4400
-mfix-R10000 -mno-修复-r10000 -mfix-vr4120 -mno-修复-vr4120 -mfix-vr4130
-mno-修复-vr4130 -mfix-sb1 -mno-修复-sb1 -mflush-函数=FUNC -mno-flush-func
-mbranch-成本=NUM -分支可能 -mno 分支可能 -mfp-异常
-mno-fp-异常 -mvr4130-对齐 -mno-vr4130-对齐 -msynci -mno同步
-mrelax-pic-电话 -mno-relax-pic 通话 -mmcount-ra-地址
多媒体混音 附加选项 -mlib函数 -mno-libfuncs -mepsilon -mno-ε -mabi = gnu.
-mabi=mmixware -mzero-扩展 -mknuthdiv -mtoplevel-符号 -梅尔夫 -mbranch-预测
-mno-分支-预测 -mbase 地址 -mno-基地址 -单出口
-mno-单出口
MN10300 附加选项 -多错误 -mno-multi-bug -mno-am33 -妈妈33 -mam33-2 -妈妈34 -mtune=中央处理器-
类型 -m返回 d0 上的指针 -mno-crt0 -放松 -mliw -msetlb
莫邪 附加选项 -meb -梅尔 -mno-crt0
PDP-11 附加选项 -mfpu -msoft-浮动 -mac0 -mno-ac0 -立方米 -立方米 -立方米 -mbcopy
-mbcopy 内置 -mint32 -mno-int16 -mint16 -mno-int32 -mfloat32 -mno-float64
-mfloat64 -mno-float32 -马布希 -mno-abshi -mbranch-昂贵 -mbranch-便宜
-munix-asm -mdec-asm
微芯片 附加选项 -美=ae_类型 -mvliw-先行=N -msymbol 作为地址
-mno-低效警告
PowerPC的 附加选项 请参阅 RS/6000 和 PowerPC 选项。
RL78 附加选项 -msim -mmul=无 -mmul=g13 -mmul=rl78
RS/6000 和 PowerPC的 附加选项 -单片机=cpu类型 -mtune=cpu类型 -mc模型=代码模型
-mpowerpc64 -马尔代夫 -mno-altivec -mpowerpc-gpopt -mno-powerpc-gpopt
-mpowerpc-gfxopt -mno-powerpc-gfxopt -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb
-mpopcntd -mno-popcntd -制造商 -mno-fprnd -mcmpb -mno-cmpb -mmfpgpr -mno-mfpgpr
-mhard-dfp -mno-硬-dfp -mfull目录 -minimal-toc -mno-fp-目录中 -mno-目录总和
-立方米 -立方米 -mxl-兼容 -mno-xl-兼容 -mpe -恶性权力 -恶性自然
-msoft-浮动 -mhard-浮动 -m倍数 -mno-倍数 -单浮点数 -mdouble-浮点数
-msimple-fpu -m字符串 -mno-字符串 -m更新 -mno-更新 -mavoid 索引地址
-mno-避免-索引地址 -mfused-madd -mno-融合-madd -mbit对齐
-mno 位对齐 -严格对齐 -mno-严格对齐 -可重定位 -mno-可重定位
-mrelocate-lib -mno-可重定位-lib -mtoc -mno-toc -小 -小端
-mbig -mbig-endian -mdynamic-无图片 -马尔代夫 -mswdiv -ms单图片库
-优先级限制-insns=优先 - 镜头 - 昂贵 - dep =依赖类型
-minsert-sched-nops=方案 -mcall-sysv -mcall-netbsd -maix-结构返回
-msvr4-结构返回 -马比=阿比型 -msecure-plt -mbss-plt
-mblock-移动-内联-限制=NUM -米塞尔 -mno-isel -misel=是 -misel=否 -MSPE -mno-spe
-mspe=是 -mspe=否 - 受损 -mgen-cell-微码 -mwarn-cell-微码 -mvsave
-mno-vrsave -mmulhw -mno-mulhw -mdlmzb -mno-dlmzb -mfloat-gprs=是 -mfloat-gprs=否
-mfloat-gprs=单 -mfloat-gprs=双 -原型 -mno-原型 -msim -mmvme
-疯子 -米黄刀 -成员 -msdata -msdata=选择 -mvxworks -G NUM -p线程 -mrecip
-mrecip=选择 -mno-食谱 -mrecip-精度 -mno-recip-精度 -mveclibabi=类型 -mfriz
-mno-弗里兹 -指向嵌套函数的指针 -mno-指向嵌套函数的指针
-msave-toc-间接 -mno-save-toc-间接 -mpower8-融合 -mno-mpower8-融合
-mpower8-矢量 -mno-power8-向量 -mcrypto -mno-加密 -mdirect-移动 -mno-直接移动
-mquad-内存 -mno-quad-内存 -mquad-内存-原子 -mno-四元内存原子
-mcompat-align-parm -mno-compat-align-parm
RX 附加选项 -m64bit-双打 -m32bit-双打 -fpu -诺夫普 -单片机= -mbig-endian-数据
-小端数据 -msmall-数据 -msim -mno-sim -mas100-语法 -mno-as100-语法
-放松 -mmax-常量大小= -薄荷注册= -mpid -mno-警告-多个快速中断
-msave-acc-in-中断
S / 390 和 z系列 附加选项 -mtune=cpu类型 -三月=cpu类型 -mhard-浮动 -msoft-浮动
-mhard-dfp -mno-硬-dfp -mlong-double-64 -mlong-double-128 -mbackchain
-mno-后链 -mpacked堆栈 -mno-打包堆栈 -msmall-执行 -mno-小执行
-mmvcle -mno-mvcle -立方米 -立方米 -调试 -mno-调试 -台面 -mzarch -mtpf-跟踪
-mno-tpf-跟踪 -mfused-madd -mno-融合-madd -mwarn-帧大小 -mwarn-dynamicstack
-mstack 大小 -mstack 守卫 -mhotpatch=半字,半字
总分 附加选项 -meb -梅尔 -mnhwloop -muls -mmac -mscore5 -mscore5u -mscore7 -mscore7d
SH 附加选项 -立方米 -立方米 -m2e -m2a-nofpu -m2a-单只 -m2a-单 -m2a -立方米 -m3e
-m4-nofpu -m4-单人 -m4-单 -立方米 -m4a-nofpu -m4a-单只 -m4a-单
-m4a -m4al -m5-64媒体 -m5-64media-nofpu -m5-32媒体 -m5-32media-nofpu -m5-紧凑型
-m5-compact-nofpu -mb -毫升 -mdalign -放松 -mbigtable -mfmovd -日立 -姆雷萨斯
-mno-瑞萨 -mnomacsave -miee -mno-IEEE -mbitops -大小 -minline-ic_invalidate
-mpadstruct -空间 -mprefergot -用户模式 -多成本=数 -mdiv=策略
-mdivsi3_libfunc=姓名 -mfixed-范围=寄存器范围 -mindexed 寻址
-mgettr成本=数 -mpt-固定 -maccumulate-传出参数 -minvalid-符号
-原子模型=原子模型 -mbranch-成本=NUM -mzdc 分支 -mno-zdc 分支 -麦克布兰奇迪
-mcmpeqdi -mfused-madd -mno-融合-madd -mfsca -mno-fsca -mfsrra -mno-fsrra
-pretend-cmove -mtas
的Solaris 2 附加选项 - 纯文本 -mno-不纯文本 -线程 -p线程
SPARC 附加选项 -单片机=cpu类型 -mtune=cpu类型 -mc模型=代码模型 -内存模型=记忆-
模型 -立方米 -立方米 -mapp-regs -mno-应用程序-regs -mfaster 结构 -mno-更快的结构
-mflat -mno-平 -mfpu -mno-fpu -mhard-浮动 -msoft-浮动 -mhard-四浮点
-msoft-四浮点 -mstack-偏差 -mno 堆栈偏差 -munaligned-双打
-mno-未对齐双打 -muser 模式 -mno-用户模式 -mv8plus -mno-v8plus -mvis
-mno-vis -mvis2 -mno-vis2 -mvis3 -mno-vis3 -mcbcond -mno-cbcond -mfmaf -mno-fmaf
-mpopc -mno-popc -mfix-at697f -mfix-ut699
SPU 附加选项 -mwarn-reloc -merror-重新定位 -msafe-DMA -munsafe-DMA -mbranch-提示
-msmall-内存 -mlarge-内存 -mstdmain -mfixed-范围=寄存器范围 -mea32 -mea64
-maddress 空间转换 -mno-地址空间转换 -mcache-大小=缓存大小
-matomic-更新 -mno-atomic-更新
系统 V 附加选项 -Qy -Qn -YP,路径 -嗯,DIR
瓷砖-Gx 附加选项 -单片机=CPU -立方米 -立方米 -mc模型=代码模型
瓷砖专业版 附加选项 -单片机=CPU -立方米
V850 附加选项 -mlong 通话 -mno-长通话 -mep -mno-ep -mprolog-函数
-mno-prolog-函数 -空间 -mtda=n -msda=n -mzda=n -mapp-regs -mno-应用程序-regs
-m禁用调用 -mno-禁用呼叫 -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e
-MV850 -mv850e3v5 -mloop -放松 -mlong 跳跃 -msoft-浮动 -mhard-浮动 -mgcc-abi
-mrh850-abi -mbig-开关
VAX 附加选项 -毫克 -mgnu -munix
VMS 附加选项 -mvms-返回码 -mdebug-main=字首 -mmalloc64 -mpointer 大小=尺寸
VxWorks的 附加选项 -mrtp -非静态 -静态 -B动态 -Xbind-懒惰 -Xbind-现在
x86 64 附加选项 请参阅 i386 和 x86-64 选项。
暴风雨16 附加选项 -msim
克滕萨 附加选项 -mconst16 -mno-const16 -mfused-madd -mno-融合-madd -mforce-无图片
-mserialize-易失性 -mno-序列化-易失性 -mtext-节文字
-mno-文本部分-文字 -mtarget-对齐 -mno-目标对齐 -长途电话
-mno-longcalls
z系列 附加选项 请参阅 S/390 和 zSeries 选项。
代码 代 附加选项
-fcall-保存-章 -fcall-使用-章 -固定-章 -f异常 -f 非调用异常
-fdelete-死异常 -funwind 表 -fasynchronous-展开表 -fno-gnu-唯一
-finhibit-size-指令 -仪器功能
-finstrument-functions-exclude-function-list=符号,符号,...
-finstrument-functions-exclude-file-list=文件,文件,... -fno-普通 -fno-ident
-fpcc-结构返回 -fpic -fPIC -fpie -fPIE -fno-跳转表 -frecord-gcc-开关
-freg-结构返回 -fshort-枚举 -fshort-双 -fshort-wchar -fverbose-asm
-fpack-结构[=n] -fstack-检查 -fstack-限制-寄存器=章 -fstack-限制符号=符号
-fno-堆栈限制 -fsplit堆栈 -fleading-下划线 -ftls-模型=模型
-fstack-重用=重用级别 -Ftrapv. -fwrapv -fbounds-检查 -可见性
-fstrict-易失性位域 -fsync-libcalls
附加选项 控制 此 类 of 输出
编译最多可以涉及四个阶段:预处理、正确编译、组装和
链接,总是按照这个顺序。 GCC 能够预处理和编译几个
将文件合并到多个汇编器输入文件中,或合并到一个汇编器输入文件中; 然后
每个汇编器输入文件生成一个目标文件,链接将所有目标文件组合在一起
文件(新编译的和指定为输入的)转换为可执行文件。
对于任何给定的输入文件,文件名后缀决定了什么样的编译
完毕:
文件.c
必须预处理的 C 源代码。
文件.i
不应预处理的 C 源代码。
文件.ii
不应预处理的 C++ 源代码。
文件.m
Objective-C 源代码。 请注意,您必须与 库对象 图书馆做一个
Objective-C 程序工作。
文件.mi
不应预处理的 Objective-C 源代码。
文件.mm
文件.M
Objective-C++ 源代码。 请注意,您必须与 库对象 图书馆制作
一个 Objective-C++ 程序工作。 注意 .M 指的是字面大写的大写 M。
文件.mii
不应预处理的 Objective-C++ 源代码。
文件.h
C、C++、Objective-C 或 Objective-C++ 头文件要转成预编译
头文件(默认),或者 C、C++ 头文件要转换成 Ada 规范(通过
-fdump-ada-规范 转变)。
文件的cc
文件.cp
文件.cxx
文件的.cpp
文件.CPP
文件.c++
文件.C
必须预处理的 C++ 源代码。 请注意,在 .cxx, 最后两个字母
都必须是字面意思 x。 同样 .C 指字面大写 C.
文件.mm
文件.M
必须预处理的 Objective-C++ 源代码。
文件.mii
不应预处理的 Objective-C++ 源代码。
文件.HH
文件.H
文件。生命值
文件.hxx
文件.hpp
文件.HPP
文件.h++
文件.tcc
将转换为预编译头文件或 Ada 规范的 C++ 头文件。
文件.f
文件。对于
文件.ftn
固定形式的 Fortran 源代码不应预处理。
文件.F
文件。为了
文件.fpp
文件.FPP
文件.FTN
必须预处理的固定格式 Fortran 源代码(与传统的
预处理器)。
文件.f90
文件.f95
文件.f03
文件.f08
不应预处理的自由格式 Fortran 源代码。
文件.F90
文件.F95
文件.F03
文件.F08
必须预处理的自由格式 Fortran 源代码(与传统的
预处理器)。
文件。走
去源代码。
文件.广告
Ada 源代码文件包含一个库单元声明(一个
包、子程序或泛型,或泛型实例),或库单元
重命名声明(包、泛型或子程序重命名声明)。 这样的
文件也被称为 眼镜.
文件.adb
包含库单元主体(子程序或包主体)的 Ada 源代码文件。
此类文件也称为 机构.
文件.d
D 源代码文件。
文件.di
D 接口代码文件。
文件.dd
D 文档代码文件。
文件.s
汇编代码。
文件.S
文件.sx来
必须预处理的汇编代码。
other
要直接输入链接的目标文件。 任何无法识别的文件名
后缀是这样处理的。
您可以使用以下命令明确指定输入语言 -x 选项:
-x language
明确指定 language 对于以下输入文件(而不是让
编译器根据文件名后缀选择默认值)。 此选项适用于所有
跟随输入文件直到下一个 -x 选项。 可能的值 language 是:
c c-header cpp-输出
时间:XNUMX-XNUMX-XNUMX 标签:c++c++-headerc++-cpp-output
目标-c 目标-c-头 目标-c-cpp-输出
目标-c++ 目标-c++-header 目标-c++-cpp-输出
汇编器 汇编器与 cpp
阿达
d
f77 f77-cpp-输入 f95 f95-cpp-输入
go
java的
-x 没有
关闭任何语言规范,以便处理后续文件
根据他们的文件名后缀(就像他们一样,如果 -x 根本没有使用过)。
-通过退出代码
通常情况下 GCC 如果编译器的任何阶段返回,程序以代码 1 退出
一个不成功的返回码。 如果您指定 -通过退出代码是, GCC 程序代替
返回任何返回错误的阶段所产生的数值最高的错误
指示。 如果内部编译器错误,C、C++ 和 Fortran 前端将返回 4
遇到。
如果你只想要编译的一些阶段,你可以使用 -x (或文件名后缀)
告诉 GCC 从哪里开始,以及选项之一 -c, -S或 -E 说在哪里 GCC 是
停止。 请注意,某些组合(例如, -x cpp-输出 -E) 指导 GCC 去做
什么都没有。
-c 编译或汇编源文件,但不链接。 链接阶段只是
尚未完成。 最终的输出是以每个源文件的目标文件的形式。
默认情况下,源文件的目标文件名是通过替换后缀 .c,
.i, .s等,与 .o.
不需要编译或汇编的无法识别的输入文件将被忽略。
-S 在适当的编译阶段后停止; 不要组装。 输出在
指定的每个非汇编器输入文件的汇编器代码文件的形式。
默认情况下,源文件的汇编文件名是通过替换后缀
.c, .i等,与 .s.
不需要编译的输入文件将被忽略。
-E 预处理阶段后停止; 不要正确运行编译器。 输出在
预处理源代码的形式,发送到标准输出。
不需要预处理的输入文件将被忽略。
-o 文件
将输出放在文件中 文件. 这适用于正在生产的任何类型的输出,
无论是可执行文件、目标文件、汇编程序文件还是预处理的 C
码。
If -o 没有指定,默认是放入一个可执行文件 出, 物体
文件 来源.后缀 in 来源.o,它的汇编文件在 来源.s, 预编译
头文件在 来源.suffix.gch,以及标准输出上的所有预处理 C 源代码。
-v 打印(在标准错误输出上)为运行阶段而执行的命令
汇编。 还要打印编译器驱动程序的版本号和
预处理器和编译器正确。
-###
喜欢 -v 除了不执行命令并且引用参数,除非它们
仅包含字母数字字符或“./-_”。 这对于 shell 脚本很有用
捕获驱动程序生成的命令行。
-管
使用管道而不是临时文件在各个阶段之间进行通信
汇编。 这在某些汇编程序无法读取的系统上不起作用
从管道; 但是 GNU 汇编器没有问题。
- 帮帮我
打印(在标准输出上)被理解的命令行选项的描述
GCC。 如果 -v 然后还指定了选项 - 帮帮我 也传递给了各种
调用的进程 GCC,以便他们可以显示命令行选项
接受。 如果 -维克斯特拉 选项也已指定(在 - 帮帮我 选项),
那么没有相关文档的命令行选项也是
显示。
--目标帮助
打印(在标准输出上)特定于目标的命令行选项的描述
对于每个工具。 对于某些目标,额外的特定于目标的信息也可能是
打印。
--帮助={程|[^]预选赛}[,...]
打印(在标准输出上)被理解的命令行选项的描述
适合所有指定类和限定符的编译器。 这些是
支持的类:
优化器
显示编译器支持的所有优化选项。
警告
显示控制编译器产生的警告消息的所有选项。
目标
显示特定于目标的选项。 不像 --目标帮助 然而,选择目标-
不显示链接器和汇编器的特定选项。 这是因为
这些工具目前不支持扩展 --帮助= 语法。
的params
显示识别的值 --参数 选项。
language
显示支持的选项 language,其中 language 是其中之一的名字
此版本的 GCC 支持的语言。
常见
显示所有语言通用的选项。
这些是受支持的限定符:
无证
仅显示那些未记录的选项。
加盟
显示选项采用出现在等号后的参数
连续的一段文字,例如: --help=目标.
分开
显示选项采用一个参数,该参数显示为一个单独的单词
原始选项,例如: -o 输出文件.
因此,例如显示由支持的所有未记录的特定于目标的开关
编译器,使用:
--help=目标,未记录
限定符的含义可以通过在它前面加上前缀来反转 ^ 性格,所以对于
显示所有二进制警告选项的示例(即,打开或关闭的选项)
并且不带参数)有描述,使用:
--help=警告,^已加入,^未记录
的论点 --帮助= 不应仅由倒置的限定词组成。
组合多个类是可能的,尽管这通常会限制输出,因此
没有什么可显示的。 然而,它确实起作用的一种情况是
其中一个课程是 目标. 例如,要显示所有特定于目标的
优化选项,使用:
--help=目标,优化器
这款 --帮助= 选项可以在命令行上重复。 每次连续使用显示
它请求的选项类别,跳过那些已经显示的选项。
如果 -Q 选项出现在命令行之前 --帮助= 选项,然后
显示的描述性文本 --帮助= 被改变。 而不是描述显示的
选项,指示是否启用、禁用或设置选项
到一个特定的值(假设编译器在
--帮助= 选项)。
这是来自 ARM 端口的截断示例 GCC:
% gcc -Q -mabi=2 --help=目标 -c
以下选项是特定于目标的:
-mabi=2
-mabort-on-noreturn [禁用]
-mapcs [禁用]
输出对先前命令行选项的影响很敏感,因此对于
例如,可以找出启用了哪些优化 -氧气 通过使用:
-Q -O2 --help=优化器
或者,您可以通过以下方式发现启用了哪些二进制优化 -氧气 通过使用:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
差异 /tmp/O2-opts /tmp/O3-opts | 启用 grep
-无规范前缀
不要扩展任何符号链接,解析对 /../ or /./, 或制作路径
生成相对前缀时绝对。
- 版
显示调用的 GCC 的版本号和版权。
-包装器
调用包装程序下的所有子命令。 包装程序的名称和
它的参数作为逗号分隔的列表传递。
gcc -c tc -wrapper gdb,--args
这将调用所有的子程序 GCC 下 GDB --参数,因此调用 cc1 is
GDB --参数 cc1 ....
-f插件=姓名。所以
在文件中加载插件代码 姓名.so,假设是一个共享对象,被 dlopen'd
编译器。 共享对象文件的基本名称用于标识插件
为了参数解析的目的(见 -fplugin-arg-姓名-键=折扣值 以下)。 每个
插件应该定义在插件 API 中指定的回调函数。
-fplugin-arg-姓名-键=折扣值
定义一个名为 键 价值为 折扣值 对于名为的插件 姓名.
-fdump-ada-规范[-瘦]
对于 C 和 C++ 源代码和包含文件,生成相应的 Ada 规范。
-fada-spec-父=单元
和这个结合 -fdump-ada-规范[-瘦] 以上,生成 Ada 规范作为
亲 单元.
-fdump-go-spec=文件
对于任何语言的输入文件,在 文件。 这
生成 Go 的“const”、“type”、“var”和“func”声明,这可能是一种有用的方法
开始为用其他语言编写的代码编写 Go 接口。
@文件
从中读取命令行选项 文件. 读取的选项被插入代替
原来的 @文件 选项。 如果 文件 不存在或无法读取,则该选项
将按字面处理,而不是删除。
中的选项 文件 由空格分隔。 可以包含空格字符
通过用单引号或双引号将整个选项括在一个选项中。 任何
字符(包括反斜杠)可以通过在字符前加上前缀来包含
包含反斜杠。 这 文件 可能本身包含额外的@文件 选项; 任何
这些选项将被递归处理。
编译中 C + +中 项目
C++ 源文件通常使用后缀之一 .C, 的cc, 的.cpp, .CPP, .c++, .cp或
.cxx; C++ 头文件经常用到 .HH, .hpp, .H, 或(用于共享模板代码) .tcc;和
预处理的 C++ 文件使用后缀 .ii. GCC 识别具有这些名称的文件并
即使您以与编译相同的方式调用编译器,也将它们编译为 C++ 程序
C 程序(通常带有名称 GCC).
但是,使用 GCC 不添加 C++ 库。 克++ 是一个调用 GCC 和的程序
自动指定针对 C++ 库的链接。 它对待 .c, .h 和 .i 文件为
C++ 源文件而不是 C 源文件,除非 -x 用来。 这个程序也很有用
预编译 C 头文件时 .h 用于 C++ 编译的扩展。 在
许多系统, 克++ 也用名字安装 C ++.
当您编译 C++ 程序时,您可以指定许多相同的命令行选项
您用于编译任何语言的程序; 或对 C 有意义的命令行选项
和相关语言; 或仅对 C++ 程序有意义的选项。
附加选项 控制 C 方言
以下选项控制 C 的方言(或从 C 派生的语言,例如 C++、
编译器接受的 Objective-C 和 Objective-C++):
-ansi
在 C 模式下,这相当于 -std=c90. 在C++模式下,相当于
-std=c++98.
这会关闭 GCC 的某些与 ISO C90 不兼容的功能(当
编译 C 代码)或标准 C++(编译 C++ 代码时),例如“asm”和
“typeof”关键字和预定义的宏,例如“unix”和“vax”
您正在使用的系统类型。 它还启用了不受欢迎且很少使用的 ISO
三字功能。 对于 C 编译器,它禁用对 C++ 风格的识别 //
评论以及“内联”关键字。
备用关键字“__asm__”、“__extension__”、“__inline__”和“__typeof__”
尽管继续工作 -ansi. 你不会想在 ISO C 程序中使用它们,
当然,但是将它们放在可能包含在
编译完成 -ansi. 替代的预定义宏,例如“__unix__”和
“__vax__”也可用,有或没有 -ansi.
这款 -ansi 选项不会导致非 ISO 程序被无故拒绝。 为了
认为, -W迂腐 还需要 -ansi.
宏“__STRICT_ANSI__”在 -ansi 选项被使用。 一些标题
文件可能会注意到这个宏并避免声明某些函数或定义
ISO 标准不要求的某些宏; 这是为了避免干扰
任何可能将这些名称用于其他用途的程序。
通常内置但没有 ISO C 定义的语义的函数(例如
因为“alloca”和“ffs”)不是内置函数,当 -ansi 用来。
-标准=
确定语言标准。 此选项当前仅在以下情况下受支持
编译 C 或 C++。
编译器可以接受几个基本标准,例如 c90 or C ++ 98, 和 GNU 方言
这些标准,例如 GNU90 or GNU++98. 当指定基本标准时,
编译器接受所有遵循该标准的程序以及使用 GNU 扩展的程序
这并不矛盾。 例如, -std=c90 关闭 GCC 的某些功能
与 ISO C90 不兼容的,例如“asm”和“typeof”关键字,但不兼容
其他在 ISO C90 中没有意义的 GNU 扩展,例如省略
“?:”表达式的中间词。 另一方面,当一个标准的 GNU 方言
指定,编译器支持的所有功能都被启用,即使那些
特性改变了基本标准的含义。 因此,一些严格遵守
程序可能会被拒绝。 该特定标准由 -W迂腐 识别
考虑到该标准版本,哪些功能是 GNU 扩展。 例如
-std=gnu90 -W迂腐 警告 C++ 风格 // 评论,而 -std=gnu99 -W迂腐
才不是。
必须提供此选项的值; 可能的值是
c90
c89
iso9899:1990
支持所有 ISO C90 程序(某些与 ISO C90 冲突的 GNU 扩展)
被禁用)。 与...一样 -ansi 对于 C 代码。
iso9899:199409
ISO C90 在修订版 1 中修改。
c99
9
iso9899:1999
ISO9899:199x
ISO C99。 请注意,此标准尚未得到完全支持; 看
<http://gcc.gnu.org/c99status.html> 了解更多信息。 名字 9 和
ISO9899:199x 已弃用。
c11
1
iso9899:2011
ISO C11,ISO C 标准的 2011 年修订版。 支持不完整和
实验性的。 名字 1 已弃用。
GNU90
GNU89
ISO C90 的 GNU 方言(包括一些 C99 功能)。 这是 C 的默认设置
码。
GNU99
GNU9x
ISO C99 的 GNU 方言。 当 ISO C99 在 GCC 中完全实施时,这将
成为默认。 名字 GNU9x 已弃用。
GNU11
GNU1x
ISO C11 的 GNU 方言。 支持是不完整的和实验性的。 名字 GNU1x
已弃用。
C ++ 98
C ++ 03
1998 ISO C++ 标准加上 2003 技术勘误和一些附加
缺陷报告。 与...一样 -ansi 对于 C++ 代码。
GNU++98
GNU++03
GNU 方言 -std=c++98. 这是 C++ 代码的默认设置。
C ++ 11
C++0x
2011 ISO C++ 标准加上修正。 仍然支持 C++11
实验性的,并且可能会在未来版本中以不兼容的方式进行更改。 名字
C++0x 已弃用。
GNU++11
GNU++0x
GNU 方言 -std=c++11. 对 C++11 的支持仍处于试验阶段,可能会发生变化
在未来的版本中以不兼容的方式。 名字 GNU++0x 已弃用。
C++1y
ISO C++ 标准的下一个修订版,暂定于 2017 年进行。支持
是高度实验性的,几乎肯定会以不兼容的方式改变
未来的版本。
GNU++1y
GNU 方言 -std=c++1y. 支持是高度实验性的,几乎将
在未来的版本中肯定会以不兼容的方式改变。
-fgnu89-内联
选项 -fgnu89-内联 告诉 GCC 使用传统的 GNU 语义进行“内联”
在 C99 模式下运行。
此选项被 GCC 版本 4.1.3 接受并忽略,直到但不包括
4.3. 在 GCC 4.3 及更高版本中,它改变了 GCC 在 C99 模式下的行为。 使用
这个选项大致相当于将“gnu_inline”函数属性添加到所有
内联函数。
选项 -fno-gnu89-内联 明确告诉 GCC 使用 C99 语义
“内联”在 C99 或 gnu99 模式下(即,它指定默认行为)。 这个
选项首先在 GCC 4.3 中得到支持。 不支持此选项 -std=c90 or
-std=gnu90 模式。
可以使用预处理器宏“__GNUC_GNU_INLINE__”和“__GNUC_STDC_INLINE__”
检查哪些语义对“内联”函数有效。
- 辅助信息 文件名
输出到给定文件名的所有函数的原型声明和/或
在翻译单元中定义,包括头文件中的那些。 这个选项是
在除 C 之外的任何语言中被默默忽略。
除了声明之外,该文件在注释中指明了每个声明的来源
(源文件和行),声明是隐式的、原型的还是
非原型(I, N 对于新的或 O for old,分别在第一个字符后
行号和冒号),以及它来自声明还是定义
(C or F,分别在以下字符中)。 在函数的情况下
定义,K&R 风格的参数列表,后跟它们的声明也是
在声明之后,在内部评论中提供。
-fallow-无参数可变函数
接受没有命名参数的可变参数函数。
尽管可以定义这样的函数,但这并不是很有用
无法阅读参数。 这仅受 C 支持,因为此构造是
C++ 允许。
-fno-asm
不要将“asm”、“inline”或“typeof”识别为关键字,以便代码可以使用这些
词作为标识符。 您可以使用关键字“__asm__”、“__inline__”和
“__typeof__”代替。 -ansi 暗示 -fno-asm.
在 C++ 中,这个开关只影响“typeof”关键字,因为“asm”和“inline”是
标准关键字。 您可能想要使用 -fno-gnu-关键字 代替标志,它有
一样的效果。 在 C99 模式下 (-std=c99 or -std=gnu99),这个开关只影响
"asm" 和 "typeof" 关键字,因为 "inline" 是 ISO C99 中的标准关键字。
-fno 内置
-fno-内置-功能
不要识别不以开头的内置函数 __内置_ 作为前缀。
GCC 通常会生成特殊的代码来处理某些内置函数
有效率的; 例如,对“alloca”的调用可能成为单个指令
直接调整堆栈,对“memcpy”的调用可能会成为内联复制循环。 这
结果代码通常既小又快,但由于函数调用没有
不再出现这样的情况,您不能在这些调用上设置断点,也不能更改
通过链接不同的库来改变函数的行为。 此外,当
函数被识别为内置函数,GCC 可能会使用有关该函数的信息
函数来警告调用该函数的问题,或者生成更多
高效的代码,即使结果代码仍然包含对该函数的调用。 为了
例如,警告给出 -格式 当“printf”为“printf”时对“printf”的错误调用
内置和“strlen”已知不会修改全局内存。
随着 -fno-内置-功能 选项仅内置功能 功能 被禁用。
功能 不能以 __内置_. 如果函数的名称不是内置的
在这个版本的 GCC 中,这个选项被忽略了。 没有对应的
-f内置-功能 选项; 如果您希望在以下情况下有选择地启用内置功能
运用 -fno 内置 or -f独立,您可以定义宏,例如:
#定义abs(n) __builtin_abs ((n))
#define strcpy(d, s) __builtin_strcpy ((d), (s))
-寄养
断言编译针对托管环境。 这意味着 -f内置。 一个
托管环境是一种可以使用整个标准库的环境,并且在
其中“main”的返回类型为“int”。 例子几乎是一切,除了
核心。 这相当于 -fno-独立.
-f独立
断言编译针对独立环境。 这意味着
-fno 内置. 一个独立的环境是一个标准库可能不
存在,并且程序启动不一定在“main”。 最明显的例子
是一个操作系统内核。 这相当于 -fno 托管.
-fopenmp
启用对 C/C++ 中的 OpenMP 指令“#pragma omp”和 Fortran 中的“!$omp”的处理。
什么时候 -fopenmp 指定,编译器根据
OpenMP 应用程序接口 v3.0http://www.openmp.org/>. 这个选项
暗示 -p线程,因此仅支持支持
-p线程.
-fgnu-tm
当选项 -fgnu-tm 指定,编译器为 Linux 生成代码
英特尔当前事务内存 ABI 规范文档的变体(修订版
1.1,6 年 2009 月 XNUMX 日)。 这是一个实验性功能,其界面可能会在
随着官方规范的变化,GCC 的未来版本。 请注意,不是
此功能支持所有架构。
有关 GCC 对事务内存的支持的更多信息,
请注意,非调用异常不支持事务内存功能
(-f 非调用异常).
-fms-扩展
接受 Microsoft 头文件中使用的一些非标准结构。
在 C++ 代码中,这允许结构中的成员名称类似于以前的类型
声明。
typedef int UOW;
结构ABC{
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇
};
结构和联合中未命名字段的某些情况仅接受此
选项。
-fplan9-扩展
接受 Plan 9 代码中使用的一些非标准结构。
这使 -fms-扩展, 允许传递匿名结构的指针
需要指向字段类型元素的函数的字段,以及
允许引用使用 typedef 声明的匿名字段。 这只是
支持 C,而不是 C++。
-三合字母
支持 ISO C 三字符。 这 -ansi 选项(和 -标准 严格的 ISO C 选项
一致性)意味着 -三合字母.
-传统
-传统-cpp
以前,这些选项会导致 GCC 尝试模拟预标准的 C 编译器。
他们现在只支持 -E 转变。 预处理器继续支持
预标准模式。 有关详细信息,请参阅 GNU CPP 手册。
-fcond-不匹配
允许在第二个和第三个参数中使用类型不匹配的条件表达式。
这种表达式的值是无效的。 C++ 不支持此选项。
-亚麻矢量转换
允许具有不同元素数量和/或的向量之间的隐式转换
不兼容的元素类型。 此选项不应用于新代码。
-funsigned-char
让“char”类型是无符号的,比如“unsigned char”。
每种机器都有一个默认的“字符”应该是什么。 它要么像
默认情况下为“无符号字符”或默认为“有符号字符”。
理想情况下,可移植程序应始终使用“signed char”或“unsigned char”
取决于对象的签名。 但是已经编写了许多程序来使用
简单的“字符”并期望它被签名,或者期望它是未签名的,具体取决于
它们是为机器编写的。 此选项及其反选项可让您做出这样的
程序以相反的默认值工作。
“char”类型总是与“signed char”或“unsigned char”中的每一个不同的类型
char”,即使它的行为总是像这两者之一。
-fsigned-char
让类型“char”有符号,比如“signed char”。
请注意,这等效于 -fno-无符号字符,这是的否定形式
-funsigned-char. 同样,选项 -fno-签名字符 相当于
-funsigned-char.
-f 有符号位域
-f 无符号位域
-fno 有符号位域
-fno-无符号位域
这些选项控制位域是有符号还是无符号,当声明
不使用“已签名”或“未签名”。 默认情况下,这样的位域是有符号的,
因为这是一致的:诸如“int”之类的基本整数类型是有符号类型。
附加选项 控制 C + +中 方言
本节介绍仅对 C++ 程序有意义的命令行选项。
无论您的程序是什么语言,您还可以使用大多数 GNU 编译器选项
例如,您可以像这样编译文件“firstClass.C”:
g++ -g -frepo -O -c 第一类.C
在这个例子中,只有 -弗雷波 是一个仅适用于 C++ 程序的选项; 你可以使用
GCC 支持的任何语言的其他选项。
这是一个选项列表 仅由 用于编译 C++ 程序:
-fabi版本=n
使用版本 n C++ ABI。 默认为版本 2。
版本 0 是指最符合 C++ ABI 规范的版本。
因此,使用版本 0 获得的 ABI 在不同版本的 G++ 中会发生变化
因为 ABI 错误已修复。
版本 1 是首次出现在 G++ 3.2 中的 C++ ABI 版本。
版本 2 是首次出现在 G++ 3.4 中的 C++ ABI 版本。
版本 3 更正了将常量地址修改为模板参数的错误。
版本 4 首次出现在 G++ 4.5 中,实现了向量的标准重整
类型。
首次出现在 G++ 5 中的第 4.6 版更正了属性的重整
函数指针类型上的 const/volatile、普通 decl 的 decltype 以及 a 的使用
函数参数在另一个参数的声明中。
第 6 版,首次出现在 G++ 4.7 中,纠正了 C++11 的提升行为
范围枚举和模板参数包的重整,const/static_cast,前缀++
和 --,以及用作模板参数的类作用域函数。
参见 -侘.
-fno-访问控制
关闭所有访问检查。 此开关主要用于解决
访问控制代码。
-fcheck-新
在尝试之前检查“operator new”返回的指针是否为非空
修改分配的存储。 这种检查通常是不必要的,因为 C++
标准指定“operator new”仅在声明时返回 0 扔()在
在这种情况下,即使没有此选项,编译器也会始终检查返回值。 在
所有其他情况,当“operator new”具有非空异常规范时,内存
通过抛出“std::bad_alloc”来表示耗尽。 也可以看看 新 (不扔).
-fconstexpr-深度=n
将 C++11 constexpr 函数的最大嵌套计算深度设置为 n. 一个限制
需要在常量表达式评估期间检测无限递归。 这
标准规定的最小值为 512。
-f推导初始化列表
允许从大括号中将模板类型参数推导为“std::initializer_list”-
封闭的初始化列表,即
模板自动转发(T t) -> decltype (realfn (t))
{
返回 realfn (t);
}
无效 f()
{
转发({1,2}); // 呼叫前转 >
}
这一扣除是作为对最初提议的可能的扩展而实施的
C++11 标准的语义,但不是最终标准的一部分,所以它是
默认禁用。 此选项已弃用,将来可能会删除
G++ 版本。
-ffriend 注射
将友元函数注入封闭的命名空间,以便它们在外部可见
声明它们的类的范围。 友元函数已记录
在旧的带注释的 C++ 参考手册和之前的 G++ 版本中以这种方式工作
4.1 总是那样工作。 但是,在 ISO C++ 中,友元函数不是
在封闭作用域中声明的只能使用依赖参数的查找来找到。
此选项会导致朋友被注入,就像他们在早期版本中一样。
此选项是为了兼容性,可能会在 G++ 的未来版本中删除。
-fno-elide-构造函数
C++ 标准允许一个实现省略创建一个临时的
用于初始化另一个相同类型的对象。 指定此选项将禁用
该优化,并强制 G++ 在所有情况下调用复制构造函数。
-fno-enforce-eh-规格
不要在运行时生成代码来检查是否违反了异常规范。
此选项违反 C++ 标准,但可能有助于减少
生产构建,很像定义 调试. 这不会授予用户代码权限
违反异常规范抛出异常; 编译器仍然
根据规范进行优化,因此抛出意外异常会导致
运行时未定义的行为。
-fextern-tls-init
-fno-extern-tls-init
C++11 和 OpenMP 标准允许 线程本地 和 线程私有 变量
动态(运行时)初始化。 为了支持这一点,任何此类变量的使用都会
通过一个执行任何必要初始化的包装函数。 当使用
和变量的定义在同一个翻译单元中,这个开销可以是
优化掉了,但是当使用在不同的翻译单元中时
即使变量实际上不需要动态,也会产生显着的开销
初始化。 如果程序员可以确定在一个非变量中没有使用
定义TU需要触发动态初始化(要么是因为变量是
静态初始化,或将执行定义 TU 中变量的使用
在另一个 TU 中的任何使用之前),他们可以避免这种开销
-fno-extern-tls-init 选项。
在支持符号别名的目标上,默认值为 -fextern-tls-init. 在目标上
不支持符号别名,默认是 -fno-extern-tls-init.
-ffor-范围
-fno-范围
If -ffor-范围 被指定,在 a 中声明的变量的范围 for-init-语句
仅限于 循环本身,如 C++ 标准所指定。 如果
-fno-范围 被指定,在 a 中声明的变量的范围 for-init-语句
扩展到封闭范围的末尾,就像在旧版本的 G++ 中一样,并且
C++ 的其他(传统)实现。
如果没有给出标志,则默认遵循标准,但允许和给予
旧式代码的警告,否则将无效,或具有不同的
行为。
-fno-gnu-关键字
不要将“typeof”识别为关键字,以便代码可以将此词用作
标识符。 您可以改用关键字“__typeof__”。 -ansi 暗示
-fno-gnu-关键字.
-fno-隐式模板
永远不要为隐式实例化的非内联模板发出代码(即通过
用); 只发出显式实例化的代码。
-fno-隐式内联模板
也不要为内联模板的隐式实例化发出代码。 默认的
以不同的方式处理内联,以便在需要和不需要优化的情况下进行编译
相同的一组显式实例。
-fno-实现内联
为了节省空间,不要发出由控制的内联函数的外联副本
#pragma 履行. 如果这些函数没有内联,这会导致链接器错误
到处都有他们的名字。
-fms-扩展
禁用有关 MFC 中使用的构造的 Wpedantic 警告,例如隐式 int 和
通过非标准语法获取指向成员函数的指针。
-fno-nonansi-builtins
禁用 ANSI/ISO C 未强制要求的函数的内置声明。这些
包括“ffs”、“alloca”、“_exit”、“index”、“bzero”、“conjf”等相关
功能。
-fnothrow-选择
将“throw()”异常规范视为“noexcept”规范
减少或消除相对于函数的文本大小开销,无一例外
规格。 如果函数具有非平凡类型的局部变量
析构函数,异常规范实际上使函数更小,因为
可以优化这些变量的 EH 清理。 语义效果是
从具有此类异常规范的函数中抛出异常
导致调用“终止”而不是“意外”。
-fno 操作员名称
不要对待运算符名称关键字“and”、“bitand”、“bitor”、“compl”、“not”、“or”
和“xor”作为关键字的同义词。
-fno-可选诊断
禁用标准说编译器不需要发出的诊断。
目前,G++ 发布的唯一此类诊断是针对具有以下名称的名称的诊断:
一个类中的多重含义。
-f宽容
将一些关于不符合代码的诊断从错误降级为警告。 因此,
运用 -f宽容 允许编译一些不合格的代码。
-fno-漂亮模板
当错误消息涉及函数模板的特化时,编译器
通常打印模板的签名后跟模板参数和
签名中的任何类型定义或类型名(例如“void f(T) [with T = int]”而不是
而不是 "void f(int)") 以便清楚涉及哪个模板。 当一个错误
消息是指类模板的特化,编译器会忽略任何
与该模板的默认模板参数匹配的模板参数。 如果
这些行为中的任何一个都使理解错误消息变得更加困难,而不是
更容易,你可以使用 -fno-漂亮模板 禁用它们。
-弗雷波
在链接时启用自动模板实例化。 此选项还暗示
-fno-隐式模板.
-fno-rtti
禁用生成有关每个类的信息的虚拟函数以供使用
C++ 运行时类型识别特性(动态转换 和 伤寒)。 如果你不
使用语言的那些部分,您可以通过使用此标志来节省一些空间。 笔记
异常处理使用相同的信息,但 G++ 根据需要生成它。 这
动态转换 运算符仍可用于不需要运行时类型的强制转换
信息,即转换为“void *”或明确的基类。
-fstats
在编译结束时发出有关前端处理的统计信息。 这个
信息通常只对 G++ 开发团队有用。
-fstrict-枚举
允许编译器使用枚举类型的值进行优化
只能是枚举值之一(在 C++ 标准中定义;
基本上,可以用所需的最少位数表示的值
代表所有的枚举器)。 如果程序使用
将任意整数值转换为枚举类型的强制转换。
-ftemplate-backtrace-limit=n
为单个警告或错误设置模板实例化注释的最大数量
至 n. 默认值为 10。
-f模板深度=n
将模板类的最大实例化深度设置为 n. 一个限制
需要模板实例化深度来检测模板期间的无限递归
类实例化。 符合 ANSI/ISO C++ 的程序不得依赖最大
深度大于 17(在 C++1024 中更改为 11)。 默认值为 900,因为
在某些情况下,编译器可能会在达到 1024 之前耗尽堆栈空间。
-fno-线程安全-静态
不要发出额外的代码来使用 C++ ABI 中为线程指定的例程-
局部静态的安全初始化。 您可以使用此选项来减少代码大小
稍微在不需要线程安全的代码中。
-保险丝-cxa-atexit
使用“__cxa_atexit”为具有静态存储持续时间的对象注册析构函数
函数而不是“atexit”函数。 完全需要此选项
符合标准的静态析构函数处理,但仅适用于您的 C 库
支持“__cxa_atexit”。
-fno-use-cxa-get-Exception-ptr
不要使用“__cxa_get_exception_ptr”运行时例程。 这引起
"std::uncaught_exception" 不正确,但如果运行时例程是必需的
无法使用。
-fvisibility-inlines-hidden
此开关声明用户不会尝试将指针与内联进行比较
两个函数的地址取不同的函数或方法
共享对象。
这样做的结果是 GCC 可以有效地将内联方法标记为
"__attribute__ ((visibility ("hidden")))" 这样它们就不会出现在导出中
DSO 的表,并且在 DSO 中使用时不需要 PLT 间接。
启用此选项会对 DSO 的加载和链接时间产生巨大影响,因为它
当库变重时,大量减少动态导出表的大小
模板的使用。
此开关的行为与将方法标记为隐藏的行为并不完全相同
直接,因为它不会影响函数局部的静态变量或导致
编译器推断该函数仅在一个共享对象中定义。
您可以显式地将方法标记为具有可见性以否定
切换到该方法。 例如,如果您确实想比较指向
特定的内联方法,您可以将其标记为具有默认可见性。 标记
具有显式可见性的封闭类不起作用。
显式实例化的内联方法不受此选项的影响,因为它们的链接
否则可能会跨越共享库边界。
-fvisibility-ms-compat
这个标志试图使用可见性设置来制作 GCC 的 C++ 链接模型
与 Microsoft Visual Studio 兼容。
该标志对 GCC 的链接模型进行了以下更改:
1.它将默认可见性设置为“隐藏”,例如 -fvisibility=隐藏.
2. 默认情况下不隐藏类型,但不隐藏其成员。
3. 没有明确可见性的类型放宽了单一定义规则
在多个共享对象中定义的规范:那些声明
如果不使用此选项时允许,则允许。
在新代码中最好使用 -fvisibility=隐藏 并导出那些类
旨在外部可见。 不幸的是,代码有可能依赖,
也许是偶然的,关于 Visual Studio 的行为。
这些变化的后果之一是相同类型的静态数据成员
同名但在不同的共享对象中定义的不同,所以更改
一个不会改变另一个; 以及指向定义的函数成员的指针
不同的共享对象可能不相等。 当给出这个标志时,它是一个
违反 ODR 以不同方式定义具有相同名称的类型。
-fno-弱
不要使用弱符号支持,即使它是由链接器提供的。 默认情况下,G++
如果可用,则使用弱符号。 此选项仅用于测试,并且
不应由最终用户使用; 它会导致低劣的代码并且没有任何好处。
此选项可能会在 G++ 的未来版本中删除。
-nostdinc++
不要在特定于 C++ 的标准目录中搜索头文件,但要
仍然搜索其他标准目录。 (此选项用于构建
C++ 库。)
此外,这些优化、警告和代码生成选项仅具有意义
对于 C++ 程序:
-fno-默认内联
不要假设 一致 对于在类范围内定义的函数。
请注意,这些函数与内联函数一样具有链接; 他们只是不是
默认内联。
-侘 (仅限 C、Objective-C、C++ 和 Objective-C++)
当 G++ 生成可能与供应商中立的代码不兼容时发出警告
C++ ABI。 尽管已努力对所有此类情况发出警告,但仍有
可能有些情况没有被警告,即使 G++ 正在生成
不兼容的代码。 也可能存在发出警告的情况,即使
生成的代码是兼容的。
如果您担心
事实上,由 G++ 生成的代码可能与由 G++ 生成的代码不二进制兼容
其他编译器。
已知的不兼容性 -fabi-版本=2 (默认)包括:
· 带有引用类型的非类型模板参数的模板被破坏
错误地:
外部整数 N;
模板结构体{};
无效 n (S ) {2}
这是固定在 -fabi-版本=3.
· 使用“__attribute ((vector_size))”声明的 SIMD 向量类型在一个
不允许重载采用向量的函数的非标准方式
不同的尺寸。
重整已更改为 -fabi-版本=4.
已知的不兼容性 -fabi-版本=1 包括:
· 位域的尾部填充处理不正确。 G++ 可能会尝试打包数据
放入与基类相同的字节中。 例如:
struct A { virtual void f(); 内部 f1 : 1; };
结构 B : 公共 A { int f2 : 1; };
在这种情况下,G++ 将“B::f2”放入与“A::f1”相同的字节中; 其他编译器做
不是。 您可以通过显式填充“A”来避免此问题,使其大小为
平台上字节大小的倍数; 这导致 G++ 和其他编译器
以相同的方式布置“B”。
· 对虚拟碱基的尾部填充处理不正确。 G++ 不使用尾部
布置虚拟基地时的填充。 例如:
struct A { virtual void f(); 字符 c1; };
结构 B { B(); 字符 c2; };
结构C:公共A,公共虚拟B{};
在这种情况下,G++ 不会将“B”放入“A”的尾部填充中; 其他
编译器做。 您可以通过显式填充“A”来避免此问题,以便其
大小是其对齐的倍数(忽略虚拟基类); 导致
G++ 和其他编译器以相同的方式布置“C”。
· 对声明宽度大于其宽度的位域的错误处理
底层类型,当位域出现在联合中时。 例如:
联合 U { int i: 4096; };
假设一个“int”没有 4096 位,G++ 使联合太小了
“int”中的位数。
· 空类可以放置在不正确的偏移量处。 例如:
结构体{};
结构 B {
一个;
虚空 f();
};
结构 C : 公共 B, 公共 A {};
G++ 将“C”的“A”基类放置在非零偏移处; 它应该放在
偏移为零。 G++ 错误地认为“B”的“A”数据成员已经是
在零偏移处。
· 类型涉及“typename”或模板模板的模板函数的名称
参数可能会被错误地修改。
模板
无效 f(类型名 Q::X) {}
模板课堂Q>
void f(类型名 Q ::X) {}
这些模板的实例化可能会被错误地修改。
它还警告与 psABI 相关的更改。 此时已知的 psABI 发生变化
包括:
· 对于 SysV/x86-64,具有“long double”成员的联合在内存中作为
在 psABI 中指定。 例如:
联合 U {
长双 ld;
int i;
};
“union U”总是在内存中传递。
-Wctor-dtor-隐私 (仅限 C++ 和 Objective-C++)
当一个类看起来不可用时发出警告,因为其中的所有构造函数或析构函数
类是私有的,它既没有朋友也没有公共静态成员函数。
如果没有非私有方法,并且至少有一个私有成员,也会发出警告
不是构造函数或析构函数的函数。
-W删除非虚拟dtor (仅限 C++ 和 Objective-C++)
警告何时 删除 用于销毁具有虚函数的类的实例
和非虚拟析构函数。 删除派生类的实例是不安全的
如果基类没有虚拟,则通过指向基类的指针
析构函数。 此警告由启用 -墙.
-Wliteral-后缀 (仅限 C++ 和 Objective-C++)
当字符串或字符文字后跟 ud 后缀时发出警告
以下划线开头。 作为符合标准的扩展,GCC 将此类后缀视为
单独的预处理令牌以保持与代码的向后兼容性
使用格式宏来自“ “。 例如:
#定义__STDC_FORMAT_MACROS
#包括
#包括
int main(){
int64_t i64 = 123;
printf("我的 int64: %"PRId64"\n", i64);
}
在这种情况下,“PRId64”被视为单独的预处理标记。
默认情况下启用此警告。
-收窄 (仅限 C++ 和 Objective-C++)
当 C++11 禁止的收缩转换发生在 { },例如
int i = { 2.2 }; // 错误:从 double 缩小到 int
此标志包含在 -墙 和 -Wc++11-兼容.
在 -std=c++11, -Wno-缩小 抑制标准要求的诊断。
请注意,这不会影响格式良好的代码的含义; 缩小转换
在 SFINAE 上下文中仍然被认为是格式错误的。
-Wno例外 (仅限 C++ 和 Objective-C++)
当 noexcept 表达式因调用函数而计算为 false 时发出警告
没有非抛出异常规范(即 扔() or 没有例外)
但编译器知道从不抛出异常。
-Wnon-virtual-dtor (仅限 C++ 和 Objective-C++)
当类具有虚函数和可访问的非虚析构函数时发出警告,在
在这种情况下,删除派生类的实例可能但不安全
指向基类的指针。 如果出现以下情况,也会启用此警告 -Weffc++ 已指定。
-重新订购 (仅限 C++ 和 Objective-C++)
当代码中给出的成员初始值设定项的顺序与顺序不匹配时发出警告
他们必须在其中执行。 例如:
结构体{
int i;
国际 j;
A(): j (0), i (1) { }
};
编译器重新排列成员初始值设定项 i 和 j 匹配声明
成员的命令,发出警告。 此警告由启用
-墙.
-fext-数字文字 (仅限 C++ 和 Objective-C++)
接受虚数、定点数或机器定义的文字数字后缀作为 GNU
扩展名。 当此选项关闭时,这些后缀被视为 C++11 用户-
定义的文字数字后缀。 默认情况下,所有 C++11 之前的方言都启用此功能
以及所有 GNU 方言: -std=c++98, -std=gnu++98, -std=gnu++11, -std=gnu++1y。 这
ISO C++11 以后的选项默认关闭(-std=c++11,...)。
下列 -W... 选项不受 -墙.
-Weffc++ (仅限 C++ 和 Objective-C++)
警告违反 Scott Meyers 的以下风格指南 有效
C ++, 秒 版本 书:
· 第 11 条:为具有以下属性的类定义复制构造函数和赋值运算符
动态分配的内存。
· 第 12 条:在构造函数中优先于初始化而不是赋值。
· 第 14 项:使基类中的析构函数成为虚拟的。
· 第 15 条:让“operator=”返回对 *this 的引用。
· 第 23 条:当你必须返回一个对象时,不要试图返回一个引用。
还要警告违反 Scott Meyers 的以下风格指南 更多
有效 C + +中 书:
· 第6条:区分自增和自减的前缀和后缀形式
运营商。
· 第 7 条:永远不要重载“&&”、“||”或“,”。
选择此选项时,请注意标准库头文件并不遵守所有
这些指南; 用 grep的 -v 过滤掉这些警告。
-Wstrict-null-哨兵 (仅限 C++ 和 Objective-C++)
警告使用未强制转换的“NULL”作为标记。 仅使用 GCC 编译时
这是一个有效的标记,因为“NULL”被定义为“__null”。 虽然是空的
指针常量而不是空指针,保证大小相同
作为指针。 但是这种用法在不同的编译器之间是不可移植的。
-Wno-非模板朋友 (仅限 C++ 和 Objective-C++)
在模板中声明非模板化友元函数时禁用警告。
由于 G++ 中显式模板规范支持的出现,如果
朋友是一个不合格的 ID(即, 朋友 富(整数)),C++语言规范
要求朋友声明或定义一个普通的非模板函数。 (部分
14.5.3)。 在 G++ 实现显式规范之前,unqualified-ids 可以是
解释为模板化函数的特殊特化。 因为这
不符合的行为不再是 G++ 的默认行为,
-W非模板朋友 允许编译器检查现有代码是否存在潜在问题
点并默认开启。 这个新的编译器行为可以关闭
-Wno-非模板朋友, 保持一致的编译器代码但禁用
有用的警告。
-Wold风格铸造 (仅限 C++ 和 Objective-C++)
如果在 C++ 程序中使用旧式(C 样式)转换为非 void 类型,则发出警告。
新式演员 (动态转换, 静态铸造, 重新诠释及 常量类型转换) 是
不易受到意外影响,更容易搜索。
-Woverloaded-虚拟 (仅限 C++ 和 Objective-C++)
当函数声明对基类隐藏虚函数时发出警告。 为了
例如,在:
结构体{
虚空 f();
};
结构 B: 公共 A {
无效 f(int);
};
“f”的“A”类版本隐藏在“B”中,代码如下:
乙*乙;
b-> f();
无法编译。
-Wno-pmf-转换 (仅限 C++ 和 Objective-C++)
禁用将指向成员函数的绑定指针转换为普通指针的诊断
指针。
-Wsign-促销 (仅限 C++ 和 Objective-C++)
当重载决议选择从无符号或枚举类型提升到
有符号类型,通过转换为相同大小的无符号类型。 以前的
G++ 的版本试图保留无符号性,但标准要求当前
行为。
附加选项 控制 Objective-C的 和 目标C ++ 方言
(注意:本手册不描述 Objective-C 和 Objective-C++ 语言
他们自己。
本节介绍仅对 Objective-C 有意义的命令行选项
和 Objective-C++ 程序。 您还可以使用大部分与语言无关的 GNU
编译器选项。 例如,您可以像这样编译文件“some_class.m”:
gcc -g -fgnu-runtime -O -c some_class.m
在这个例子中, -fgnu-运行时 是一个仅适用于 Objective-C 和 Objective-C++ 的选项
程式; 您可以将其他选项用于 GCC 支持的任何语言。
请注意,由于 Objective-C 是 C 语言的扩展,因此 Objective-C 编译
也可以使用特定于 C 前端的选项(例如, -传统的)。 同样的,
Objective-C++ 编译可能会使用 C++ 特定的选项(例如, -侘).
这是一个选项列表 仅由 用于编译 Objective-C 和 Objective-C++
程式:
-f 常量字符串类=类名
使用 类名 作为要为每个文字字符串实例化的类的名称
使用语法“@”...“”指定。 默认类名是“NXConstantString”,如果
正在使用 GNU 运行时,如果正在使用 NeXT 运行时,则使用“NSConstantString”
使用(见下文)。 这 -f常量 cfstrings 选项(如果也存在)覆盖
-f 常量字符串类 设置并导致“@”...“”文字被布置为常量
CoreFoundation 字符串。
-fgnu-运行时
生成与标准 GNU Objective-C 运行时兼容的目标代码。 这是
大多数类型系统的默认设置。
-fnext-运行时
生成与 NeXT 运行时兼容的输出。 这是基于 NeXT 的默认设置
系统,包括 Darwin 和 Mac OS X。宏“__NEXT_RUNTIME__”是预定义的,如果
(并且仅当)使用此选项。
-fno-nil-接收器
假设所有的 Objective-C 消息都在此分派 ("[receiver message:arg]")
翻译单元确保接收者不是“nil”。 这允许更多
要使用的运行时中的高效入口点。 此选项仅适用于
结合 NeXT 运行时和 ABI 版本 0 或 1。
-fobjc-abi-版本=n
使用版本 n 所选运行时的 Objective-C ABI。 这个选项是
目前仅支持 NeXT 运行时。 在这种情况下,版本 0 是
不支持属性和其他 Objective-C 32 的传统(2.0 位)ABI
补充。 版本 1 是传统的(32 位)ABI,支持属性和
其他 Objective-C 2.0 新增功能。 版本 2 是现代(64 位)ABI。 如果什么都没有
指定,在 0 位目标机器上默认为版本 32,在 2 位目标机器上默认为版本 64
目标机器。
-fobjc-call-cxx-cdtors
对于每个 Objective-C 类,检查它的任何实例变量是否是 C++ 对象
具有非平凡的默认构造函数。 如果是,合成一个特殊的“-(id)
.cxx_construct” 实例方法,它在任何
这样的实例变量,按顺序,然后返回“self”。 同样,检查是否有
实例变量是一个带有非平凡析构函数的 C++ 对象,如果是,则合成
一个特殊的“- (void) .cxx_destruct”方法,它运行所有这样的默认析构函数,在
相反的顺序。
“- (id) .cxx_construct”和“- (void) .cxx_destruct”方法因此仅生成
对当前 Objective-C 类中声明的实例变量进行操作,而不是那些
从超类继承。 Objective-C 运行时的责任是
在对象的继承层次结构中调用所有这些方法。 “- (id)
.cxx_construct" 方法在新对象出现后立即由运行时调用
实例已分配; 立即调用“- (void) .cxx_destruct”方法
在运行时释放对象实例之前。
在撰写本文时,只有 Mac OS X 10.4 及更高版本上的 NeXT 运行时支持
调用“-(id).cxx_construct”和“-(void).cxx_destruct”方法。
-fobjc-直接调度
允许快速跳转到消息调度程序。 在达尔文,这是通过
通讯页面。
-fobjc-异常
在 Objective-C 中启用对结构化异常处理的语法支持,类似于
C++ 和 Java 提供了什么。 此选项是使用 Objective-C 所必需的
关键字@try、@throw、@catch、@finally 和@synchronized。 此选项可用
与 GNU 运行时和 NeXT 运行时一起使用(但不能与
Mac OS X 10.2 及更早版本上的 NeXT 运行时)。
-fobjc-gc.
在 Objective-C 和 Objective-C++ 程序中启用垃圾回收 (GC)。 这个选项
仅适用于 NeXT 运行时; GNU 运行时有不同的垃圾
不需要特殊编译器标志的集合实现。
-fobjc-nilcheck
对于带有 ABI 版本 2 的 NeXT 运行时,检查方法中的 nil 接收器
在执行实际方法调用之前调用。 这是默认值,可以
禁用使用 -fno-objc-nilcheck. 永远不会检查类方法和超级调用
无论此标志设置为什么,都以这种方式为零。 目前这个标志确实
当使用 GNU 运行时或旧版本的 NeXT 运行时 ABI 时,什么也没有。
-fobjc-std=objc1
符合 Objective-C 1.0 的语言语法,GCC 4.0 识别的语言。
这只影响 C/C++ 语言的 Objective-C 补充; 它不影响
符合 C/C++ 标准,由单独的 C/C++ 方言控制
选项标志。 当此选项与 Objective-C 或 Objective-C++ 一起使用时
编译器,任何不被 GCC 4.0 识别的 Objective-C 语法都会被拒绝。 这个
如果你需要确保你的 Objective-C 代码可以用
旧版本的 GCC。
-freplace-objc 类
发出一个特殊的标记指示 ld(1) 不要在结果对象中静态链接
文件,并允许 迪尔德(1) 在运行时加载它。 这用于
结合 Fix-and-Continue 调试模式,目标文件在
问题可能会在程序过程中重新编译和动态重新加载
执行,而无需重新启动程序本身。 目前,Fix-and-
继续功能仅可与 Mac 上的 NeXT 运行时一起使用
OS X 10.3 及更高版本。
-f 零链接
在为 NeXT 运行时编译时,编译器通常会替换对
"objc_getClass("...")"(当类名在编译时已知时)与
在加载时初始化的静态类引用,这改善了运行时间
表现。 指定 -f 零链接 标志抑制此行为并导致
对要保留的“objc_getClass("...")”的调用。 这在零链接中很有用
调试模式,因为它允许修改单个类的实现
在程序执行过程中。 GNU 运行时当前始终保留对
"objc_get_class("...")" 无论命令行选项如何。
-gen-decls
将源文件中所有类的接口声明转储到名为
源名称.decl.
-Wassign-拦截 (仅限 Objective-C 和 Objective-C++)
每当垃圾收集器拦截 Objective-C 分配时发出警告。
-Wno-协议 (仅限 Objective-C 和 Objective-C++)
如果一个类被声明为实现一个协议,则为每个方法发出警告
在该类未实现的协议中。 默认行为是
对类中未明确实现的每个方法发出警告,即使
方法实现继承自超类。 如果您使用 -Wno-协议
选项,则认为从超类继承的方法被实现,
并且不会向他们发出警告。
-W选择器 (仅限 Objective-C 和 Objective-C++)
如果在执行过程中发现同一个选择器的多个不同类型的方法,则发出警告
汇编。 检查在最后阶段的方法列表上执行
汇编。 此外,对出现在
"@selector(...)" 表达式,以及该选择器的相应方法
编译时发现。 因为这些检查只在最后扫描方法表
编译时,如果编译的最后阶段是,则不会产生这些警告
未达到,例如因为在编译期间发现错误,或者因为
-f仅语法 选项正在使用。
-W严格选择器匹配 (仅限 Objective-C 和 Objective-C++)
如果找到多个具有不同参数和/或返回类型的方法,则发出警告
尝试使用此选择器向接收者发送消息时给定的选择器
输入“id”或“Class”。 当此标志关闭时(这是默认行为),
如果发现的任何差异仅限于共享的类型,编译器将忽略此类警告
相同的大小和对齐方式。
-Wundeclared-选择器 (仅限 Objective-C 和 Objective-C++)
如果找到引用未声明选择器的“@selector(...)”表达式,则发出警告。 一种
如果之前没有声明具有该名称的方法,则认为选择器未声明
"@selector(...)" 表达式,明确地在@interface 或@protocol 中
声明,或隐含在@implementation 部分中。 此选项始终执行
一旦找到“@selector(...)”表达式,它就会检查,而 -W选择器 仅由
在编译的最后阶段执行检查。 这也强制执行编码
方法和选择器必须在使用前声明的样式约定。
-print-objc-运行时信息
生成 C 标头,描述按值传递的最大结构(如果有)。
附加选项 至 系统 诊断 收件箱 格式化
传统上,诊断消息的格式与输出设备的格式无关。
方面(例如它的宽度,...)。 您可以使用下面描述的选项来控制
诊断消息的格式化算法,例如每行多少个字符,多久一次
应报告源位置信息。 请注意,某些语言前端可能
不尊重这些选项。
-fmessage-长度=n
尝试格式化错误消息,使它们适合约 n 字符。 的
默认为 72 个字符 克++ 和 0 表示支持的其余前端
海湾合作委员会。 如果 n 为零,则不进行换行; 每个错误消息都出现在
单线。
-fdiagnostics-show-location=一次
仅在换行模式下有意义。 指示诊断消息报告器
发出源位置信息 一旦; 也就是说,如果消息太长而无法容纳
在单个物理线上并且必须包装,源位置不会被发射
(作为前缀)在随后的连续行中一遍又一遍。 这是
默认行为。
-fdiagnostics-show-location=每一行
仅在换行模式下有意义。 指示诊断消息报告器
为产生的物理线路发出相同的源位置信息(作为前缀)
来自打破太长而无法在一行中显示的消息的过程。
-fno 诊断显示选项
默认情况下,发出的每个诊断都包含指示命令行选项的文本
直接控制诊断(如果诊断程序知道这样的选项)
机械)。 指定 -fno 诊断显示选项 旗帜压制了这一点
行为。
-fno-诊断-显示-插入符号
默认情况下,发出的每个诊断都包括原始源代码行和插入符号“^”
表示列。 此选项会隐藏此信息。
附加选项 至 请求 or 压制 </p>
警告是诊断消息,报告并非固有的结构
错误但有风险或表明可能存在错误。
以下与语言无关的选项不会启用特定警告,但会控制
GCC 产生的各种诊断信息。
-f仅语法
检查代码是否存在语法错误,但除此之外不要做任何事情。
-fmax-错误=n
将错误消息的最大数量限制为 n,此时 GCC 退出而不是
而不是尝试继续处理源代码。 如果 n 为 0(默认值),
产生的错误消息数量没有限制。 如果 -W 致命错误 也是
指定,然后 -W 致命错误 优先于该选项。
-w 禁止所有警告消息。
-错误
把所有的警告都变成错误。
-错误=
将指定的警告变成错误。 附加了警告说明符;
例如 -Werror=开关 将警告控制为 -W开关 成错误。
此开关采用否定形式,用于否定 -错误 对于特定警告;
例如 -Wno-error=开关 & -W开关 警告不是错误,即使 -错误
有效。
每个可控警告的警告消息包括控制
警告。 然后可以使用该选项 -错误= 和 -Wno-错误= 如上所述
以上。 (可以使用
-fno 诊断显示选项 旗帜。)
注意指定 -错误=FOO 自动暗示 -WFOO。 然而, -Wno-错误=FOO
并不意味着什么。
-W 致命错误
此选项导致编译器在发生第一个错误时中止编译
而不是试图继续前进并打印更多错误消息。
您可以请求许多特定警告,其中的选项以 -W, 例如
- 隐含的 请求对隐式声明发出警告。 这些特定警告中的每一个
options 也有否定形式开头 -没有- 关闭警告; 例如,
-Wno-隐式. 本手册仅列出了两种形式中的一种,以非默认形式为准。
有关更多特定于语言的选项,请参阅 C + +中 方言 附加选项 和 Objective-C的
和 目标C ++ 方言 附加选项.
当请求无法识别的警告选项时(例如, -Wunknown-警告), GCC 发出一个
诊断表明该选项未被识别。 然而,如果 -没有- 使用形式,
行为略有不同:没有为 -Wno-未知警告
除非正在生成其他诊断信息。 这允许使用新的 -没有- 选项
使用旧的编译器,但如果出现问题,编译器会警告无法识别的
选项存在。
-W迂腐
-迂腐
发出严格的 ISO C 和 ISO C++ 要求的所有警告; 拒绝所有程序
使用禁止的扩展,以及其他一些不遵循 ISO C 和 ISO 的程序
C++。 对于 ISO C,遵循任何指定的 ISO C 标准版本 -标准
使用的选项。
有效的 ISO C 和 ISO C++ 程序应该使用或不使用此选项正确编译
(虽然极少数需要 -ansi 或者 -标准 指定所需版本的选项
ISO C)。 但是,如果没有这个选项,某些 GNU 扩展和传统的 C 和
也支持 C++ 功能。 使用此选项,它们将被拒绝。
-W迂腐 不会导致使用替代关键字的警告消息
名字开头和结尾 __. 在表达式中也禁用了迂腐警告
在“__extension__”之后。 但是,只有系统头文件应该使用这些
逃生路线; 应用程序应该避免它们。
一些用户尝试使用 -W迂腐 检查程序是否符合严格的 ISO C 标准。 他们
很快发现它并没有完全按照他们的意愿行事:它发现了一些非 ISO 实践,
但不是全部——只有那些 ISO C 需要 诊断,以及其他一些用于
添加了哪些诊断。
在某些情况下,报告不符合 ISO C 的任何失败的功能可能很有用,
但需要大量额外的工作,并且与
-W迂腐. 我们没有计划在不久的将来支持这样的功能。
当标准规定为 -标准 代表 GNU 扩展的 C 方言,例如
GNU90 or GNU99,有对应的 基地 , ISO C 的版本
GNU 扩展方言是基于。 警告来自 -W迂腐 被给予他们在哪里
基本标准要求。 (发出这样的警告是没有意义的
仅适用于不在指定 GNU C 方言中的功能,因为根据定义,GNU
C 的方言包括编译器通过给定选项支持的所有功能,以及
没有什么可警告的。)
-迂腐的错误
喜欢 -W迂腐,除了会产生错误而不是警告。
-墙
这会启用一些用户考虑的有关构造的所有警告
有问题,并且很容易避免(或修改以防止警告),即使在
与宏结合。 这也启用了描述的一些特定于语言的警告
in C + +中 方言 附加选项 和 Objective-C的 和 目标C ++ 方言 附加选项.
-墙 打开以下警告标志:
-地址 -数组边界 (仅与 -氧气) -Wc++11-兼容 -Wchar-下标
-Wenum-比较 (在 C/ObjC 中;这在 C++ 中默认开启) -Wimplicit-int (C 和
仅限 Objective-C) -Wimplicit 函数声明 (仅限 C 和 Objective-C) -W评论
-格式 -Wmain (仅适用于 C/ObjC,除非 -f独立) -W 可能未初始化
-Wmissing-大括号 (仅适用于 C/ObjC) -W非空 - 括号 -W指针符号 -重新订购
-Wreturn 类型 -W序列点 -Wsign-比较 (仅在 C++ 中) -Wstrict-别名
-Wstrict-溢出=1 -W开关 -字形 -Wun初始化 -未知编译指示
-未使用的功能 -Wunused-标签 -未使用值 -Wunused-变量
-Wvolatile 寄存器变量
请注意,某些警告标志并不暗示 -墙. 其中一些警告
用户通常不认为有问题的结构,但
有时您可能希望检查; 其他人警告说,
在某些情况下是必要的或难以避免的,并且没有简单的方法来修改
代码来抑制警告。 其中一些是由 -维克斯特拉 但其中许多
必须单独启用。
-维克斯特拉
这会启用一些未启用的额外警告标志 -墙. (此选项使用
被称为 -W. 仍然支持旧名称,但新名称更多
描述性的。)
- 打砸了 -空体 -Wignored 预选赛 -Wmissing-field-initializers 缺少字段初始化器
-Wmissing-参数类型 (仅限 C) -Wold 风格声明 (仅限 C) -Woverride-初始化
-Wsign-比较 -Wtype-限制 -Wun初始化 -Wunused-参数 (仅与 -未使用 or
-墙) -未使用但设置参数 (仅与 -未使用 or -墙)
选项 -维克斯特拉 还会在以下情况下打印警告消息:
· 将指针与整数零进行比较 <, <=, >或 >=.
·(仅限 C++)一个枚举数和一个非枚举数都出现在条件语句中
表达。
·(仅限C++)模糊的虚拟基础。
·(仅限 C++)为已声明的数组添加下标 寄存器.
·(仅限 C++)获取已声明的变量的地址 寄存器.
·(仅限 C++)基类未在派生类的复制构造函数中初始化。
-Wchar-下标
如果数组下标的类型为“char”,则发出警告。 这是错误的常见原因,因为
程序员经常忘记这种类型在某些机器上是签名的。 这个警告是
启用 -墙.
-W评论
每当评论开始序列时发出警告 /* 出现在一个 /* 评论,或每当
反斜杠换行符出现在 // 评论。 此警告由启用 -墙.
-无覆盖不匹配
使用时如果反馈配置文件不匹配,则发出警告 -fprofile 使用 选项。 如果一个
源文件在编译之间发生了变化 -fprofile-gen 和 -fprofile 使用,
带有配置文件反馈的文件可能无法匹配源文件,GCC 无法匹配
使用个人资料反馈信息。 默认情况下,此警告已启用并且是
视为错误。 -无覆盖不匹配 可用于禁用警告或
-Wno-error=覆盖不匹配 可用于禁用错误。 禁用错误
因为此警告可能导致代码优化不佳,并且仅在以下情况下有用
非常小的更改,例如对现有代码库的错误修复。 完全禁用
不推荐警告。
-Wno-cpp
(仅限 C、Objective-C、C++、Objective-C++ 和 Fortran)
禁止“#warning”指令发出的警告消息。
-W双提升 (仅限 C、C++、Objective-C 和 Objective-C++)
当“float”类型的值被隐式提升为“double”时发出警告。 中央处理器
使用 32 位“单精度”浮点单元在硬件中实现“浮点”,
但在软件中模拟“双重”。 在这样的机器上,使用
由于软件所需的开销,“double”值要贵得多
仿真。
很容易不小心用“double”进行计算,因为浮点
文字是隐式的“double”类型。 例如,在:
浮动区域(浮动半径)
{
返回 3.14159 * 半径 * 半径;
}
编译器使用“double”执行整个计算,因为浮点数
文字是“双重”。
-格式
-格式=n
检查对“printf”和“scanf”等的调用,以确保提供的参数
具有适合指定格式字符串的类型,并且转换
在格式字符串中指定是有意义的。 这包括标准功能,以及
其他由格式属性指定的,在“printf”、“scanf”、“strftime”和
“strfmon”(X/Open 扩展,不在 C 标准中)系列(或其他目标 -
特定家庭)。 哪些函数在没有格式属性的情况下被检查
指定取决于所选的标准版本,以及此类功能检查
没有指定的属性被禁用 -f独立 or -fno 内置.
根据 GNU libc 2.2 版支持的格式功能检查格式。
这些包括所有 ISO C90 和 C99 功能,以及来自 Single Unix 的功能
规范和一些 BSD 和 GNU 扩展。 其他库实现可能不会
支持所有这些功能; GCC 不支持对超出的功能发出警告
特定库的限制。 然而,如果 -W迂腐 用于 -格式,
给出关于不在所选标准版本中的格式功能的警告(但不是
对于“strfmon”格式,因为它们不在 C 标准的任何版本中)。
-W格式=1
-格式
附加选项 -格式 相当于 -W格式=1及 -Wno-格式 相当于
-W格式=0。 自 -格式 还检查几个空格式参数
功能, -格式 也暗示 -W非空. 此级别格式的某些方面
可以通过以下选项禁用检查: -Wno-格式包含-nul,
-Wno-格式-额外参数及 -Wno 格式零长度. -格式 由
-墙.
-Wno-格式包含-nul
If -格式 指定,不警告包含 NUL 字节的格式字符串。
-Wno-格式-额外参数
If -格式 指定,不要警告“printf”或
“scanf”格式函数。 C 标准规定这些参数是
忽略了。
其中未使用的参数位于指定的已使用参数之间 $
操作数编号规范,通常仍会给出警告,因为
实现不知道什么类型传递给“va_arg”以跳过未使用的
论据。 但是,在“scanf”格式的情况下,此选项会抑制
如果未使用的参数都是指针,则警告,因为 Single Unix
规范说允许这种未使用的参数。
-Wno 格式零长度
If -格式 指定,不警告零长度格式。 C标准
指定允许零长度格式。
-W格式=2
启用 -格式 加上额外的格式检查。 目前相当于 -格式
-Wformat-非文字 -Wformat-安全 -W格式-y2k.
-Wformat-非文字
If -格式 指定,如果格式字符串不是字符串文字,也会发出警告
因此无法检查,除非格式函数将其格式参数作为
一个“va_list”。
-Wformat-安全
If -格式 指定,还警告使用格式函数表示
可能的安全问题。 目前,这会警告调用“printf”和
"scanf" 函数,其中格式字符串不是字符串文字并且没有
格式参数,如“printf (foo);”。 这可能是一个安全漏洞,如果
格式字符串来自不受信任的输入并包含 %n. (这是目前一个
什么的子集 -Wformat-非文字 警告,但在未来的警告可能
添加到 -Wformat-安全 不包括在 -Wformat-非文字.)
注意:在 Ubuntu 8.10 及更高版本中,默认情况下为 C 启用此选项,
C++、ObjC、ObjC++。 要禁用,请使用 -Wno-格式-安全, 或禁用所有格式
警告与 -W格式=0. 要使格式安全警告致命,请指定
-Werror=格式安全.
-W格式-y2k
If -格式 指定,还警告“strftime”格式可能只产生一个
两位数的年份。
-W非空
警告为标记为需要非空值的参数传递空指针
通过“非空”函数属性。
-W非空 包含在 -墙 和 -格式. 它可以被禁用 -Wno-非空
选项。
-Winit-自我 (仅限 C、C++、Objective-C 和 Objective-C++)
警告使用自身初始化的未初始化变量。 注意这个
选项只能与 -Wun初始化 选项。
例如,GCC 仅在以下代码段中警告“i”未初始化
,尤其是 -Winit-自我 已指定:
整数 f()
{
诠释我=我;
返回我
}
此警告由启用 -墙 在 C++ 中。
-Wimplicit-int (仅限 C 和 Objective-C)
当声明未指定类型时发出警告。 此警告由启用 -墙.
-Wimplicit 函数声明 (仅限 C 和 Objective-C)
在声明之前使用函数时发出警告。 在 C99 模式下
(-std=c99 or -std=gnu99),默认情况下启用此警告并将其制作为
错误由 -迂腐的错误. 此警告也由 -墙.
- 隐含的 (仅限 C 和 Objective-C)
与...一样 -Wimplicit-int 和 -Wimplicit 函数声明. 此警告已启用
by -墙.
-Wignored 预选赛 (仅限 C 和 C++)
警告函数的返回类型是否具有类型限定符,例如“const”。 对于 ISO C
这样的类型限定符没有效果,因为函数返回的值不是
左值。 对于 C++,警告仅针对标量类型或“void”发出。 国际标准化组织
禁止在函数定义中使用限定的“void”返回类型,因此此类返回类型
即使没有此选项,也始终会收到警告。
此警告也由 -维克斯特拉.
-Wmain
警告如果类型 主 是可疑的。 主 应该是一个带有外部的函数
链接,返回 int,采用零参数、两个或三个参数
适当的类型。 此警告在 C++ 中默认启用,并由以下任一方式启用
-墙 or -W迂腐.
-Wmissing-大括号
如果聚合或联合初始值设定项未完全括起来,则发出警告。 在下面的
例如,初始化器 a 没有完全括起来,但对于 b 完全
括起来。 此警告由启用 -墙 在 C。
int a[2][2] = { 0, 1, 2, 3 };
int b[2][2] = { { 0, 1 }, { 2, 3 } };
此警告由启用 -墙.
-Wmissing-include-dirs 缺少包含目录 (仅限 C、C++、Objective-C 和 Objective-C++)
如果用户提供的包含目录不存在,则发出警告。
- 括号
在某些上下文中省略括号时发出警告,例如当有一个
在需要真值或嵌套运算符的上下文中赋值
人们经常混淆谁的优先级。
如果比较像 x<=y<=z 出现; 这相当于 (x<=y ? 1 : 0)
<= z,这是不同于普通数学符号的解释。
还警告有关可能与哪个“if”语句混淆的结构
“其他”分支属于。 下面是这种情况的一个例子:
{
如果一个)
如果 (b)
富();
其他
酒吧 ();
}
在 C/C++ 中,每个“else”分支都属于最里面可能的“if”语句,即
在这个例子中是“如果(b)”。 这通常不是程序员所期望的,因为
在上面的示例中通过程序员选择的缩进进行了说明。 当有
由于这种混淆的可能性,当指定此标志时,GCC 会发出警告。
要消除警告,请在最里面的“if”语句周围添加显式大括号,以便
“else”不可能属于封闭的“if”。 结果代码看起来
喜欢这个:
{
如果一个)
{
如果 (b)
富();
其他
酒吧 ();
}
}
还警告将 GNU 扩展名危险地用于“?:”并省略中间操作数。
当“?”中的条件为布尔表达式时,省略的值为
总是 1. 通常程序员期望它是在条件语句中计算的值
表达代替。
此警告由启用 -墙.
-W序列点
警告由于违反序列而可能具有未定义语义的代码
C 和 C++ 标准中的点规则。
C 和 C++ 标准定义了 C/C++ 程序中表达式的顺序
从以下方面评估 序列 点, 表示之间的偏序
程序部分的执行:那些在序列点之前执行的,以及那些
在它之后执行。 这些发生在对完整表达式(一个
不是更大表达式的一部分),在对 a 的第一个操作数求值之后
“&&”、“||”、“? :”或“,”(逗号)运算符,在调用函数之前(但在函数调用之后)
评估其参数和表示被调用函数的表达式),以及
某些其他地方。 除了如序列点规则所表达的那样,顺序
未指定表达式的子表达式的评估。 所有这些规则
仅描述偏序而不是全序,因为例如,如果两个
函数在一个表达式中被调用,它们之间没有序列点,
未指定调用函数的顺序。 然而,标准
委员会裁定函数调用不重叠。
未指定在序列点之间修改值的时间
对象生效。 行为依赖于此的程序具有未定义的行为;
C 和 C++ 标准指定“在上一个和下一个序列之间指向一个
对象应通过评估一个对象最多修改一次其存储的值
表达。 此外,应只读先验值以确定要
被存储。”。如果程序违反这些规则,任何特定的结果
执行完全不可预测。
具有未定义行为的代码示例有“a = a++;”、“a[n] = b[n++]”和“a[i++] =
i;"。一些更复杂的情况不能通过这个选项诊断,它可能会给出一个
偶尔会出现假阳性结果,但总的来说它在以下情况下相当有效
在程序中检测此类问题。
该标准的措辞令人困惑,因此对于准确的标准存在一些争论
序列点规则在微妙情况下的意义。 讨论的链接
问题,包括提议的正式定义,可以在 GCC 阅读页面上找到,
在http://gcc.gnu.org/readings.html>.
此警告由启用 -墙 对于 C 和 C++。
-Wno-返回本地地址
不要警告返回一个指针(或在 C++ 中,一个引用)到一个变量
函数返回后超出范围。
-Wreturn 类型
每当使用默认为“int”的返回类型定义函数时发出警告。 还
警告任何在返回类型的函数中没有返回值的“返回”语句
不是“void”(从函数体的末尾掉下来被认为是返回
没有值),以及关于函数中带有表达式的“return”语句
其返回类型为“void”。
对于 C++,没有返回类型的函数总是会产生诊断消息,即使
,尤其是 -W无返回类型 被指定。 唯一的例外是 主 和功能
在系统头文件中定义。
此警告由启用 -墙.
-W开关
每当“switch”语句具有枚举类型的索引并且缺少“case”时发出警告
对于该枚举的一个或多个命名代码。 (存在“默认”
label 防止出现此警告。)枚举范围之外的“case”标签也
使用此选项时会引发警告(即使有“默认”标签)。 这个
警告由 -墙.
-Wswitch-默认值
每当“switch”语句没有“默认”情况时发出警告。
-Wswitch枚举
每当“switch”语句具有枚举类型的索引并且缺少“case”时发出警告
对于该枚举的一个或多个命名代码。 外的“case”标签
使用此选项时,枚举范围也会引发警告。 唯一的区别
之间 -W开关 这个选项是这个选项给出一个关于省略的警告
即使有“默认”标签,枚举代码也是如此。
-Wsync-nand (仅限 C 和 C++)
当“__sync_fetch_and_nand”和“__sync_nand_and_fetch”内置函数被调用时发出警告
用过的。 这些函数在 GCC 4.4 中改变了语义。
-字形
如果遇到任何可能改变程序含义的三合字母,则发出警告
(评论中的三合字母不会被警告)。 此警告由启用 -墙.
-未使用但设置参数
每当函数参数分配给但未使用时发出警告(除了
其声明)。
要抑制此警告,请使用 未使用 属性。
此警告也由 -未使用 连同 -维克斯特拉.
-未使用但设置变量
每当分配给局部变量时发出警告,否则未使用(除了它的
宣言)。 此警告由启用 -墙.
要抑制此警告,请使用 未使用 属性。
此警告也由 -未使用,这是由 -墙.
-未使用的功能
每当声明静态函数但未定义或非内联静态函数时发出警告
功能未使用。 此警告由启用 -墙.
-Wunused-标签
每当声明标签但未使用时发出警告。 此警告由启用 -墙.
要抑制此警告,请使用 未使用 属性。
-Wunused-local-typedefs (仅限 C、Objective-C、C++ 和 Objective-C++)
未使用在函数中本地定义的 typedef 时发出警告。 这个警告是
启用 -墙.
-Wunused-参数
每当函数参数除了声明之外未使用时发出警告。
要抑制此警告,请使用 未使用 属性。
-Wno-未使用的结果
如果标有“warn_unused_result”属性的函数的调用者执行此操作,则不发出警告
不使用它的返回值。 默认是 -Wunused-结果.
-Wunused-变量
每当局部变量或非常量静态变量未使用时发出警告
其声明。 此警告由启用 -墙.
要抑制此警告,请使用 未使用 属性。
-未使用值
每当语句计算明确未使用的结果时发出警告。 压制
此警告将未使用的表达式转换为 无效. 这包括一个表达式语句
或不含副作用的逗号表达式的左侧。 为了
例如,一个表达式,如 x[i,j] 引起警告,而 x[(无效)i,j] 才不是。
此警告由启用 -墙.
-未使用
以上全部 -未使用 选项组合。
为了获得有关未使用的函数参数的警告,您必须指定
-维克斯特拉 -未使用 (注意 -墙 暗示 -未使用),或单独指定
-Wunused-参数.
-Wun初始化
警告如果一个自动变量在没有首先被初始化的情况下被使用,或者一个变量
可能会被“setjmp”调用破坏。 在 C++ 中,如果非静态引用或非静态引用发出警告
静止 常量 成员出现在没有构造函数的类中。
如果您想警告使用变量未初始化值的代码
它自己的初始化程序,使用 -Winit-自我 选项。
这些警告发生在单个未初始化或损坏的结构元素上,
联合或数组变量以及未初始化或破坏的变量
作为一个整体。 对于声明为“volatile”的变量或元素,它们不会发生。 因为
这些警告取决于优化、精确的变量或元素
警告取决于精确的优化选项和使用的 GCC 版本。
请注意,可能没有关于仅用于计算一个变量的警告
本身从未使用过的值,因为这样的计算可能会被数据流删除
在打印警告之前进行分析。
-W 可能未初始化
对于自动变量,如果存在从函数入口到使用
已初始化的变量,但存在其他一些路径
变量未初始化,编译器如果无法证明
未初始化的路径不会在运行时执行。 这些警告是可选的
因为 GCC 不够聪明,无法看到代码可能正确的所有原因
尽管看起来有错误。 这是如何发生的一个示例:
{
int x;
开关 (y)
{
情况 1:x = 1;
打破;
情况 2:x = 4;
打破;
情况 3:x = 5;
}
富 (x);
}
如果“y”的值总是1、2或3,那么“x”总是被初始化,但是GCC
不知道这个。 要取消警告,您需要提供一个默认情况
断言(0) 或类似的代码。
此选项还会在非易失性自动变量可能被更改时发出警告
调用“longjmp”。 这些警告也只有在优化时才有可能
汇编。
编译器只看到对“setjmp”的调用。 它不知道“longjmp”会在哪里
叫; 事实上,信号处理程序可以在代码中的任何位置调用它。 作为一个
结果,即使实际上没有问题,您也可能会收到警告,因为“longjmp”
实际上不能在会导致问题的地方调用。
如果你声明你使用的所有函数,就可以避免一些虚假的警告
永远不会返回为“noreturn”。
此警告由启用 -墙 or -维克斯特拉.
-未知编译指示
当遇到 GCC 不理解的“#pragma”指令时发出警告。 如果这
使用命令行选项,甚至对系统中未知的编译指示发出警告
头文件。 如果警告仅由 -墙
命令行选项。
-Wno-pragmas
不要警告错误使用编译指示,例如不正确的参数、无效的语法或
pragma 之间的冲突。 也可以看看 -未知编译指示.
-Wstrict-别名
此选项仅在以下情况下有效 -fstrict-别名 活跃。 它警告代码
可能会破坏编译器用于优化的严格别名规则。
警告不会捕获所有情况,但会尝试捕获更常见的情况
陷阱。 它包含在 -墙。 相当于 -Wstrict-别名=3
-Wstrict-别名=n
此选项仅在以下情况下有效 -fstrict-别名 活跃。 它警告代码
可能会破坏编译器用于优化的严格别名规则。
更高的级别对应更高的准确度(更少的误报)。 更高级别
也对应更多的努力,类似的方式 -O 作品。 -Wstrict-别名 is
相当于 -Wstrict-别名=3.
1 级:最具攻击性、快速、最不准确。 在更高级别时可能有用
不警告但 -fstrict-别名 仍然会破坏代码,因为它几乎没有错误
底片。 然而,它有很多误报。 对所有指针转换发出警告
在可能不兼容的类型之间,即使从未取消引用。 跑在前面
只结束。
2 级:积极、快速、不太精确。 可能仍然有很多误报(不是
尽管多达 1 级),并且几乎没有假阴性(但可能超过 1 级)。
与级别 1 不同,它仅在获取地址时发出警告。 警告不完整的类型。
仅在前端运行。
级别 3(默认为 -Wstrict-别名): 应该有很少的误报和很少
假阴性。 启用优化时,比级别 1 或 2 稍慢。
处理前端常见的双关语+取消引用模式:
“*(int*)&some_float”。 如果启用了优化,它也会在后端运行,其中
它使用对流敏感的指向信息处理多个语句情况。
仅在转换后的指针被取消引用时发出警告。 不警告不完整
类型。
-Wstrict-溢出
-Wstrict-溢出=n
此选项仅在以下情况下有效 -fstrict-溢出 活跃。 它警告案件
编译器基于有符号溢出不会进行优化的假设
发生。 请注意,它不会对代码可能溢出的所有情况发出警告:它
仅警告编译器实现某些优化的情况。 因此这
警告取决于优化级别。
假设不发生有符号溢出的优化是完全安全的,如果
所涉及的变量的值是这样的,溢出永远不会,事实上,
发生。 因此,此警告很容易产生误报:关于代码的警告
这实际上不是问题。 为了帮助关注重要问题,一些警告
水平被定义。 使用未定义的有符号溢出不会发出警告
在估计循环需要多少次迭代时,特别是在确定
是否会执行循环。
-Wstrict-溢出=1
对有问题且容易避免的情况发出警告。 例如,与
-fstrict-溢出,编译器将“x + 1 > x”简化为1。这个级别的
-Wstrict-溢出 由 -墙; 更高的水平不是,而且必须是
明确要求。
-Wstrict-溢出=2
还警告其他将比较简化为常量的情况。 为了
例如:“abs (x) >= 0”。 这只能在以下情况下简化 -fstrict-溢出 在
效果,因为“abs (INT_MIN)”溢出到小于零的“INT_MIN”。
-Wstrict-溢出 (没有级别)是一样的 -Wstrict-溢出=2.
-Wstrict-溢出=3
还要警告其他简化比较的情况。 例如:“x + 1
> 1" 简化为 "x > 0"。
-Wstrict-溢出=4
还警告上述情况未涵盖的其他简化。 为了
例如:“(x * 10) / 5”被简化为“x * 2”。
-Wstrict-溢出=5
还要警告编译器减小常量大小的情况
参与比较。 例如:“x + 2 > y”简化为“x + 1 >= y”。
这仅在最高警告级别报告,因为这种简化
适用于许多比较,所以这个警告级别给出了非常多的
误报。
-Wsuggest-属性=[纯|常量|不归路|格式]
警告添加属性可能有益的情况。 目前的属性
支持的列表如下。
-Wsuggest-属性=纯
-Wsuggest-属性=常量
-Wsuggest-属性=noreturn
警告可能是属性“pure”、“const”或
“不归路”。 编译器只对在其他编译中可见的函数发出警告
单位或(在“pure”和“const”的情况下)如果它不能证明函数
正常返回。 如果函数不包含无穷大,则函数正常返回
通过抛出、调用“abort()”或捕获来循环或异常返回。 这个
分析需要选项 -fipa-纯常量, 默认情况下启用 -O 和
更高。 更高的优化级别可提高分析的准确性。
-Wsuggest-属性=格式
-Wmissing 格式属性
警告可能是“格式”属性候选的函数指针。
请注意,这些只是可能的候选者,而不是绝对的候选者。 GCC 猜测
具有用于赋值的“格式”属性的函数指针,
初始化、参数传递或返回语句应有相应的
结果类型中的“格式”属性。 即左侧的
赋值或初始化,参数变量的类型,或返回
包含函数的类型分别也应该有一个“格式”属性
以避免警告。
GCC 还警告可能是“格式”候选的函数定义
属性。 同样,这些只是可能的候选人。 GCC 猜测“格式”
属性可能适用于任何调用类似函数的函数
“vprintf”或“vscanf”,但情况可能并非总是如此,某些功能
可能无法检测到哪些“格式”属性适合。
-数组边界
此选项仅在以下情况下有效 -ftree-vrp 处于活动状态(默认为 -氧气 以上)。 它
警告总是越界的数组的下标。 这个警告是
启用 -墙.
-Wno-除以零
不要警告编译时整数被零除。 浮点除法
零不会被警告,因为它可以是获得无穷大和的合法方式
NaN。
-W系统标头
为在系统头文件中找到的构造打印警告消息。 警告来自
系统标头通常被抑制,假设它们通常不会
指示真正的问题,只会使编译器输出更难阅读。 使用
这个命令行选项告诉 GCC 从系统头文件中发出警告,就好像它们
发生在用户代码中。 但是,请注意,使用 -墙 与此选项结合使用
不 而不去 警告系统标头中的未知编译指示---为此, -未知编译指示
也必须使用。
-蹦床
警告为指向嵌套函数的指针生成的蹦床。
蹦床是在运行时创建的一小段数据或代码
获取嵌套函数地址时在堆栈上的时间,以及
用于间接调用嵌套函数。 对于某些目标,它
仅由数据组成,因此不需要特殊处理。 但,
对于大多数目标,它由代码组成,因此需要堆栈
使其可执行,以便程序正常运行。
-Wfloat-等于
如果在相等比较中使用浮点值,则发出警告。
这背后的想法是有时(对于程序员)很方便
将浮点值视为无限精确实数的近似值。
如果你这样做,那么你需要计算(通过分析代码,或在某些
其他方式)计算引入的最大或可能的最大误差,以及
在执行比较时允许它(以及在产生输出时,但这是一个
不同的问题)。 尤其是,与其测试相等性,不如检查
查看两个值是否有重叠的范围; 这是通过
关系运算符,所以相等比较可能是错误的。
-传统的 (仅限 C 和 Objective-C)
警告某些在传统和 ISO C 中表现不同的结构。另外
警告没有传统 C 等效项的 ISO C 构造和/或有问题的
应该避免的构造。
· 出现在宏体中字符串文字中的宏参数。 在
传统的 C 宏替换发生在字符串文字中,但在 ISO C 中
它不是。
· 在传统的 C 中,一些预处理器指令不存在。 传统的
预处理器只认为一行是指令,如果 # 出现在列
1个就行了。 所以 -传统的 警告有关传统 C 的指令
理解但忽略,因为 # 不作为第一个字符出现
线。 它还建议您隐藏指令,如 #pragma 不被理解
通过缩进来传统的 C。 一些传统的实现没有
承认 #elif,所以这个选项建议完全避免它。
· 一个类似函数的宏,不带参数出现。
· 一元加运算符。
· U 整数常量后缀,或 F or L 浮点常量后缀。
(传统 C 确实支持 L 整数常量的后缀。)注意,这些
后缀出现在大多数现代系统的系统头文件中定义的宏中,
例如 _分钟/_最大限度 宏在“ "。在用户代码中使用这些宏可能
通常会导致虚假警告,但是 GCC 的集成预处理器具有
足够的上下文以避免在这些情况下发出警告。
· 在一个块中声明为外部的函数,然后在程序结束后使用
块。
· “switch”语句有一个“long”类型的操作数。
· 非“静态”函数声明跟随在“静态”函数声明之后。 这个构造不是
被一些传统的 C 编译器接受。
· 整数常量的 ISO 类型与其具有不同的宽度或符号
传统类型。 仅当常量的基数为 XNUMX 时才会发出此警告。
即通常表示位模式的十六进制或八进制值不是
警告。
· 检测到 ISO 字符串连接的使用。
· 自动聚合的初始化。
· 标识符与标签冲突。 传统 C 缺少单独的命名空间
标签。
· 工会的初始化。 如果初始值设定项为零,则忽略警告。
这是在用户代码中出现零初始值设定项的假设下完成的
以例如“__STDC__”为条件以避免丢失初始化程序警告并依赖于
在传统 C 的情况下,默认初始化为零。
· 通过原型在定点/浮点值之间进行转换,反之亦然。 这
使用传统 C 编译时缺少这些原型会导致严重的
问题。 这是可能的转换警告的一个子集; 全套
使用 -Wtraditional 转换.
· 使用 ISO C 风格的函数定义。 这个警告是故意的 而不去 发行
用于原型声明或可变参数函数,因为这些 ISO C 特性
使用 libiberty 的传统 C 兼容性宏时出现在您的代码中,
“参数”和“VPARAMS”。 嵌套函数也会绕过此警告
因为该功能已经是 GCC 扩展,因此与
传统的 C 兼容性。
-Wtraditional 转换 (仅限 C 和 Objective-C)
如果原型导致的类型转换与将发生的情况不同,则发出警告
在没有原型的情况下,同样的论点。 这包括转换
定点到浮动,反之亦然,以及改变宽度或
定点参数的符号性,除非与默认提升相同。
-W声明后声明 (仅限 C 和 Objective-C)
在块中的语句之后发现声明时发出警告。 这种构造,已知
来自 C++,随 ISO C99 引入,默认情况下在 GCC 中允许。 它不是
ISO C90 支持,GCC 3.0 之前的 GCC 版本不支持。
-文德夫
如果在一个未定义的标识符中求值,则发出警告 #如果 指令。
-Wno-endif-标签
不要警告任何时候 的#else 或 #ENDIF 后面跟着文字。
-W阴影
每当局部变量或类型声明遮蔽另一个变量时发出警告,
参数、类型或类成员(在 C++ 中),或任何内置函数
阴影。 请注意,在 C++ 中,编译器会在局部变量隐藏显式变量时发出警告
typedef,但如果它隐藏结构/类/枚举则不会。
-W大于=LEN
当物体大于 LEN 字节被定义。
-Wframe-大于=LEN
如果函数框架的大小大于 LEN 字节。 计算完成
确定堆栈帧大小是近似的而不是保守的。 实际上
要求可能比 LEN 即使您没有收到警告。 在
此外,通过“alloca”、可变长度数组或相关的任何空间分配
在确定是否发出 a 时,编译器不包括构造
警告。
-Wno-free-nonheap-object
尝试释放未在堆上分配的对象时不要警告。
-Wstack 用法=LEN
如果函数的堆栈使用量可能大于 LEN 字节。 计算
确定堆栈使用情况是保守的。 通过“alloca”分配的任何空间,
变长数组或相关结构被编译器包含在
决定是否发出警告。
该消息与输出一致 -fstack-使用.
· 如果堆栈使用完全静态但超过指定数量,则为:
警告:堆栈使用量为 1120 字节
· 如果堆栈使用(部分)是动态的但有界,则为:
警告:堆栈使用可能是 1648 字节
· 如果堆栈使用(部分)是动态的且不受限制,则为:
警告:堆栈使用可能是无限的
-Wunsafe 循环优化
如果由于编译器无法假设任何内容而无法优化循环,则发出警告
循环索引的边界。 和 -funsafe 循环优化 如果编译器发出警告
做出这样的假设。
-Wno-pedantic-ms 格式 (仅限 MinGW 目标)
结合使用时 -格式 和 -迂腐 没有 GNU 扩展,这个
选项禁用有关非 ISO“printf”/“scanf”格式宽度说明符的警告
Windows 目标上使用的“I32”、“I64”和“I”取决于 MS 运行时。
-W指针算法
警告任何依赖于函数类型或“void”的“大小”的东西。 GNU C
为这些类型分配大小为 1,以方便使用“void *”进行计算
指针和函数指针。 在 C++ 中,当算术运算时也发出警告
涉及“NULL”。 此警告也由 -W迂腐.
-Wtype-限制
由于比较的范围有限,如果比较始终为真或始终为假,则发出警告
数据类型,但不对常量表达式发出警告。 例如,警告如果未签名
变量与零比较 < or >=. 此警告也由
-维克斯特拉.
-Wbad-函数转换 (仅限 C 和 Objective-C)
每当函数调用转换为不匹配的类型时发出警告。 例如,警告如果
“int malloc()”被转换为“anything *”。
-Wc++-兼容 (仅限 C 和 Objective-C)
对 ISO C 和 ISO 公共子集之外的 ISO C 结构发出警告
C++,例如请求从“void *”隐式转换为指向非“void”的指针
类型。
-Wc++11-兼容 (仅限 C++ 和 Objective-C++)
警告 C++ 结构的含义在 ISO C++ 1998 和 ISO C++ 2011 之间不同,
例如,ISO C++ 1998 中的标识符是 ISO C++ 2011 中的关键字。此警告
打开 -收窄 并由 -墙.
-Wcast 质量
每当指针被强制转换以从目标类型中删除类型限定符时发出警告。
例如,如果将“const char *”转换为普通的“char *”,则发出警告。
在进行以不安全方式引入类型限定符的强制转换时也要发出警告。 为了
例如,将“char **”转换为“const char **”是不安全的,如下例所示:
/* p 是字符 ** 值。 */
常量字符 **q = (常量字符 **) p;
/* 将只读字符串分配给 const char * 是可以的。 */
*q = "字符串";
/* 现在 char** 指针指向只读内存。 */
**p = 'b';
-Wcast-对齐
每当指针被强制转换为目标所需的对齐方式时发出警告
增加。 例如,警告如果在机器上将“char *”强制转换为“int *”
整数只能在两字节或四字节边界处访问。
-Wwrite-字符串
编译 C 时,给字符串常量指定类型“const char[长度]” 所以复制
将 XNUMX 的地址转换为非“const”“char *”指针会产生警告。 这些
警告帮助您在编译时找到可以尝试写入字符串的代码
常量,但前提是您在声明中非常小心地使用“const”
和原型。 否则,它只是一个滋扰。 这就是为什么我们没有制作 -墙
请求这些警告。
编译 C++ 时,警告不推荐使用的从字符串文字到“char”的转换
*”。默认情况下,C++ 程序会启用此警告。
- 打砸了
警告可能被改变的变量 长jmp or 叉子. 这个警告也是
启用 -维克斯特拉.
-W转换
警告可能会改变值的隐式转换。 这包括转换
介于实数和整数之间,例如“abs (x)”,当“x”为“double”时; 之间的转换
有符号和无符号,如“unsigned ui = -1”; 并转换为较小的类型,例如
“sqrtf(M_PI)”。 不要警告像“abs ((int) x)”和“ui =
(无符号)-1”,或者如果值没有像“abs (2.0)”那样被转换改变。
可以通过以下方式禁用有关有符号和无符号整数之间转换的警告
运用 -W无符号转换.
对于 C++,还警告混淆用户定义转换的重载解析; 和
从不使用类型转换运算符的转换:转换为“void”,相同
类型、基类或对它们的引用。 关于签名之间转换的警告
和无符号整数在 C++ 中默认禁用,除非 -Wsign-转换 is
明确启用。
-Wno-转换-null (仅限 C++ 和 Objective-C++)
不要警告“NULL”和非指针类型之间的转换。 -Wconversion-null is
默认启用。
-Wzero 作为空指针常量 (仅限 C++ 和 Objective-C++)
当文字“0”用作空指针常量时发出警告。 这对
促进在 C++11 中转换为“nullptr”。
-无用演员 (仅限 C++ 和 Objective-C++)
当表达式被强制转换为它自己的类型时发出警告。
-空体
警告如果一个空的身体出现在 if, 其他 or do 而 陈述。 这个警告是
也启用 -维克斯特拉.
-Wenum-比较
警告不同枚举类型的值之间的比较。 在 C++ 枚举中
条件表达式中的不匹配也会被诊断出来,并通过以下方式启用警告
默认。 在 C 中,此警告由 -墙.
-Wjump-未命中-init (C,仅限Objective-C)
如果“goto”语句或“switch”语句跳过
变量的初始化,或在变量被初始化后向后跳转到一个标签
初始化。 这只会警告在初始化时初始化的变量
宣布。 此警告仅支持 C 和 Objective-C; 在 C++ 中
分支在任何情况下都是错误的。
-Wjump-未命中-init 包含在 -Wc++-兼容. 它可以被禁用
-Wno-jump-misses-init 选项。
-Wsign-比较
当有符号和无符号值之间的比较可能产生错误时发出警告
有符号值转换为无符号值时的结果。 此警告也已启用
by -维克斯特拉; 获得其他警告 -维克斯特拉 没有这个警告,使用 -维克斯特拉
-无符号比较.
-Wsign-转换
警告可能会更改整数值符号的隐式转换,例如
将有符号整数表达式分配给无符号整数变量。 一个明确的
cast 使警告静音。 在 C 中,此选项也由 -W转换.
-Wsizeof-指针内存访问
警告某些字符串和内存内置函数的可疑长度参数
如果参数使用“sizeof”。 此警告警告例如“memset (ptr, 0, sizeof
(ptr));" 如果 "ptr" 不是一个数组,而是一个指针,并建议一个可能的修复方法,或者
关于“memcpy (&foo, ptr, sizeof (&foo));”。 此警告由启用 -墙.
-地址
警告内存地址的可疑使用。 这些包括使用地址
条件表达式中的函数,例如“void func(void); if (func)”,以及
与字符串文字的内存地址进行比较,例如“if (x == "abc")”。
这种用法通常表示程序员错误:函数的地址总是
评估为真,因此它们在条件中的使用通常表明程序员
忘记了函数调用中的括号; 以及与字符串文字的比较
导致未指定的行为并且在 C 中不可移植,因此它们通常表示
程序员打算使用“strcmp”。 此警告由启用 -墙.
-W逻辑运算
警告表达式中逻辑运算符的可疑使用。 这包括使用
在可能需要按位运算符的上下文中的逻辑运算符。
-Waggregate-返回
如果定义或调用了任何返回结构或联合的函数,则发出警告。 (在
可以返回数组的语言,这也会引发警告。)
-Wno-aggressive-loop-optimizations
如果在具有恒定迭代次数的循环中编译器检测到未定义,则发出警告
在一次或多次迭代期间某些语句中的行为。
-Wno-属性
如果使用了意外的“__attribute__”,例如无法识别的属性,请不要发出警告,
应用于变量等的函数属性。这不会停止错误
不正确使用受支持的属性。
-Wno-内置宏重新定义
如果某些内置宏被重新定义,请不要发出警告。 这将抑制警告
重新定义“__TIMESTAMP__”、“__TIME__”、“__DATE__”、“__FILE__”和
“__BASE_FILE__”。
-Wstrict-原型 (仅限 C 和 Objective-C)
如果在未指定参数类型的情况下声明或定义函数,则发出警告。 (一个
如果前面有一个老式函数定义,则无需警告
指定参数类型的声明。)
-Wold 风格声明 (仅限 C 和 Objective-C)
根据 C 标准,在声明中警告过时的用法。 为了
例如,警告像“静态”这样的存储类说明符是否不是一个
宣言。 此警告也由 -维克斯特拉.
-Wold-style-定义 (仅限 C 和 Objective-C)
如果使用旧式函数定义,则发出警告。 即使有警告也会发出
以前的原型。
-Wmissing-参数类型 (仅限 C 和 Objective-C)
在 K&R 风格的函数中,函数参数声明时没有类型说明符:
无效富(酒吧){}
此警告也由 -维克斯特拉.
-Wmissing 原型 (仅限 C 和 Objective-C)
如果在没有先前原型声明的情况下定义全局函数,则发出警告。 这个
即使定义本身提供了原型,也会发出警告。 使用这个选项
检测没有匹配原型声明的全局函数
头文件。 此选项对 C++ 无效,因为所有函数声明
提供原型和不匹配的声明将声明重载而不是
与先前的声明冲突。 用 -Wmissing-声明 检测丢失
C++ 中的声明。
-Wmissing-声明
如果在没有先前声明的情况下定义了全局函数,则发出警告。 即使这样做
定义本身提供了一个原型。 使用此选项来检测全局
未在头文件中声明的函数。 在 C 中,不发出警告
具有先前非原型声明的函数; 用 -Wmissing-原型 检测
缺少原型。 在 C++ 中,不会为函数模板发出警告,或者对于
内联函数,或匿名命名空间中的函数。
-Wmissing-field-initializers 缺少字段初始化器
如果结构的初始值设定项缺少某些字段,则发出警告。 例如,以下
代码会导致这样的警告,因为“xh”隐式为零:
结构 s { int f, g, h; };
结构 sx = { 3, 4 };
此选项不会警告指定的初始化程序,因此以下修改
不会触发警告:
结构 s { int f, g, h; };
结构 sx = { .f = 3, .g = 4 };
此警告包含在 -维克斯特拉. 获得其他 -维克斯特拉 没有这个警告,
使用 -维克斯特拉 -Wno-missing-field-initializers.
-Wno-多字符
如果多字符常量 ('FOOF') 用来。 通常他们表示一个
用户代码中的拼写错误,因为它们具有实现定义的值,不应
用于可移植代码。
-W标准化=
在 ISO C 和 ISO C++ 中,如果两个标识符是不同的序列,则它们是不同的
人物。 但是,有时当字符超出基本 ASCII 字符集时
使用时,您可以有两个看起来相同的不同字符序列。 避免
混淆,ISO 10646 标准规定了一些 归 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。 应用时
确保两个看起来相同的序列变成相同的序列。 海湾合作委员会
如果您使用未规范化的标识符,可以警告您; 这个选项
控制该警告。
GCC 支持四个级别的警告。 默认是 -W标准化=nfc,
它警告任何不符合 ISO 10646“C”规范化形式的标识符,
NFC支付. NFC 是大多数用途的推荐形式。
不幸的是,ISO C 和 ISO C++ 允许在标识符中使用一些字符
当变成 NFC 时,不允许出现在标识符中。 也就是说,没有办法
在便携式 ISO C 或 C++ 中使用这些符号,并在 NFC 中包含所有标识符。
-W标准化=id 抑制这些字符的警告。 希望未来
所涉及的标准版本将纠正这一点,这就是为什么这个选项不是
默认值。
您可以通过写入关闭所有字符的警告 -W标准化=无。 您
仅当您使用其他标准化方案(如“D”)时才应这样做,
因为否则你可以很容易地创建几乎不可能看到的错误。
ISO 10646 中的某些字符具有不同的含义,但在某些字体中看起来相同
或显示方法,尤其是在应用格式后。 例如
"\u207F", "SUPERSCRIPT LATIN SMALL LETTER N", 显示就像一个普通的 "n"
已放置在上标中。 ISO 10646 定义了 NFKC 归一化方案
也将所有这些转换为标准形式,如果您的代码不在,GCC 会发出警告
NFKC 如果你使用 -W标准化=nfkc. 这个警告相当于警告每个
包含字母 O 的标识符,因为它可能与数字 0 混淆,
所以不是默认值,但如果
无法固定编程环境以清楚地显示这些字符。
-Wno-弃用
不要警告使用已弃用的功能。
-Wno-deprecated-声明
不要警告使用标记为已弃用的函数、变量和类型
使用“已弃用”属性。
-Wno-溢出
不要警告常量表达式中的编译时溢出。
-Woverride-初始化 (仅限 C 和 Objective-C)
使用指定的时,如果没有副作用的初始化字段被覆盖,则发出警告
初始化程序。
此警告包含在 -维克斯特拉. 获得其他 -维克斯特拉 没有这个警告,
使用 -维克斯特拉 -Wno-覆盖-init.
-打包
如果结构被赋予了packed 属性,但packed 属性没有,则发出警告
对结构的布局或大小的影响。 此类结构可能未对齐
好处不大。 例如,在这段代码中,“struct bar”中的变量“fx”是
即使“struct bar”本身没有packed属性,也未对齐:
结构 foo {
int x;
字符 a, b, c, d;
} __attribute __((packed));
结构栏{
字符 z;
结构 foo f;
};
-Wpacked-bitfield-compat
GCC 的 4.1、4.2 和 4.3 系列忽略了类型位域上的“packed”属性
“字符”。 这已在 GCC 4.4 中修复,但更改可能导致
结构布局。 当 GCC 中此类字段的偏移量发生变化时,GCC 会通知您
4.4. 例如,在此字段“a”和“b”之间不再有 4 位填充
结构体:
结构体
{
字符 a:4;
字符 b:8;
} __attribute__ ((打包));
默认情况下启用此警告。 用 -Wno-packed-bitfield-compat 禁用此功能
警告。
-Wpadd
警告填充是否包含在结构中,以对齐
结构或对齐整个结构。 有时当这种情况发生时是可能的
重新排列结构的字段以减少填充,从而使
结构更小。
-冗余声明
如果在同一范围内多次声明任何内容,即使在以下情况下也发出警告
多重声明有效并且没有任何改变。
-Wnested-externs (仅限 C 和 Objective-C)
如果在函数中遇到“extern”声明,则发出警告。
-Wno-inherited-variadic-ctor
禁止在基类中使用 C++11 继承构造函数的警告
继承自有一个 C 可变参数构造函数; 默认情况下警告是打开的,因为
省略号不会被继承。
-赢线
如果不能内联声明为 inline 的函数,则发出警告。 即使有了这个
选项,编译器不会警告在中声明的内联函数失败
系统标题。
编译器使用各种启发式方法来确定是否内联一个
功能。 例如,编译器会考虑函数的大小
inlined 和当前函数中已经完成的内联量。
因此,源程序中看似微不足道的更改可能会导致
产生的警告 -赢线 出现或消失。
-Wno-无效偏移量 (仅限 C++ 和 Objective-C++)
禁止应用警告 偏移量 宏到非 POD 类型。 根据
1998 ISO C++ 标准,应用 偏移量 到非 POD 类型是未定义的。 在
然而,现有的 C++ 实现, 偏移量 通常会给出有意义的结果
即使应用于某些类型的非 POD 类型(例如简单的 结构 这
仅由于具有构造函数而无法成为 POD 类型)。 这个标志是为了
意识到他们正在编写不可移植的代码并且故意
选择忽略有关它的警告。
的限制 偏移量 在 C++ 标准的未来版本中可能会放宽。
-Wno-int-to-pointer-cast
禁止将警告从强制转换为不同大小的整数的指针类型。 在
C++,转换为更小的指针类型是错误的。 指针转换 is
默认启用。
-Wno-指向 int-cast 的指针 (仅限 C 和 Objective-C)
禁止从指针转换为不同大小的整数类型的警告。
-Winvalid-pch
如果在搜索路径中找到预编译头但无法使用,则发出警告。
-长长
警告如果 长 长 类型被使用。 这是通过以下任一方式启用的 -W迂腐 or -传统的
在 ISO C90 和 C++98 模式下。 要禁止警告消息,请使用 -Wno-long-long.
-Wvariadic-宏
如果在迂腐的 ISO C90 模式或 GNU 替代语法中使用可变参数宏,则发出警告
在迂腐的 ISO C99 模式下。 这是默认设置。 要禁止警告消息,请使用
-Wno-可变参数宏.
-Wvarargs
警告用于处理变量参数的宏的可疑用法,例如
va_start. 这是默认设置。 要禁止警告消息,请使用 -Wno-varargs.
-Wvector-操作-性能
如果未通过架构的 SIMD 功能实现矢量操作,则发出警告。
主要用于性能调优。 可以实现向量运算
“分段”,这意味着对每个向量执行标量运算
元素; “并行”,这意味着向量操作是使用
更宽类型的标量,通常性能效率更高; 和“作为一个
标量”,这意味着该向量适合标量类型。
-Wno-虚拟移动分配
抑制有关通过非平凡的 C++11 移动从虚拟基础继承的警告
赋值运算符。 这是危险的,因为如果虚拟基地沿着
不止一条路径,它将被多次移动,这可能意味着两个对象都结束
处于移动状态。 如果写移动赋值运算符是为了避免
从移动的对象移动,可以禁用此警告。
-Wvla
如果代码中使用了可变长度数组,则发出警告。 -Wno-vla 防止 -W迂腐
可变长度数组的警告。
-Wvolatile 寄存器变量
如果寄存器变量被声明为 volatile,则发出警告。 volatile 修饰符不
禁止所有可能消除读取和/或写入寄存器的优化
变量。 此警告由启用 -墙.
-Wdisabled-优化
如果请求的优化通道被禁用,则发出警告。 这个警告一般不会
表明您的代码有任何问题; 它仅仅表明 GCC 的
优化器无法有效地处理代码。 通常,问题在于您的
代码太大或太复杂; 优化时 GCC 拒绝优化程序
本身可能会花费过多的时间。
-W指针符号 (仅限 C 和 Objective-C)
警告指针参数传递或具有不同符号的赋值。 这个
选项仅支持 C 和 Objective-C。 它暗示了 -墙 并通过
-W迂腐, 可以禁用 -W无指针符号.
-Wstack-保护器
此选项仅在以下情况下有效 -fstack-保护器 活跃。 它警告功能
没有防止堆栈粉碎的保护。
-Wno-muflap
抑制有关无法检测的构造的警告 -fmudflap.
-Woverlength-字符串
警告超过“最小最大”长度的字符串常量
C 标准中规定。 现代编译器通常允许字符串常量
比标准的最小限制长得多,但非常便携的程序应该
避免使用更长的字符串。
限制适用 after 字符串常量连接,不计算尾随
空。 在 C90 中,限制为 509 个字符; 在 C99 中,它被提升到 4095。C++98 确实如此
未指定规范的最小最大值,因此我们不诊断超长字符串
C ++。
此选项隐含在 -W迂腐,并且可以禁用
-Wno-超长字符串.
-Wun 后缀浮点常量 (仅限 C 和 Objective-C)
对任何没有后缀的浮动常量发出警告。 使用时
连同 -W系统标头 它警告系统头文件中的此类常量。
这在准备用于“FLOAT_CONST_DECIMAL64”编译指示的代码时很有用
从十进制浮点扩展到 C99。
附加选项 调试 你的 曲目 or GCC
GCC 有各种特殊选项可用于调试您的程序或 GCC:
-g 以操作系统的本机格式(stabs、COFF、
XCOFF 或 DWARF 2)。 GDB 可以使用此调试信息。
在大多数使用 stabs 格式的系统上, -g 允许使用额外的调试信息
只有 GDB 可以使用; 这些额外的信息使 GDB 中的调试工作更好,但是
可能使其他调试器崩溃或拒绝读取程序。 如果你想
控制是否生成额外信息,使用 -gtabs+, -gtabs,
-gxcoff+, -gxcoff或 -gvm (见下文)。
GCC 允许您使用 -g - -O. 优化代码采取的快捷方式可能
偶尔会产生令人惊讶的结果:您声明的某些变量可能不存在于
全部; 控制流可能会短暂地移动到您没有预料到的地方; 一些声明可能
不会被执行,因为它们计算常数结果或它们的值已经在
手; 一些语句可能会在不同的地方执行,因为它们已经被移出
的循环。
尽管如此,它证明可以调试优化的输出。 这使它合理
对可能有错误的程序使用优化器。
当生成具有更多功能的 GCC 时,以下选项很有用
不止一种调试格式。
-gsplit-矮人
将尽可能多的 dwarf 调试信息分离到一个单独的输出文件中
扩展名为 .dwo。 此选项允许构建系统避免链接文件
带有调试信息。 为了有用,此选项需要一个能够执行以下操作的调试器
读取 .dwo 文件。
-ggdb
生成供 GDB 使用的调试信息。 这意味着使用最具表现力的
可用格式(DWARF 2、stabs 或本机格式,如果这些都不是
支持),如果可能,包括 GDB 扩展。
-gpubnames
生成矮小的 .debug_pubnames 和 .debug_pubtypes 部分。
-gtabs
以 stabs 格式生成调试信息(如果支持),不使用 GDB
扩展名。 这是 DBX 在大多数 BSD 系统上使用的格式。 在 MIPS、Alpha 和
System V Release 4 系统此选项产生的 stabs 调试输出不是
DBX 或 SDB 理解。 在 System V Release 4 系统上,此选项需要 GNU
汇编器。
-feliminate-未使用的调试符号
以 stabs 格式(如果支持)生成调试信息,仅用于符号
实际使用的。
-femit-class-debug-always
不是只在一个目标文件中为 C++ 类发出调试信息,
使用该类在所有目标文件中发出它。 此选项应仅用于
无法处理 GCC 通常发出调试信息的方式的调试器
对于类,因为使用此选项会增加调试信息的大小
多达两倍。
-fdebug-types-节
使用 DWARF 版本 4 或更高版本时,可以将类型 DIE 放入自己的
“.debug_types”部分,而不是让它们成为“.debug_info”部分的一部分。 它
将它们放在单独的 comdat 部分更有效,因为链接器可以
删除重复项。 但并非所有 DWARF 消费者都支持“.debug_types”部分
并且在某些对象上“.debug_types”产生更大而不是更小的调试
信息。
-gtabs+
使用 GNU 以 stabs 格式(如果支持)生成调试信息
只有 GNU 调试器 (GDB) 才能理解的扩展。 这些扩展的用途是
可能使其他调试器崩溃或拒绝读取程序。
-gcoff
以 COFF 格式生成调试信息(如果支持)。 这是
SDB 在 System V Release 4 之前的大多数 System V 系统上使用的格式。
-gxcoff
以 XCOFF 格式生成调试信息(如果支持)。 这是
IBM RS/6000 系统上的 DBX 调试器使用的格式。
-gxcoff+
使用 GNU 以 XCOFF 格式(如果支持)生成调试信息
只有 GNU 调试器 (GDB) 才能理解的扩展。 这些扩展的用途是
可能使其他调试器崩溃或拒绝读取程序,并可能导致
GNU 汇编器 (GAS) 以外的汇编器因错误而失败。
-侏儒-版本
以 DWARF 格式生成调试信息(如果支持)。 的价值
版本 可以是 2、3 或 4; 大多数目标的默认版本是 4。
请注意,对于 DWARF 版本 2,某些端口需要并始终使用一些非冲突的
展开表中的 DWARF 3 扩展。
版本 4 可能需要 GDB 7.0 和 -fvar-跟踪任务 以获得最大利益。
-grecord-gcc-开关
此开关会导致用于调用编译器的命令行选项可能
影响要附加到 DWARF 中的 DW_AT_producer 属性的代码生成
调试信息。 这些选项用空格连接起来,将它们与
彼此和来自编译器的版本。 也可以看看 -frecord-gcc-开关 为了另一个
将编译器选项存储到目标文件中的方法。 这是默认设置。
-gno-record-gcc-开关
禁止将命令行选项附加到 DWARF 中的 DW_AT_producer 属性
调试信息。
-gstrict-矮人
禁止使用比所选版本更高的 DWARF 标准版本的扩展
-侏儒-版本. 在大多数使用以后的非冲突 DWARF 扩展的目标上
允许标准版本。
-gno-严格矮人
允许使用比所选版本更高的 DWARF 标准版本的扩展
-侏儒-版本.
-gvm
以 Alpha/VMS 调试格式生成调试信息(如果支持)。 这个
是 DEBUG 在 Alpha/VMS 系统上使用的格式。
-g水平
-ggdb水平
-gtabs水平
-gcoff水平
-gxcoff水平
-gvm水平
请求调试信息并使用 水平 指定多少信息。 这
默认级别为 2。
级别 0 根本不产生调试信息。 因此, -g0 取反 -g.
级别 1 产生的信息最少,足以在部分内容中进行回溯
您不打算调试的程序。 这包括功能描述和
外部变量,但没有关于局部变量的信息,也没有行号。
级别 3 包括额外信息,例如存在于
程序。 某些调试器在使用时支持宏扩展 -g3.
-gdwarf-2 不接受串联调试级别,因为 GCC 过去支持
选项 -gdwarf 这意味着在 DWARF 的第 1 版中生成调试信息
格式(这与版本 2 非常不同),而且会太混乱。
该调试格式早已过时,但现在无法更改该选项。 而是使用
额外的 -g水平 更改 DWARF 调试级别的选项。
-g切换
关闭调试信息的生成,如果省略此选项会生成它,或者关闭它
否则为 2 级。 此参数在命令行中的位置不
事情; 它在处理所有其他选项后生效,并且仅这样做
一次,无论给予多少次。 这主要用于
-fcompare-调试.
-fsanitize=地址
启用 AddressSanitizer,一种快速内存错误检测器。 内存访问指令
将用于检测越界和释放后使用错误。 看
<http://code.google.com/p/address-sanitizer/> 了解更多详情。
-fsanitize=线程
启用 ThreadSanitizer,这是一种快速数据竞争检测器。 内存访问指令将是
用于检测数据竞争错误。 看
<http://code.google.com/p/data-race-test/wiki/ThreadSanitizer> 了解更多详情。
-fdump-最终-insns[=文件]
将最终的内部表示 (RTL) 转储到 文件. 如果可选参数是
省略(或如果 文件 是“.”),转储文件的名称由附加
“.gkd”到编译输出文件名。
-fcompare-调试[=选择]
如果编译没有出错,则再次运行编译器,添加 选择 和
-f比较调试秒 到传递给第二次编译的参数。 转储
两个编译中的最终内部表示,如果它们不同,则打印错误。
如果省略等号,则默认 -g切换 用来。
环境变量 GCC_COMPARE_DEBUG, 如果定义, 非空和非零,
隐式启用 -fcompare-调试。 如果 GCC_COMPARE_DEBUG 定义为字符串
以破折号开头,然后用于 选择, 否则默认 -g切换 is
用过的。
-fcompare-调试=, 有等号但没有 选择,等价于
-fno-比较-调试,这将禁用最终表示的转储和
第二次编译,甚至阻止 GCC_COMPARE_DEBUG 从生效。
验证期间的全面覆盖 -fcompare-调试 测试,设置 GCC_COMPARE_DEBUG 说
-fcompare-debug-not-overridden, GCC 在任何实际情况中都拒绝作为无效选项
编译(而不是预处理、汇编或链接)。 为了得到一个警告,
设置 GCC_COMPARE_DEBUG 至 -w%n-f比较调试 而不去 被覆盖 会做。
-f比较调试秒
此选项隐式传递给编译器,用于请求的第二次编译
by -fcompare-调试,以及静音警告的选项,并省略其他选项
这会导致副作用编译器输出到文件或标准输出。
转储文件和保留的临时文件被重命名以包含“.gk”
第二次编译期间的额外扩展,以避免覆盖那些
由第一个产生。
当这个选项被传递给编译器驱动程序时,它会导致 第一 编译到
被跳过,这使得它除了正确调试编译器之外几乎没有用处。
-feliminate-dwarf2-dups
通过消除关于 DWARF 2 的重复信息来压缩 DWARF XNUMX 调试信息
每个符号。 此选项仅在生成 DWARF 2 调试时才有意义
信息与 -gdwarf-2.
-femit-struct-debug-baseonly
仅当类的基本名称为结构体类型时才发出调试信息
编译源文件与定义结构的文件的基本名称相匹配。
此选项大大减少了调试信息的大小,但在
调试器的类型信息有潜在的重大损失。 看
-femit-struct-debug-reduced 对于不那么激进的选择。 看
-femit-struct-debug-详细 进行更详细的控制。
此选项仅适用于 DWARF 2。
-femit-struct-debug-reduced
仅当类的基本名称为结构体类型时才发出调试信息
编译源文件与定义类型的文件的基本名称相匹配,
除非结构是模板或在系统标头中定义。
这个选项显着减少了调试信息的大小,一些
调试器可能会丢失类型信息。 看 -femit-struct-debug-baseonly
更积极的选择。 看 -femit-struct-debug-详细 更详细
控制。
此选项仅适用于 DWARF 2。
-femit-struct-debug-详细[=规格表]
指定编译器为其生成调试信息的类结构类型。 这
目的是减少不同目标文件之间重复的结构调试信息
在同一个程序中。
此选项是详细版本 -femit-struct-debug-reduced 和
-femit-struct-debug-baseonly,可满足大多数需求。
规范具有语法[目录:|索引:][顺序:|流派:](任何|系统|基地|没有)
可选的第一个字将规范限制为直接使用的结构
(目录:) 或间接使用 (索引:)。 struct 类型当它是类型时直接使用
的变量,成员。 通过指向结构的指针产生间接使用。 那是,
当不完整结构的使用有效时,使用是间接的。 一个例子是 结构
一种 直接的; 结构 二 * 间接;.
可选的第二个字将规范限制为普通结构(顺序:),或
通用结构(流派:)。 通用结构解释起来有点复杂。 对于 C++,
这些是模板类或非模板类的非显式特化
以上之内。 其他编程语言有泛型,但
-femit-struct-debug-详细 尚未实施它们。
第三个字指定编译器所针对的那些结构的源文件
应该发出调试信息。 价值 没有 和 任何 有正常的意思。 这
折扣值 基地 表示类型声明所在文件的名称基础
出现必须与主编译文件的名称匹配。 在实践中,
这意味着在编译时 foo.c, 为类型生成调试信息
在该文件中声明并且 foo.h,但不是其他头文件。 价值 系统 手段
那些类型满足 基地 或在系统或编译器头文件中声明。
您可能需要通过试验来确定适合您的应用程序的最佳设置。
默认是 -femit-struct-debug-详细=全部.
此选项仅适用于 DWARF 2。
-fno-合并调试字符串
指示链接器不要将调试信息中的字符串合并在一起
在不同的目标文件中相同。 并非所有汇编程序都支持合并或
链接器。 合并会减少输出文件中调试信息的大小
增加链接处理时间的成本。 默认情况下启用合并。
-fdebug-前缀-映射=旧=新
编译目录中的文件时 旧, 记录描述它们的调试信息为
in 新 代替。
-fno-dwarf2-cfi-asm
发出 DWARF 2 展开信息作为编译器生成的“.eh_frame”部分而不是使用
气体“.cfi_*”指令。
-p 生成额外的代码来编写适合分析程序的配置文件信息
教授. 在编译需要数据的源文件时,您必须使用此选项,
并且您还必须在链接时使用它。
-PG. 生成额外的代码来编写适合分析程序的配置文件信息
教授. 在编译需要数据的源文件时,您必须使用此选项,
并且您还必须在链接时使用它。
-Q 使编译器在编译时打印出每个函数名,并打印一些
每次完成时的统计信息。
-ftime-报告
使编译器打印一些有关每次通过时消耗的时间的统计信息
饰面。
-fmem-报告
使编译器在执行时打印有关永久内存分配的一些统计信息
饰面。
-fmem-报告-wpa
使编译器打印有关 WPA 的永久内存分配的一些统计信息
相而已。
-fpre-ipa-mem-报告
-fpost-ipa-mem-报告
使编译器在或之前打印有关永久内存分配的一些统计信息
经过过程间优化。
-fprofile-报告
使编译器打印有关(估计的)配置文件一致性的一些统计信息
和个人传球的效果。
-fstack-使用
在每个函数上使编译器输出程序的堆栈使用信息
基础。 转储的文件名是通过附加 。苏 以及 辅助名称. 辅助名称 is
从输出文件的名称生成,如果明确指定并且它不是
可执行文件,否则它是源文件的基本名称。 一个条目由
三个领域:
· 函数的名称。
· 字节数。
· 一个或多个限定词:“静态”、“动态”、“有界”。
限定符“static”表示该函数静态操作堆栈:
固定数量的字节在函数进入时为帧分配,并在
函数退出; 函数中不会以其他方式进行堆栈调整。 第二
字段是这个固定的字节数。
限定符“动态”表示该函数动态操作堆栈:在
除了上面描述的静态分配,堆栈调整是在
函数体,例如在函数调用周围推送/弹出参数。 如果
限定符“bounded”也存在,这些调整的数量被限制在
编译时间,第二个字段是使用的堆栈总量的上限
按功能。 如果不存在,则这些调整的数量不受限制
在编译时,第二个字段只代表有界部分。
-f轮廓弧
添加代码以便程序流 圆弧 被检测。 程序执行过程中
记录每个分支和调用的执行次数和执行次数
或返回。 当编译的程序退出时,它会将这些数据保存到一个名为
辅助名称.gcda 对于每个源文件。 数据可用于个人资料导向
优化(-fbranch-概率),或用于测试覆盖率分析
(-ftest-覆盖)。 每个目标文件的 辅助名称 是从名称生成的
输出文件,如果明确指定并且它不是最终的可执行文件,否则它
是源文件的基本名称。 在这两种情况下,任何后缀都被删除(例如
foo.gcda文件 对于输入文件 目录/foo.c或 目录/foo.gcda 对于指定为的输出文件 -o
目录/foo.o).
--覆盖率
此选项用于编译和链接用于覆盖分析的代码。 这
选项是同义词 -f轮廓弧 -ftest-覆盖 (编译时)和 -lgcov
(链接时)。 有关更多详细信息,请参阅这些选项的文档。
· 编译源文件 -f轮廓弧 加上优化和代码生成
选项。 对于测试覆盖率分析,使用额外的 -ftest-覆盖 选项。
您不需要分析程序中的每个源文件。
· 将您的目标文件与 -lgcov or -f轮廓弧 (后者意味着
以前的)。
· 在有代表性的工作负载上运行程序以生成弧形轮廓
信息。 这可以重复任意次。 你可以并发运行
程序的实例,并且如果文件系统支持锁定,
数据文件将被正确更新。 还检测到“fork”调用并
正确处理(不会发生重复计算)。
· 对于配置文件导向的优化,使用相同的代码再次编译源文件
优化和代码生成选项加上 -fbranch-概率.
· 对于测试覆盖率分析,使用 冠状病毒 从产生人类可读的信息
此 .gcno 和 .gcda 文件。 参考 冠状病毒 进一步的文件
信息。
在 -f轮廓弧, 为你程序的每个函数 GCC 创建一个程序流
图,然后找到该图的生成树。 只有不在上面的圆弧
必须检测生成树:编译器添加代码来计算生成树的数量
执行这些弧的次数。 当弧线是唯一的出口或唯一的入口时
一个block,可以在block中添加instrumentation代码; 否则,一个新的基本
必须创建块来保存检测代码。
-ftest-覆盖
生成一个注释文件 冠状病毒 代码覆盖实用程序可用于显示程序
覆盖。 每个源文件的注释文件被称为 辅助名称.gcno。 参考
-f轮廓弧 上面的选项描述 辅助名称 以及如何操作的说明
生成测试覆盖率数据。 覆盖数据与源文件更匹配,如果
你没有优化。
-fdbg-cnt-列表
打印所有调试计数器的名称和计数器上限。
-fdbg-cnt=反值列表
设置内部调试计数器上限。 反值列表 是逗号分隔的
列表 姓名:折扣值 对设置每个调试计数器的上限 姓名 至
折扣值. 所有调试计数器的初始上限为“UINT_MAX”; 因此
“dbg_cnt()”总是返回真,除非这个选项设置了上限。 为了
例如,与 -fdbg-cnt=dce:10,tail_call:0, "dbg_cnt(dce)" 仅对第一个返回 true
10 次调用。
-可取的-样-通过
-f禁用-样-通过=范围列表
这是一组用于显式禁用/启用优化的选项
通过。 这些选项旨在用于调试 GCC。 编译器用户应该
使用常规选项来启用/禁用通行证。
-f禁用-ipa-通过
禁用 IPA 通行证 通过. 通过 是通行证名称。 如果同一个传球是静态的
在编译器中多次调用,传递名称应附加
从 1 开始的序号。
-f禁用-rtl-通过
-f禁用-rtl-通过=范围列表
禁用 RTL 传递 通过. 通过 是通行证名称。 如果同一个传球是静态的
在编译器中多次调用,传递名称应附加
从 1 开始的序号。 范围列表 是逗号分隔的列表
函数范围或汇编程序名称。 每个范围是一个数字对,由一个
冒号。 范围包括两端。 如果范围微不足道,则数字
pair 可以简化为一个数字。 如果函数的调用图节点的
的uid 落入指定范围之一, 通过 为此被禁用
功能。 的 的uid 显示在转储文件的函数头中,pass
可以使用选项转储名称 -fdump 通行证.
-f禁用树-通过
-f禁用树-通过=范围列表
禁用树传递 通过。 看 -f禁用-rtl 对于选项的描述
参数。
-fenable-ipa-通过
启用 IPA 通行证 通过. 通过 是通行证名称。 如果同一个传球是静态的
在编译器中多次调用,传递名称应附加
从 1 开始的序号。
-fenable-rtl-通过
-fenable-rtl-通过=范围列表
启用 RTL 传递 通过。 看 -f禁用-rtl 用于选项参数描述和
例子。
-fable-tree-通过
-fable-tree-通过=范围列表
启用树传递 通过。 看 -f禁用-rtl 用于选项参数的描述。
以下是一些示例,展示了这些选项的用法。
# 禁用所有功能的 ccp1
-fdisable-tree-ccp1
# 禁用 cgraph 节点 uid 为 1 的函数的完全展开
-fenable-tree-cunroll=1
# 为以下范围 [2] 的函数禁用 gcse1,1,
# [300,400] 和 [400,1000]
# 为函数 foo 和 foo2 禁用 gcse2
-fdisable-rtl-gcse2=foo,foo2
# 禁用早期内联
-fdisable-tree-einline
# 禁用 ipa 内联
-fdisable-ipa-内联
# 启用树完全展开
-fenable-tree-展开
-d信件
-fdump-rtl-通过
-fdump-rtl-通过=文件名
说在编译期间在指定的时间进行调试转储 信件。 这
用于调试编译器基于 RTL 的通道。 大多数文件名
转储是通过在 转储名称,并
文件在输出文件的目录中创建。 的情况下 =文件名 选项,
转储是在给定文件上输出的,而不是通过编号的转储文件。 笔记
当传递被注册到传递中时,传递数是静态计算的
经理。 因此编号与动态执行顺序无关
通过。 特别是,插件安装的通行证甚至可能超过 200
如果它执行得很早。 转储名称 从输出文件的名称生成,
如果明确指定并且它不是可执行文件,否则它是
源文件。 这些开关在以下情况下可能会产生不同的效果 -E 是用来
预处理。
调试转储可以通过 -fdump-rtl 开关或一些 -d 选项 信件。 这里
是可能用于的字母 通过 和 信件,以及它们的含义:
-fdump-rtl-对齐
计算分支对齐后转储。
-fdump-rtl-asmcons
在修复不满足输入/输出约束的 rtl 语句后转储。
-fdump-rtl-auto_inc_dec
auto-inc-dec 发现后转储。 此pass仅在以下架构上运行
有 auto inc 或 auto dec 指令。
-fdump-rtl-屏障
清除屏障说明后转储。
-fdump-rtl-bbpart
划分冷热基本块后转储。
-fdump-rtl-bbro
块重新排序后转储。
-fdump-rtl-btl1
-fdump-rtl-btl2
-fdump-rtl-btl1 和 -fdump-rtl-btl2 在两个分支目标之后启用转储
负载优化通过。
-fdump-rtl-绕过
跳转绕过和控制流优化后转储。
-fdump-rtl-组合
RTL 指令组合通过后转储。
-fdump-rtl-compgotos
复制计算得到的 goto 后转储。
-fdump-rtl-ce1
-fdump-rtl-ce2
-fdump-rtl-ce3
-fdump-rtl-ce1, -fdump-rtl-ce2及 -fdump-rtl-ce3 在三个之后启用转储
如果转换通过。
-fdump-rtl-cprop_hardreg
硬寄存器复制传播后转储。
-fdump-rtl-csa
组合堆栈调整后转储。
-fdump-rtl-cse1
-fdump-rtl-cse2
-fdump-rtl-cse1 和 -fdump-rtl-cse2 两个常用后启用转储
子表达式消除通过。
-fdump-rtl-dce
在独立的死代码消除通过后转储。
-fdump-rtl-dbr
延迟分支调度后转储。
-fdump-rtl-dce1
-fdump-rtl-dce2
-fdump-rtl-dce1 和 -fdump-rtl-dce2 enable dumping after 两个dead store
淘汰通过。
-fdump-rtl-eh
EH 处理代码完成后转储。
-fdump-rtl-eh_ranges
EH 处理范围区域转换后的转储。
-fdump-rtl-展开
RTL 生成后转储。
-fdump-rtl-fwprop1
-fdump-rtl-fwprop2
-fdump-rtl-fwprop1 和 -fdump-rtl-fwprop2 两个转发后启用转储
传播通过。
-fdump-rtl-gcse1
-fdump-rtl-gcse2
-fdump-rtl-gcse1 和 -fdump-rtl-gcse2 在全球通用后启用转储
子表达式消除。
-fdump-rtl-init-regs
寄存器初始化后转储。
-fdump-rtl-initvals
计算初始值集后转储。
-fdump-rtl-into_cfglayout
转换为 cfglayout 模式后转储。
-fdump-rtl-ira
迭代寄存器分配后转储。
-fdump-rtl-跳转
第二次跳转优化后转储。
-fdump-rtl-loop2
-fdump-rtl-loop2 在 rtl 循环优化通过后启用转储。
-fdump-rtl-mach
执行依赖机器的重组过程后转储,如果该过程
存在。
-fdump-rtl-mode_sw
删除冗余模式开关后转储。
-fdump-rtl-rnreg
寄存器重新编号后转储。
-fdump-rtl-outof_cfglayout
从 cfglayout 模式转换后转储。
-fdump-rtl-窥视孔2
在窥视孔通过后转储。
-fdump-rtl-postreload
重新加载后优化后转储。
-fdump-rtl-pro_and_epilogue
生成函数序言和尾声后转储。
-fdump-rtl-regmove
寄存器移动通过后转储。
-fdump-rtl-sched1
-fdump-rtl-sched2
-fdump-rtl-sched1 和 -fdump-rtl-sched2 在基本块之后启用转储
调度通过。
-fdump-rtl-see
消除符号扩展后的转储。
-fdump-rtl-seqabstr
常见序列发现后转储。
-fdump-rtl-缩短
缩短分支后转储。
-fdump-rtl-兄弟
同级调用优化后转储。
-fdump-rtl-split1
-fdump-rtl-split2
-fdump-rtl-split3
-fdump-rtl-split4
-fdump-rtl-split5
-fdump-rtl-split1, -fdump-rtl-split2, -fdump-rtl-split3, -fdump-rtl-split4 和
-fdump-rtl-split5 五轮指令拆分后启用转储。
-fdump-rtl-sms
模调度后转储。 此pass仅在某些架构上运行。
-fdump-rtl-堆栈
从 GCC 的“平面寄存器文件”寄存器转换为 x87 后的转储
类似堆栈的寄存器。 此传递仅在 x86 变体上运行。
-fdump-rtl-subreg1
-fdump-rtl-subreg2
-fdump-rtl-subreg1 和 -fdump-rtl-subreg2 在两个 subreg 之后启用转储
扩展通过。
-fdump-rtl-取消共享
转储毕竟 rtl 已取消共享。
-fdump-rtl-vartrack
变量跟踪后转储。
-fdump-rtl-vregs
将虚拟寄存器转换为硬寄存器后转储。
-fdump-rtl-web
生命范围分割后转储。
-fdump-rtl-regclass
-fdump-rtl-subregs_of_mode_init
-fdump-rtl-subregs_of_mode_finish
-fdump-rtl-dfinit
-fdump-rtl-dfinish
这些转储被定义但总是产生空文件。
-in
-fdump-rtl-全部
生成上面列出的所有转储。
dA 用杂项调试信息注释汇编器输出。
-DD 转储所有宏定义,在预处理结束时,除了正常
输出。
-dH 发生错误时生成核心转储。
-dp 用指示哪个模式和
使用替代。 每条指令的长度也被打印出来。
dP 在每条指令之前将 RTL 作为注释转储到汇编器输出中。 还
打开 -dp 注解。
-dx 只需为函数生成 RTL 而不是编译它。 通常与
-fdump-rtl-展开.
-fdump-noaddr
在进行调试转储时,禁止地址输出。 这使得更可行
使用 diff 在调试转储时使用不同的编译器二进制文件进行编译器调用
和/或不同的 text/bss/data/heap/stack/dso 起始位置。
-fdump-未编号
在进行调试转储时,抑制指令编号和地址输出。 这个
使得在编译器调用的调试转储上使用 diff 变得更加可行
不同的选择,特别是有和没有 -g.
-fdump-未编号的链接
进行调试转储时(请参阅 -d 上面的选项),抑制指令编号
链接到序列中的上一条和下一条指令。
-fdump 翻译单元 (仅限 C++)
-fdump-翻译单元-选项 (仅限 C++)
将整个翻译单元的树结构表示转储到文件中。
文件名是通过附加 .tu 到源文件名,文件是
在与输出文件相同的目录中创建。 如果 -选项 使用形式,
选项 控制转储的详细信息,如对 -fdump-树 选项。
-fdump 类层次结构 (仅限 C++)
-fdump-类层次结构-选项 (仅限 C++)
将每个类的层次结构和虚函数表布局的表示转储到
文件。 文件名是通过附加 。类 到源文件名,和文件
在与输出文件相同的目录中创建。 如果 -选项 使用形式,
选项 控制转储的详细信息,如对 -fdump-树 选项。
-fdump-ipa-开关
控制程序间分析语言树各个阶段的dumping到一个
文件。 文件名是通过将特定于开关的后缀附加到源来生成的
文件名,并且文件创建在与输出文件相同的目录中。 这
以下转储是可能的:
所有 启用所有过程间分析转储。
图形
转储有关调用图优化、未使用函数删除和
内联决策。
一致
函数内联后转储。
-fdump 通行证
转储当前打开和关闭的优化通道列表
命令行选项。
-fdump-统计-选项
在单独的文件中启用和控制传递统计信息的转储。 文件名是
通过附加以结尾的后缀生成 。统计数据 到源文件名,以及
文件创建在与输出文件相同的目录中。 如果 -选项 形式是
用过的, -统计 导致计数器在整个编译单元上相加,而
-细节 在传递生成它们时转储每个事件。 没有选项的默认值是
为每个编译的函数求和计数器。
-fdump-树-开关
-fdump-树-开关-选项
-fdump-树-开关-选项=文件名
在处理中间语言树的各个阶段控制转储
一份文件。 文件名是通过将特定于交换机的后缀附加到
源文件名,并且该文件与输出文件在同一目录中创建。 在
的情况下, =文件名 选项,转储输出到给定的文件而不是自动
命名转储文件。 如果 -选项 使用形式, 选项 是的清单 - 分离
控制转储细节的选项。 并非所有选项都适用于所有
倾倒; 那些没有意义的将被忽略。 以下选项可用
地址
打印每个节点的地址。 通常这没有意义,因为它会改变
根据环境和源文件。 它的主要用途是捆绑一个
转储文件与调试环境。
名称
如果为给定的声明设置了“DECL_ASSEMBLER_NAME”,则在转储中使用它
而不是“DECL_NAME”。 它的主要用途是易于使用,从
程序集文件中的混淆名称。
瘦
在转储前端中间表示时,禁止转储
函数的作用域或主体仅仅因为已经到达该作用域。 仅有的
当它们可以通过其他路径直接到达时转储这些项目。
倾倒印刷精美的树木时,此选项禁止倾倒树木的身体
控制结构。
转储 RTL 时,以精简(精简)形式打印 RTL,而不是默认值
类似 LISP 的表示。
原 打印树的原始表示。 默认情况下,树被漂亮地打印到
类似 C 的表示。
详情
启用更详细的转储(不是每个转储选项都支持)。 还包括
来自优化过程的信息。
统计
启用转储有关通行证的各种统计信息(并非每次转储都遵循
选项)。
块
启用显示基本块边界(在原始转储中禁用)。
图形
对于每个其他指示的转储文件 (-fdump-rtl-通过),转储一个
适合使用 GraphViz 查看的控制流图的表示
文件.passid.pass.dot. 文件中的每个函数都被漂亮地打印为子图,
这样 GraphViz 就可以将它们全部呈现在一个图中。
此选项当前仅适用于 RTL 转储,并且 RTL 始终转储在
苗条的形式。
语音播报
为每个语句启用显示虚拟操作数。
线诺
启用显示语句的行号。
的uid 启用显示每个变量的唯一 ID(“DECL_UID”)。
详细
启用显示每个语句的树转储。
eh 启用显示保存每个语句的 EH 区域编号。
斯凯夫
启用显示标量演化分析详细信息。
优化
启用显示优化信息(仅在特定通道中可用)。
错过
启用显示错过的优化信息(仅在特定通道中可用)。
笔记
启用其他详细的优化信息(仅在某些通道中可用)。
=文件名
而不是自动命名的转储文件,输出到给定的文件名。 文件
名称 标准输出 和 斯特德 被特殊对待并被视为已经开放
标准流。 例如,
gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump
-fdump-tree-pre=stderr 文件.c
输出向量化器转储到 转储文件, 而 PRE 转储输出到 斯特德.
如果为同一个传递提供了两个冲突的转储文件名,则后者
选项覆盖较早的选项。
所有 打开所有选项,除了 原, 瘦, 详细 和 线诺.
光子
打开所有优化选项,即 优化, 错过及 注意.
以下树转储是可能的:
原版的
在任何基于树的优化之前转储,以 文件原件.
优化
转储所有基于树的优化, 文件优化.
笑脸
在 gimplification 传递之前和之后转储每个函数到一个文件。 文件
名称是通过附加 .gimple 到源文件名。
CFG 将每个函数的控制流图转储到文件中。 文件名由
附加 .CFG 到源文件名。
ch 复制循环头后转储每个函数。 文件名是通过附加
·CH 到源文件名。
SSA 将 SSA 相关信息转储到文件中。 文件名是通过附加 .ssa
到源文件名。
别号
转储每个函数的别名信息。 文件名是通过附加
.别名 到源文件名。
中共 在 CCP 之后转储每个函数。 文件名是通过附加 .ccp 以及
源文件名。
商店
在 STORE-CCP 之后转储每个函数。 文件名是通过附加 .storeccp
到源文件名。
预 部分冗余消除后转储树。 文件名由
附加 .pre 到源文件名。
FRE 完全冗余消除后转储树。 文件名是通过附加
.fre 到源文件名。
复制道具
复制传播后转储树。 文件名是通过附加 .copyprop
到源文件名。
商店复制属性
在存储复制传播后转储树。 文件名是通过附加
.store_copyprop 到源文件名。
DCE 消除死代码后转储每个函数。 文件名由
附加 .dce 到源文件名。
挡泥板
添加挡泥板仪器后转储每个功能。 文件名由
附加 。挡泥板 到源文件名。
斯拉 在执行聚合的标量替换后转储每个函数。 文件
名称是通过附加 .sra 到源文件名。
水槽
执行代码下沉后转储每个函数。 文件名由
附加 。下沉 到源文件名。
礼物 在应用支配树优化后转储每个函数。 文件名是
通过附加 .dom 到源文件名。
DSE 在应用死存储消除后转储每个函数。 文件名制作完成
通过附加 .dse 到源文件名。
飞利浦
将 PHI 节点优化后的每个函数转储为直线代码。 文件
名称是通过附加 .phiopt 到源文件名。
前桨
在向前传播一次性变量后转储每个函数。 文件名
是通过附加 .向前传播 到源文件名。
复制重命名
应用复制重命名优化后转储每个函数。 文件名是
通过附加 .copy重命名 到源文件名。
神经 在泛型上应用命名返回值优化后转储每个函数
树木。 文件名是通过附加 .nrv 到源文件名。
矢量
在应用循环向量化后转储每个函数。 文件名制作完成
通过附加 .vect 到源文件名。
SLP 在应用基本块的矢量化后转储每个函数。 文件名是
通过附加 .slp 到源文件名。
录像机 在值范围传播 (VRP) 之后转储每个函数。 文件名由
附加 .vrp 到源文件名。
所有 使用此选项中提供的标志启用所有可用的树转储。
-fopt-信息
-fopt-信息-选项
-fopt-信息-选项=文件名
控制来自各种优化通道的优化转储。 如果 -选项 形式是
用过的, 选项 是的清单 - 用于选择转储详细信息的单独选项和
优化。 如果 选项 未指定,默认为 所有 详情和 光子
对于优化组。 如果 文件名 未指定,默认为 斯特德。 笔记
输出 文件名 如果有多个翻译单元,将被覆盖。 如果
需要来自多个翻译单元的组合输出, 斯特德 应该使用
代替。
选项可以分为两组,1) 描述选项详细程度的选项
dump,以及 2) 描述应包括哪些优化的选项。 选项
来自这两个组的可以自由混合,因为它们不重叠。 但是,万一
对于任何冲突,后面的选项会覆盖命令行上的前面的选项。
尽管可以接受多个 -fopt-info 选项,但只有其中一个可以具有 =文件名.
如果提供了其他文件名,则除了第一个之外的所有文件名都将被忽略。
转储详细程度有以下选项
优化
成功应用优化后打印信息。 这取决于通行证
决定哪些信息是相关的。 例如,矢量化器通过打印
成功矢量化的循环的源位置。
错过
打印有关错过的优化的信息。 个人传球控制哪个
要包含在输出中的信息。 例如,
gcc -O2 -ftree-vectorize -fopt-info-vec-missed
将打印有关从矢量化中错过的优化机会的信息
传递标准错误。
注意
打印有关优化的详细信息,例如某些转换,
有关决策等的更详细信息。
所有 打印详细的优化信息。 这包括 优化, 错过及
注意.
第二组选项描述了一组优化,可能包括一个或
更多以下内容。
IPA 启用所有过程间优化的转储。
循环
启用所有循环优化的转储。
一致
启用所有内联优化的转储。
VEC 启用所有矢量化优化的转储。
例如,
gcc -O3 -fopt-info-missed=missed.all
从所有的传递中输出错过的优化报告到 错过了所有.
再举一个例子,
gcc -O3 -fopt-info-inline-optimized-missed=inline.txt
将输出有关错过的优化以及优化位置的信息
所有的内联都传递到 内联.txt.
如果 文件名 提供,那么所有适用优化的转储是
连接成 文件名. 否则转储输出到 斯特德。 如果 选项
省略,默认为 全选,这意味着转储所有可用的优化
来自所有通行证的信息。 在以下示例中,所有优化信息都输出
至 斯特德.
gcc -O3 -fopt 信息
需要注意的是 -fopt-info-vec-错过 行为与 -fopt-信息-错过的-vec.
作为另一个例子,考虑
gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt
这里有两个输出文件名 vec.小姐 和 循环选择 冲突,因为只有一个
允许输出文件。 在这种情况下,只有第一个选项生效,并且
后续选项将被忽略。 因此只有 vec.小姐 产生哪些污染物
从矢量化器转储关于错过的机会。
-ftree-向量化器-详细=n
此选项已弃用,并在以下方面实施 -fopt-信息。 请用
-fopt-信息-样 形式代替,其中 样 是有效的 opt-info 选项之一。 它
打印额外的优化信息。 为了 n=0 没有诊断信息
报道。 如果 n=1 向量化器报告每个被向量化的循环,以及总数
被矢量化的循环数。 如果 n=2 向量化器报告位置
无法矢量化及其原因。 对于任何更高的详细级别,所有
报告来自矢量化器的分析和转换信息。
注意输出的信息 -ftree-vectorizer-详细 选项被发送到
斯特德. 如果等价形式 -fopt-信息-选项=文件名 使用然后输出是
发送到 文件名 代替。
-随机种子=绳子
此选项提供了 GCC 用来代替随机数生成的种子
在每个编译文件中必须不同的某些符号名称。 也是
用于在覆盖数据文件和生成的目标文件中放置唯一的标记
他们。 您可以使用 -随机种子 生成可重复的相同对象的选项
文件。
这款 绳子 您编译的每个文件都应该不同。
-fsched-详细=n
在使用指令调度的目标上,此选项控制
调度程序打印的调试输出。 此信息写入标准错误,
除非 -fdump-rtl-sched1 or -fdump-rtl-sched2 被指定,在这种情况下它是输出
到通常的转储列表文件, .sched1 or .sched2 分别。 然而对于 n
大于九,输出总是打印为标准错误。
对于 n 大于零, -fsched-详细 输出相同的信息
-fdump-rtl-sched1 和 -fdump-rtl-sched2。 对于 n 大于一,它也输出基本
块概率、详细的就绪列表信息和单位/insn 信息。 为了 n
大于 XNUMX,它包括中止点的 RTL、控制流和区域信息。 和
n 超过四个, -fsched-详细 还包括依赖信息。
-保存临时
-保存临时工=cwd
永久存储通常的“临时”中间文件; 将它们放在当前
目录并根据源文件命名它们。 因此,编译 foo.c - -c
-保存临时 产生文件 富我 和 foo.s以及 foo.o。 这创建了一个
预处理的 富我 即使编译器现在通常使用
集成预处理器。
当与 -x 命令行选项, -保存临时 明智的
足以避免覆盖与扩展名相同的输入源文件
中间文件。 重命名可以得到对应的中间文件
使用前的源文件 -保存临时.
如果你并行调用 GCC,编译几个不同的源文件,这些文件共享一个
不同子目录中的公共基名或编译为相同的源文件
多个输出目的地,不同的并行编译器很可能会
相互干扰,并覆盖临时文件。 例如:
gcc -save-temps -o outdir1/foo.o indir1/foo.c&
gcc -save-temps -o outdir2/foo.o indir2/foo.c&
可能导致 富我 和 foo.o 由两个编译器同时写入。
-保存临时工=对象
永久存储通常的“临时”中间文件。 如果 -o 使用选项,
临时文件基于目标文件。 如果 -o 选项未使用,
-保存临时工=对象 开关的行为就像 -保存临时.
例如:
gcc -save-temps=obj -c foo.c
gcc -save-temps=obj -c bar.c -o dir/xbar.o
gcc -save-temps=obj foobar.c -o dir2/yfoobar
创建 富我, foo.s, 目录/xbar.i, 目录/xbar.s, 目录 2/yfoobar.i, dir2/yfoobar.s及
dir2/yfoobar.o.
-时间[=文件]
报告编译序列中每个子进程占用的 CPU 时间。 对于 C
源文件,这是正确的编译器和汇编器(如果链接是,则加上链接器
完毕)。
如果没有输出文件的规范,输出如下所示:
#cc1 0.12 0.01
# 作为 0.00 0.01
每行的第一个数字是“用户时间”,即执行
程序本身。 第二个数字是“系统时间”,执行操作所花费的时间
系统例程代表程序。 这两个数字都以秒为单位。
随着输出文件的规范,输出被附加到命名文件,
它看起来像这样:
0.12 0.01 立方厘米
0.00 0.01 作为
“用户时间”和“系统时间”移到程序名之前,
显示传递给程序的选项,以便稍后可以知道是哪个文件
正在编译,以及使用哪些选项。
-fvar-跟踪
运行变量跟踪传递。 它计算变量在每个位置的存储位置
在代码中。 然后生成更好的调试信息(如果调试信息
格式支持此信息)。
使用优化编译时默认启用它 (-你, -O, -氧气, ...),
调试信息(-g) 并且调试信息格式支持它。
-fvar-跟踪任务
在编译早期注释对用户变量的赋值并尝试携带
整个编译过程中的注释一直到最后,试图
在优化的同时改进调试信息。 用于 -gdwarf-4 推荐一起
用它。
即使禁用了 var-tracking,也可以启用它,在这种情况下注释是
创建和维护,但最终丢弃。
-fvar-跟踪-分配-切换
切换 -fvar-跟踪任务,就像 -g切换 切换 -g.
-打印文件名=图书馆
打印库文件的完整绝对名称 图书馆 那会在什么时候使用
链接---并且不要做任何其他事情。 使用此选项,GCC 不会编译或链接
任何事物; 它只是打印文件名。
-打印多目录
打印与任何其他开关选择的 multilib 对应的目录名称
出现在命令行中。 这个目录应该存在于 GCC_EXEC_PREFIX.
-打印多库
打印从 multilib 目录名称到启用它们的编译器开关的映射。
目录名称与开关分开 ;, 每个开关都以
@ 而不是 -, 多个开关之间没有空格。 这应该是
简化外壳加工。
-打印多操作系统目录
打印所选多库的操作系统库路径,相对于某些 LIB
子目录。 如果操作系统库存在于 LIB 子目录,没有多库
使用,这通常只是 ., 如果操作系统库存在于 库后缀 兄弟
这打印的目录例如 ../lib64, ../ lib目录 or ../lib32,或者如果操作系统库是
存在于 库/子目录 它打印的子目录,例如 amd64, sparcv9 or ev6.
-打印多体系结构
打印所选多架构的操作系统库路径,相对于某些 LIB
子目录。
-打印程序名称=程序
喜欢 -打印文件名, 但搜索诸如 CPP.
-print-libgcc-文件名
与...一样 -打印文件名=libgcc.a.
这在您使用时很有用 -nostdlib or -无默认库 但你确实想链接
libgcc.a. 你可以做:
gcc -nostdlib ...`gcc -print-libgcc-file-name`
-打印搜索目录
打印配置的安装目录名称和程序列表
图书馆目录 GCC 搜索---并且不要做任何其他事情。
这在以下情况下很有用 GCC 打印错误信息 安装 问题, 不能 EXEC
cp0: 没有 这样 文件 or 目录. 要解决此问题,您需要将 cp0 和
其他编译器组件,其中 GCC 希望找到它们,或者您可以设置
环境变量 GCC_EXEC_PREFIX 到您安装它们的目录。 别
忘记尾随 /.
-打印系统根目录
打印编译期间使用的目标 sysroot 目录。 这是
在配置时或使用指定的目标 sysroot --系统根目录 选项,
可能带有取决于编译选项的额外后缀。 如果没有目标
sysroot 被指定,该选项不打印任何内容。
-打印-sysroot-标头-后缀
搜索标题时打印添加到目标 sysroot 的后缀,或给出
如果编译器没有配置这样的后缀会出错---并且不做任何事情
其他。
-转储机
打印编译器的目标机器(例如, i686-pc-linux-gnu)---不要做
还要别的吗。
-转储版本
打印编译器版本(例如, 3.0)---并且不要做任何其他事情。
-转储规格
打印编译器的内置规范---不要做任何其他事情。 (这用于
GCC 本身正在构建中。)
-fno-消除未使用的调试类型
通常,当产生 DWARF 2 输出时,GCC 避免产生调试符号输出
正在编译的源文件中没有使用的类型。 有时很有用
让 GCC 为编译单元中声明的所有类型发出调试信息,
无论它们是否在该编译单元中实际使用,对于
例如,如果在调试器中,您想将值强制转换为实际上不是的类型
在您的程序中使用(但已声明)。 然而,更多的时候,这会导致
大量浪费的空间。
附加选项 那个 系统 优化
这些选项控制各种优化。
没有任何优化选项,编译器的目标是降低编译成本
并使调试产生预期的结果。 陈述是独立的:如果你
在语句之间使用断点停止程序,然后您可以为
任何变量或将程序计数器更改为函数中的任何其他语句并获取
正是您从源代码中期望的结果。
打开优化标志使编译器尝试提高性能和/或
以牺牲编译时间和可能的调试能力为代价的代码大小
程序。
编译器根据它对程序的了解来执行优化。
一次将多个文件编译为单个输出文件模式允许编译器使用
编译每个文件时从所有文件中获得的信息。
并非所有优化都由标志直接控制。 仅具有
标志在本节中列出。
大多数优化仅在以下情况下启用 -O 级别在命令行上设置。 除此以外
即使指定了单独的优化标志,它们也会被禁用。
根据目标和 GCC 的配置方式,一组略有不同的
可以在每个启用优化 -O 级别高于此处列出的级别。 你可以调用 GCC
- -Q --help=优化器 找出启用的确切优化集
每个级别。
-O
-氧气 优化。 优化编译需要更多的时间和更多的内存
一个大函数。
在 -O,编译器试图减少代码大小和执行时间,而不执行
任何需要大量编译时间的优化。
-O 打开以下优化标志:
-fauto-inc-dec -fcompare-elim -fcprop-寄存器 -fdce -fdefer-pop -fdelayed-分支
-fdse -fguess 分支概率 -fif-转换2 -fif-转换 -fipa-纯常量
-fipa 配置文件 -fipa 参考 -fmerge-常量 -fsplit-wide-类型 -ftree-位-ccp
-ftree-内置调用-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce
-ftree-支配-选择 -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-slsr
-ftree-sra -ftree-pta -树三 -一次一次的乐趣
-O 也开启 -fomit帧指针 在这样做不会干扰的机器上
带调试。
-氧气 进一步优化。 GCC 执行几乎所有不支持的优化
涉及空间速度的权衡。 相比于 -O,这个选项增加了
编译时间和生成代码的性能。
-氧气 打开指定的所有优化标志 -O. 它还开启以下功能
优化标志: -fthread-跳转 -falign 函数 -falign 跳跃 -falign 循环
-falign 标签 -fcaller-保存 -f越野跳跃 -fcse 跟随跳跃 -fcse-跳过块
-fdelete-空指针检查 -f去虚拟化 - 昂贵的优化 -fgcse
-fgcse-lm -fhoist-相邻负载 -finline-小功能 -findirect-内联
-fipa-sra -foptimize-sibling-calls -f 部分内联 -f窥孔2 -fregmove
-freorder块 -freorder 函数 -frerun-cse-循环后 -fsched-块间
-fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-别名 -fstrict-溢出
-ftree-switch 转换 -ftree尾合并 -ftree-pre -ftree-vrp
请注意下面的警告 -fgcse 关于调用 -氧气 在使用计算的程序上
转到。
注意:在 Ubuntu 8.10 及更高版本中, -D_FORTIFY_SOURCE=2 是默认设置的,并且是
激活时 -O 设置为 2 或更高。 这使得额外的编译时间和
运行时检查几个 libc 函数。 要禁用,请指定
-U_FORTIFY_SOURCE or -D_FORTIFY_SOURCE=0.
-氧气 优化更多。 -氧气 打开指定的所有优化 -氧气 并且还开启
此 -finline-函数, -funswitch循环, -f预测共同点, -fgcse-重新加载后,
-ftree-矢量化, -fvect-成本模型, -ftree-部分预 和 -fipa-cp-克隆 选项。
-氧气 减少编译时间并使调试产生预期的结果。 这是
默认。
-你 优化尺寸。 -你 使所有 -氧气 通常不会增加的优化
代码大小。 它还执行旨在减少代码大小的进一步优化。
-你 禁用以下优化标志: -falign 函数 -falign 跳跃
-falign 循环 -falign 标签 -freorder块 -freorder-块和分区
-fprefetch 循环数组 -ftree-vect-循环版本
-奥法斯特
无视严格的标准合规性。 -奥法斯特 使所有 -氧气 优化。 它也是
启用对所有符合标准的程序都无效的优化。 它
打开 -ffast-数学 和 Fortran 特定的 -fno-保护括号 和 -fstack 数组.
-Og 优化调试体验。 -Og 启用不干扰的优化
调试。 它应该是标准编辑选择的优化级别 -
编译-调试周期,提供合理的优化水平,同时保持
编译速度快,调试体验好。
如果您使用多个 -O 选项,带或不带级别编号,最后一个这样的选项是
那个是有效的。
表格选项 -f旗 指定与机器无关的标志。 大多数旗帜都有
正面和负面的形式; 的否定形式 -ffoo is -fno-foo. 在下表中,
只列出了其中一种表格——您通常使用的表格。 你可以找出另一个
通过删除形成 NO- 或添加它。
以下选项控制特定的优化。 它们要么被激活 -O
选项或与之相关的选项。 您可以在罕见的情况下使用以下标志
需要对要执行的优化进行“微调”的情况。
-fno-默认内联
不要仅仅因为成员函数在内部定义而默认内联
类范围(仅限 C++)。 否则,当您指定 -O, 成员函数定义
默认情况下,在类范围内编译内联; 即,您不需要添加 一致
在成员函数名前。
-fno-延迟弹出
一旦函数返回,总是弹出每个函数调用的参数。 为了
在函数调用后必须弹出参数的机器,编译器通常让
多个函数调用的参数在堆栈上累积,并在
一旦。
级别禁用 -O, -氧气, -氧气, -你.
-fforward-传播
在 RTL 上执行前向传播传递。 pass 尝试结合两个指令
并检查结果是否可以简化。 如果循环展开处于活动状态,则两次通过
执行并在循环展开后安排第二个。
默认情况下在优化级别启用此选项 -O, -氧气, -氧气, -你.
-ffp-合同=样式
-ffp-合同=关闭 禁用浮点表达式收缩。 -ffp-合同=快
启用浮点表达式收缩,例如融合乘加的形成
如果目标对它们具有本机支持,则操作。 -ffp-合同=开 使
如果语言标准允许,则使用浮点表达式收缩。 这是
目前未实施和同等对待 -ffp-合同=关闭.
默认是 -ffp-合同=快.
-fomit帧指针
不要将帧指针保存在不需要的函数的寄存器中。 这个
避免了保存、设置和恢复帧指针的指令; 它也使
在许多功能中可用的额外寄存器。 It 还 & 调试 不可能 on
一些 机器。
在一些机器上,比如 VAX,这个标志没有作用,因为标准
调用序列会自动处理帧指针,并且不会保存任何内容
假装它不存在。 机器描述宏“FRAME_POINTER_REQUIRED”
控制目标机器是否支持此标志。
从 GCC 4.6 版开始,默认设置(未优化大小时)为
32 位 GNU/Linux x86 和 32 位 Darwin x86 目标已更改为
-fomit帧指针. 默认可以恢复为 -fno-省略帧指针 by
使用以下命令配置 GCC --启用帧指针 配置选项。
在级别启用 -O, -氧气, -氧气, -你.
-foptimize-sibling-calls
优化兄弟和尾递归调用。
在级别启用 -氧气, -氧气, -你.
-fno-内联
除了标有“always_inline”的函数外,不要内联扩展任何函数
属性。 这是未优化时的默认设置。
单个函数可以通过用“noinline”标记来免于内联
属性。
-finline-小功能
当他们的身体比预期的要小时,将功能集成到他们的调用者中
函数调用代码(因此程序的整体大小变小)。 编译器
启发式地决定哪些函数足够简单值得集成
这边走。 此内联适用于所有函数,甚至那些未声明为内联的函数。
在级别启用 -氧气.
-findirect-内联
由于以下原因,在编译时发现已知的内联也间接调用
之前的内联。 此选项仅在启用内联本身时有效
由 -finline-函数 or -finline-小功能 选项。
在级别启用 -氧气.
-finline-函数
考虑所有用于内联的函数,即使它们没有被声明为内联。 这
编译器启发式地决定哪些函数值得以这种方式集成。
如果对给定函数的所有调用都被集成,并且函数被声明
“静态”,则该函数本身通常不会作为汇编代码输出。
在级别启用 -氧气.
-finline 函数调用一次
考虑所有调用一次的“静态”函数以内联到它们的调用者中,即使
它们没有标记为“内联”。 如果集成了对给定函数的调用,则
函数本身不作为汇编代码输出。
在级别启用 -氧气, -氧气, -氧气 和 -你.
- 害怕内联
标记为“always_inline”的内联函数和函数体看起来小于
在做之前的函数调用开销 -fprofile-生成 仪器仪表和
真正的内联传递。 这样做可以显着降低分析成本,并且通常
在具有大量嵌套包装函数链的程序上更快地内联。
默认启用。
-fipa-sra
执行聚合的过程间标量替换,删除未使用的参数
并用按值传递的参数替换按引用传递的参数。
在级别启用 -氧气, -氧气 和 -你.
-finline-限制=n
默认情况下,GCC 限制可以内联的函数的大小。 这个标志允许
粗略控制这个限制。 n 是可以内联的函数的大小
伪指令的数量。
内联实际上是由许多参数控制的,这些参数可以指定
单独使用 --参数 姓名=折扣值。 该 -finline-限制=n 选项设置了一些
这些参数如下:
最大内联-insns-单
被设置为 n/ 2。
最大内联-insns-自动
被设置为 n/ 2。
有关控制内联和的各个参数的文档,请参见下文
对于这些参数的默认值。
请注意: 可能没有价值 -finline-限制 这会导致默认行为。
请注意: 在这个特定的上下文中,伪指令表示一个抽象的
函数大小的测量。 它绝不代表装配计数
说明,因此其确切含义可能会从一个版本更改为
另一个。
-fno-保持内联-dllexport
这是一个更细粒度的版本 -fkeep-内联函数,仅适用于
使用“dllexport”属性或 declspec 声明的函数
-fkeep-内联函数
在 C 中,发出声明为“内联”到目标文件中的“静态”函数,即使
该函数已内联到其所有调用者中。 这个开关不影响
使用 GNU C90 中的“extern inline”扩展的函数。 在 C++ 中,发出任何和所有
内联函数到目标文件中。
-fkeep-静态常量
当优化没有打开时,发出声明为“static const”的变量,即使
未引用变量。
GCC 默认启用此选项。 如果你想强制编译器检查一个
变量被引用,无论是否开启优化,使用
此 -fno-保持静态常量 选项。
-fmerge-常量
尝试合并相同的常量(字符串常量和浮点常量)
跨编译单元。
如果汇编器和链接器
支持它。 用 -fno-合并常量 来抑制这种行为。
在级别启用 -O, -氧气, -氧气, -你.
-fmerge-all-常量
尝试合并相同的常量和相同的变量。
这个选项意味着 -fmerge-常量。 此外 -fmerge-常量 Free Introduction
考虑例如常量初始化数组或初始化常量变量
整数或浮点类型。 像 C 或 C++ 这样的语言需要每个变量,
在递归调用中包含同一变量的多个实例,以具有不同的
位置,因此使用此选项会导致不一致的行为。
-f模调度
在第一次调度通过之前立即执行摆动模调度。 这个
pass 查看最内层的循环并通过重叠不同的循环来重新排序它们的指令
迭代。
-fmodulo-sched-allow-regmoves
在允许寄存器移动的情况下执行更积极的基于 SMS 的模调度。 经过
设置此标志会删除某些反依赖边,这会触发
基于寿命范围分析生成reg-moves。 这个选项有效
只有 -f模调度 启用。
-fno-分支计数-reg
不要在计数寄存器上使用“递减和分支”指令,而是
生成递减寄存器的指令序列,将其与
零,然后根据结果进行分支。 此选项仅对
支持此类指令的架构,包括 x86、PowerPC、IA-64 和
S/390。
默认是 -fbranch-count-reg.
-fno-函数-cse
不要把函数地址放在寄存器中; 使每条指令调用
常量函数明确包含函数的地址。
此选项导致代码效率较低,但一些奇怪的技巧会改变
汇编器输出可能会被此选项时执行的优化混淆
未使用。
默认是 -f函数-cse
-fno-零初始化-in-bss
如果目标支持 BSS 部分,默认情况下 GCC 放置的变量是
在 BSS 中初始化为零。 这可以节省结果代码中的空间。
此选项关闭此行为,因为某些程序显式依赖变量
转到数据部分---例如,以便生成的可执行文件可以找到
该部分的开头和/或基于此做出假设。
默认是 -fzero-在 bss 中初始化.
-fmudflap -fmudflapth -fmudflair
对于支持它的前端(C 和 C++),检测所有有风险的指针/数组
解引用操作、一些标准库字符串/堆函数和一些其他
与范围/有效性测试相关的结构。 如此检测的模块应该是
不受缓冲区溢出、无效堆使用和其他一些 C/C++ 类的影响
编程错误。 检测依赖于单独的运行时库
(libmudflap),它被链接到一个程序中,如果 -fmudflap 在链接时给出。 跑-
仪表程序的时间行为由 MUDFLAP_OPTIONS
环境变量。 有关其选项,请参阅“env MUDFLAP_OPTIONS=-help a.out”。
使用 -fmudflapth 而不是 -fmudflap 编译和链接,如果你的程序是多
螺纹。 用 -fmudflair, 此外 -fmudflap or -fmudflapth如果
检测应该忽略指针读取。 这会产生更少的仪器(和
因此执行速度更快)并且仍然提供一些针对完全内存的保护
破坏写入,但允许错误读取的数据在程序内传播。
-fthread-跳转
执行优化以检查跳转是否分支到另一个位置
找到第一个包含的比较。 如果是这样,第一个分支将被重定向到
第二个分支的目的地或紧随其后的点,
取决于条件是否已知为真或假。
在级别启用 -氧气, -氧气, -你.
-fsplit-wide-类型
当使用占用多个寄存器的类型时,例如 32 位上的“long long”
系统,将寄存器分开并独立分配。 这通常
为这些类型生成更好的代码,但可能会使调试更加困难。
在级别启用 -O, -氧气, -氧气, -你.
-fcse 跟随跳跃
在公共子表达式消除 (CSE) 中,扫描跳转指令时
跳跃的目标没有被任何其他路径到达。 例如,当 CSE 遇到
带有“else”子句的“if”语句,当条件满足时,CSE跟随跳转
测试是假的。
在级别启用 -氧气, -氧气, -你.
-fcse-跳过块
这与之类似 -fcse 跟随跳跃, 但导致 CSE 跟随跳跃
有条件地跳过块。 当 CSE 遇到一个简单的“if”语句时没有
其他条款, -fcse-跳过块 导致 CSE 跟随围绕身体的跳跃
“如果”。
在级别启用 -氧气, -氧气, -你.
-frerun-cse-循环后
执行循环优化后重新运行公共子表达式消除。
在级别启用 -氧气, -氧气, -你.
-fgcse
执行全局公共子表达式消除传递。 这个pass也执行
全局常量和复制传播。
请注意: 当使用计算的 gotos(一个 GCC 扩展)编译程序时,你可能会得到
如果禁用全局公共子表达式消除,则运行时性能会更好
通过添加 -fno-GCSE 到命令行。
在级别启用 -氧气, -氧气, -你.
-fgcse-lm
什么时候 -fgcse-lm 启用,全局公共子表达式消除尝试移动
仅由商店杀死的负载。 这允许包含一个循环
加载/存储序列要更改为循环外的加载,以及循环内的复制/存储
循环。
默认情况下启用时 -fgcse 启用。
-fgcse-sm
什么时候 -fgcse-sm 已启用,在全局通用后运行商店运动传递
子表达式消除。 此传递尝试将商店移出循环。 使用时
和这个结合 -fgcse-lm, 包含加载/存储序列的循环可以更改
到循环之前的加载和循环之后的存储。
未在任何优化级别启用。
-fgcse-las
什么时候 -fgcse-las 启用,全局公共子表达式消除通过
消除了存储到同一内存位置后的冗余负载(两者都
部分和完全冗余)。
未在任何优化级别启用。
-fgcse-重新加载后
什么时候 -fgcse-重新加载后 启用,执行冗余负载消除传递
重新加载后。 此pass的目的是清理多余的溢出。
-fagressive-loop-optimizations
此选项告诉循环优化器使用语言约束为
循环的迭代次数。 这假设循环代码不会调用
未定义的行为,例如导致有符号整数溢出或越界
数组访问。 循环迭代次数的界限用于指导
循环展开和剥离以及循环退出测试优化。 此选项已启用
默认情况下。
-funsafe 循环优化
此选项告诉循环优化器假设循环索引不会溢出,并且
具有非平凡退出条件的循环不是无限的。 这使得更广泛的
循环优化的范围,即使循环优化器本身无法证明这些
假设是有效的。 如果你使用 -Wunsafe 循环优化, 编译器警告你
如果它发现这种循环。
-f越野跳跃
执行交叉跳转变换。 这种转换统一了等效代码和
节省代码大小。 生成的代码可能会也可能不会比没有交叉的表现更好
跳跃。
在级别启用 -氧气, -氧气, -你.
-fauto-inc-dec
将地址的递增或递减与内存访问结合起来。 这个通行证是
总是跳过没有指令来支持这一点的架构。
默认情况下启用 -O 在支持这一点的架构上更高。
-fdce
在 RTL 上执行死代码消除 (DCE)。 默认情况下启用 -O 更高。
-fdse
在 RTL 上执行死存储消除 (DSE)。 默认情况下启用 -O 更高。
-fif-转换
尝试将条件跳转转换为无分支的等价跳转。 这包括
使用条件移动、最小值、最大值、设置标志和 abs 指令,以及一些技巧
可以通过标准算术实现。 在芯片上使用条件执行
可用由“if-conversion2”控制。
在级别启用 -O, -氧气, -氧气, -你.
-fif-转换2
使用条件执行(如果可用)将条件跳转转换为
无分支的等价物。
在级别启用 -O, -氧气, -氧气, -你.
-fdelete-空指针检查
假设程序不能安全地取消引用空指针,并且没有代码或数据
元素驻留在那里。 这可以实现简单的常量折叠优化
优化级别。 此外,GCC 中的其他优化通道使用此标志来
控制全局数据流分析,消除对空指针的无用检查;
这些假设如果一个指针在它已经被取消引用后被检查,它
不能为空。
但是请注意,在某些环境中,此假设不正确。 用
-fno-删除空指针检查 为依赖的程序禁用此优化
在这种行为上。
某些目标,尤其是嵌入式目标,会在所有级别禁用此选项。 除此以外
它在所有级别都启用: -氧气, -氧气, -氧气, -氧气, -你. 使用信息的通行证
在不同的优化级别独立启用。
-f去虚拟化
尝试将对虚函数的调用转换为直接调用。 这两个都完成
作为间接内联的一部分在一个过程内和过程间
(“-findirect-inlining”)和过程间常量传播(-fipa-cp)。 启用
在水平上 -氧气, -氧气, -你.
- 昂贵的优化
执行一些相对昂贵的次要优化。
在级别启用 -氧气, -氧气, -你.
- 自由
尝试删除多余的扩展指令。 这对以下方面特别有帮助
x86-64 架构,它在 64 位寄存器中隐式零扩展
写入他们的低 32 位一半。
在级别为 x86 启用 -氧气, -氧气.
-f 优化注册移动
-fregmove
尝试在移动指令中重新分配寄存器编号并作为其他操作数
简单的指令,以最大限度地增加寄存器绑定的数量。 这是
在具有两个操作数指令的机器上特别有用。
备注 -fregmove 和 -f 优化注册移动 都是一样的优化。
在级别启用 -氧气, -氧气, -你.
-fira-算法=算法
对集成寄存器分配器使用指定的着色算法。 这
算法 论证可以是 优先, 指定 Chow 的优先着色,或 CB,
它指定 Chaitin-Briggs 着色。 未实施 Chaitin-Briggs 着色
对于所有架构,但对于那些支持它的目标,它是默认的
因为它生成了更好的代码。
-fira区域=地区
为集成寄存器分配器使用指定的区域。 这 地区 论点
应该是以下之一:
所有 使用所有循环作为寄存器分配区域。 这可以提供最好的结果
具有小和/或不规则寄存器组的机器。
杂
使用除寄存器压力较小的循环之外的所有循环作为区域。 这个
value 通常在大多数情况下和大多数架构中给出最好的结果,并且
编译时默认启用速度优化(-O, -氧气,...)。
一种 将所有功能用作单个区域。 这通常导致最小的代码
大小,默认情况下启用 -你 or -氧气.
-fira-提升机压力
使用 IRA 评估代码提升传递中的寄存器压力,以决定提升
表达式。 此选项通常会产生较小的代码,但会减慢
编译器下来。
此选项在级别启用 -你 对于所有目标。
-fira-loop-压力
使用 IRA 评估循环中的寄存器压力,以决定移动循环不变量。
此选项通常会在具有以下功能的机器上生成更快更小的代码
大寄存器文件(>= 32 个寄存器),但它会减慢编译器的速度。
此选项在级别启用 -氧气 对于某些目标。
-fno-ira-共享保存槽
禁用用于保存调用使用的硬寄存器的堆栈槽共享
一个电话。 每个硬寄存器都有一个单独的堆栈槽,因此函数堆栈
框架更大。
-fno-ira-共享溢出槽
禁用为伪寄存器分配的堆栈槽共享。 每个伪寄存器
没有得到硬寄存器的会得到一个单独的堆栈槽,因此函数
堆栈帧更大。
-fira-详细=n
控制集成寄存器分配器的转储文件的详细程度。 这
默认值为 5。如果值 n 大于或等于 10,发送转储输出
到标准错误使用相同的格式 n 负 10。
-fdelayed-分支
如果目标机器支持,尝试重新排序指令以利用
延迟分支指令后可用的指令槽。
在级别启用 -O, -氧气, -氧气, -你.
-fschedule-insns
如果目标机器支持,尝试重新排序指令以消除
由于所需数据不可用而导致执行停止。 这有助于机器
通过允许其他指令执行慢速浮点或内存加载指令
直到需要加载或浮点指令的结果。
在级别启用 -氧气, -氧气.
-fschedule-insns2
像 -fschedule-insns, 但请求额外的指令调度传递
寄存器分配完成后。 这在具有
寄存器数量相对较少,并且内存加载指令占用的时间超过
一个周期。
在级别启用 -氧气, -氧气, -你.
-fno-调度块间
不要跨基本块安排指令。 这通常默认启用
在寄存器分配之前调度时,即 -fschedule-insns 或 -氧气 or
更高。
-fno-计划规范
不允许非加载指令的推测性运动。 这通常由
在寄存器分配之前调度时的默认值,即 -fschedule-insns 或
-氧气 或更高。
-fsched-压力
在寄存器分配之前启用寄存器压敏insn调度。 这个
仅在启用寄存器分配之前进行调度时才有意义,即
-fschedule-insns 或 -氧气 或更高。 使用此选项可以改善生成的
代码并通过防止寄存器压力增加到数字以上来减小其大小
可用硬寄存器的数量和随后的寄存器分配溢出。
-fsched-spec-负载
允许某些加载指令的推测运动。 这只有在
在寄存器分配之前调度,即 -fschedule-insns 或 -氧气 或更高。
-fsched-spec-负载危险
允许更多加载指令的推测运动。 这只有在
在寄存器分配之前调度,即 -fschedule-insns 或 -氧气 或更高。
-fsched-stalled-insns
-fsched-stalled-insns=n
定义可以从停顿的队列中提前移动多少个insn(如果有)
在第二次调度过程中插入就绪列表。 -fno-sched-stalled-insns
意味着没有过早移动insn, -fsched-stalled-insns=0 意味着没有
限制可以提前移动多少排队的insn。 -fsched-stalled-insns
没有值相当于 -fsched-stalled-insns=1.
-fsched-stalled-insns-dep
-fsched-stalled-insns-dep=n
定义检查多少个 insn 组(周期)以确定对停止的 insn 的依赖
那是过早从停滞的insns队列中移除的候选者。 这有
仅在第二次调度传递期间有效,并且仅当 -fsched-stalled-insns is
用过的。 -fno-sched-stalled-insns-dep 相当于 -fsched-stalled-insns-dep=0.
-fsched-stalled-insns-dep 没有值相当于
-fsched-stalled-insns-dep=1.
-fsched2-使用超级块
寄存器分配后调度时,使用超级块调度。 这允许
跨越基本块边界的运动,从而加快进度。 这个选项是
实验性的,因为并非 GCC 使用的所有机器描述都足够接近地模拟 CPU
避免算法产生不可靠的结果。
这仅在寄存器分配后调度时才有意义,即
-fschedule-insns2 或 -氧气 或更高。
-fsched-group-启发式
在调度程序中启用组启发式。 这种启发式有利于指令
属于一个调度组。 这在调度时默认启用
启用,即 -fschedule-insns or -fschedule-insns2 或 -氧气 或更高。
-fsched-关键路径启发式
在调度程序中启用关键路径启发式。 这种启发式的好处
关键路径上的说明。 这在调度时默认启用
启用,即 -fschedule-insns or -fschedule-insns2 或 -氧气 或更高。
-fsched-spec-insn-启发式
在调度程序中启用推测指令启发式。 这种启发式的好处
具有更大依赖性弱点的推测性指令。 这是默认启用的
启用调度时,即 -fschedule-insns or -fschedule-insns2 或 -氧气
或更高。
-fsched-rank-启发式
在调度程序中启用排名启发式。 这种启发式有利于指令
属于具有更大尺寸或频率的基本块。 这是默认启用的
启用调度时,即 -fschedule-insns or -fschedule-insns2 或 -氧气
或更高。
-fsched-last-insn-启发式
在调度程序中启用最后一条指令启发式。 这种启发式有利于
较少依赖调度的最后一条指令的指令。 这是启用的
默认情况下启用调度时,即 -fschedule-insns or -fschedule-insns2
或 -氧气 或更高。
-fsched-dep-count-启发式
在调度程序中启用依赖计数启发式。 这种启发式有利于
指令有更多的指令取决于它。 这是默认启用的
启用调度时,即 -fschedule-insns or -fschedule-insns2 或 -氧气
或更高。
-freschedule模调度循环
在传统调度之前执行模调度。 如果一个循环是模
排,较晚的排程可能会更改其排程。 使用此选项可
控制这种行为。
-f 选择性调度
使用选择性调度算法调度指令。 选择性调度运行
而不是第一次调度程序传递。
-f选择性调度2
使用选择性调度算法调度指令。 选择性调度运行
而不是第二次调度程序传递。
-fsel-sched-流水线
在选择性调度期间启用最内层循环的软件流水线。 这个
选项无效,除非其中之一 -f 选择性调度 or -f选择性调度2
打开了。
-fsel-sched-pipelined-outer-loops
在选择性调度期间流水线循环时,也要流水线外循环。 这个
选项无效,除非 -fsel-sched-流水线 打开了。
-f收缩包装
仅在需要它的函数部分之前发出函数序言,而不是在
函数的顶部。 此标志在默认情况下启用 -O 更高。
-fcaller-保存
允许将值分配给被函数调用破坏的寄存器,通过
发出额外的指令来保存和恢复这些调用周围的寄存器。 这样的
分配仅在它似乎导致更好的代码时进行。
默认情况下,此选项在某些机器上始终处于启用状态,通常是那些具有
没有可使用的调用保留寄存器。
在级别启用 -氧气, -氧气, -你.
-f组合堆栈调整
跟踪堆栈调整(推送和弹出)和堆栈内存引用,然后尝试
想办法把它们结合起来。
默认情况下启用 -氧气 更高。
-fconserve 堆栈
尝试最小化堆栈使用。 编译器尝试使用更少的堆栈空间,即使
如果这会使程序变慢。 此选项意味着设置 大栈帧
参数为 100 和 大堆栈帧增长 参数为 400。
-ftree-重新关联
对树执行重新关联。 此标志在默认情况下启用 -O 更高。
-ftree-pre
对树执行部分冗余消除 (PRE)。 此标志由启用
默认在 -氧气 和 -氧气.
-ftree-部分预
使部分冗余消除 (PRE) 更具侵略性。 此标志由启用
默认在 -氧气.
-ftree-forwprop
在树上执行前向传播。 此标志在默认情况下启用 -O 和
更高。
-ftree-fre
对树执行完全冗余消除 (FRE)。 FRE 和 FRE 的区别
PRE 是 FRE 只考虑在所有路径上计算的表达式
冗余计算。 这种分析比 PRE 更快,但它暴露的更少
冗余。 此标志在默认情况下启用 -O 更高。
-ftree-phiprop
从树上的条件指针执行负载提升。 此通行证由
默认在 -O 更高。
-fhoist-相邻负载
如果负载来自 if-then-else 的两个分支,则推测性地提升负载
同一结构中的相邻位置和目标架构具有条件
移动指令。 此标志在默认情况下启用 -氧气 更高。
-ftree-复制-prop
在树上执行复制传播。 此过程消除了不必要的复制操作。
此标志在默认情况下启用 -O 更高。
-fipa-纯常量
发现哪些函数是纯函数或常数函数。 默认情况下启用 -O 更高。
-fipa 参考
发现哪些静态变量不会转义编译单元。 启用者
默认在 -O 更高。
-fipa-pta
执行过程间指针分析和过程间修改以及
参考分析。 此选项可能会导致过多的内存和编译时使用
大型编译单元。 默认情况下,它在任何优化级别都未启用。
-fipa 配置文件
执行过程间配置文件传播。 仅从冷调用的函数
功能被标记为冷。 也执行一次的功能(例如“冷”,
“noreturn”,静态构造函数或析构函数)被标识。 冷函数和
循环执行一次的函数的较少部分然后针对大小进行优化。 启用者
默认在 -O 更高。
-fipa-cp
执行过程间常量传播。 此优化分析程序
确定传递给函数的值何时是常量,然后进行优化
因此。 这种优化可以显着提高性能,如果
应用程序将常量传递给函数。 此标志在默认情况下启用
-氧气, -你 和 -氧气.
-fipa-cp-克隆
执行函数克隆以使过程间常量传播更强。 什么时候
启用,过程间常量传播在以下情况下执行函数克隆
可以使用常量参数调用外部可见函数。 因为这
优化可以创建函数的多个副本,它可能会显着增加
代码大小(见 --参数 ipcp-单位-增长=折扣值)。 此标志在默认情况下启用
-氧气.
-ftree-水槽
在树上执行向前存储运动。 此标志在默认情况下启用 -O 和
更高。
-ftree-位-ccp
在树上执行稀疏条件位常数传播并传播指针
对齐信息。 此传递仅对局部标量变量进行操作,并且是
默认情况下启用 -O 和更高。 它要求 -ftree-ccp 启用。
-ftree-ccp
在树上执行稀疏条件常数传播 (CCP)。 仅此通行证
对局部标量变量进行操作,默认情况下在 -O 更高。
-ftree-switch 转换
将 switch 中的简单初始化转换为从 a 的初始化
标量数组。 此标志在默认情况下启用 -氧气 更高。
-ftree尾合并
寻找相同的代码序列。 找到后,用跳转到另一个替换一个。
这种优化被称为尾部合并或交叉跳跃。 此标志由启用
默认在 -氧气 和更高。 可以使用以下方法限制此传递中的编译时间
最大尾合并比较 参数和 最大尾合并迭代 参数。
-ftree-dce
对树执行死代码消除 (DCE)。 此标志在默认情况下启用 -O
更高。
-ftree-内置调用-dce
对内置函数的调用执行有条件的死代码消除 (DCE)
可以设置“errno”,但没有副作用。 默认情况下启用此标志
at -氧气 并且更高,如果 -你 也没有指定。
-ftree-支配-选择
执行各种简单的标量清理(常量/复制传播、冗余
消除、范围传播和表达式简化)基于支配者
树遍历。 这也执行跳转线程(以减少跳转)。 这个
标志在默认情况下启用 -O 更高。
-ftree-dse
在树上执行死商店消除 (DSE)。 死存储是存储到内存中
稍后被另一家商店覆盖而无需任何干预加载的位置。 在
在这种情况下,可以删除较早的商店。 此标志在默认情况下启用 -O 和
更高。
-ftree-ch
在树上执行循环头复制。 这是有益的,因为它增加了
代码运动优化的有效性。 它还可以节省一跳。 这个标志是
默认情况下启用 -O 和更高。 它没有启用 -你, 因为它通常
增加代码大小。
-ftree-循环优化
对树执行循环优化。 此标志在默认情况下启用 -O 和
更高。
-ftree-循环-线性
在树上执行循环交换转换。 与...一样 -floop-交换。 使用
这个代码转换,GCC必须配置 --with-ppl 和 --with-clog 至
启用 Graphite 循环转换基础设施。
-floop-交换
对循环执行循环交换转换。 交换两个嵌套循环
切换内循环和外循环。 例如,给定一个循环,如:
做 J = 1, M
我是否 = 1, N
A(J, I) = A(J, I) * C
恩多
恩多
循环交换转换循环,就像它被写成一样:
我是否 = 1, N
做 J = 1, M
A(J, I) = A(J, I) * C
恩多
恩多
当“N”大于缓存时,这可能是有益的,因为在 Fortran 中,
数组的元素按列连续存储在内存中,原始
循环遍历行,可能会在每次访问时创建缓存未命中。 这个
优化适用于 GCC 支持的所有语言,不限于
复式。 要使用此代码转换,必须配置 GCC --with-ppl
和 --with-clog 启用 Graphite 循环转换基础设施。
-floop-strip-mine
对循环执行循环带挖掘转换。 条带挖掘将循环拆分为
两个嵌套循环。 外循环的步幅等于条带大小和内循环的步幅
循环在条带内具有原始循环的步幅。 条带长度可以改变
使用 循环块大小 范围。 例如,给定一个循环,如:
我是否 = 1, N
A(我) = A(我) + C
恩多
循环带挖掘转换循环,就像它被写入一样:
DO II = 1, N, 51
DO I = II,分钟(II + 50,N)
A(我) = A(我) + C
恩多
恩多
此优化适用于 GCC 支持的所有语言,不限于
复式。 要使用此代码转换,必须配置 GCC --with-ppl
和 --with-clog 启用 Graphite 循环转换基础设施。
-floop块
对循环执行循环阻塞转换。 阻塞带在每个循环中挖掘
循环嵌套,以便元素循环的内存访问适合缓存。 这
条带长度可以使用 循环块大小 范围。 例如,
给定一个循环,如:
我是否 = 1, N
做 J = 1, M
A(J, I) = B(I) + C(J)
恩多
恩多
循环阻塞转换循环,就像它被写成一样:
DO II = 1, N, 51
做 JJ = 1, M, 51
DO I = II,分钟(II + 50,N)
溶解氧 J = JJ, 最小值 (JJ + 50, M)
A(J, I) = B(I) + C(J)
恩多
恩多
恩多
恩多
当“M”大于缓存时,这可能是有益的,因为最内层的循环
迭代可以保存在缓存中的少量数据。 这个
优化适用于 GCC 支持的所有语言,不限于
复式。 要使用此代码转换,必须配置 GCC --with-ppl
和 --with-clog 启用 Graphite 循环转换基础设施。
-f石墨身份
启用石墨的身份转换。 对于每个 SCoP,我们生成
多面体表示并将其转换回 gimple。 使用 -f石墨身份
我们可以检查 GIMPLE -> GRAPHITE -> GIMPLE 转换的成本或收益。
一些最小的优化也由代码生成器 CLoG 执行,如索引
循环中的拆分和死代码消除。
-floop-nest-优化
启用基于 ISL 的循环嵌套优化器。 这是一个基于通用循环嵌套优化器
关于 Pluto 优化算法。 它计算优化的循环结构
数据局部性和并行性。 此选项是实验性的。
-floop-全部并行化
使用 Graphite 数据依赖性分析来识别可以并行化的循环。
并行化所有可以分析的循环,使其不包含循环携带的依赖项
无需检查并行化循环是否有利可图。
-fcheck-数据-deps
比较几个数据依赖分析器的结果。 该选项用于
调试数据依赖分析器。
-ftree-loop-if 转换
尝试将最内层循环中的条件跳转转换为无分支
等价物。 目的是按顺序从最内层循环中删除控制流
提高矢量化过程处理这些循环的能力。 这是
如果启用矢量化,则默认启用。
-ftree-loop-if-convert-stores
尝试还包含内存写入的 if-convert 条件跳转。 这个
转换对于多线程程序来说可能是不安全的,因为它转换条件
内存写入到无条件内存写入。 例如,
for (i = 0; i < N; i++)
如果(条件)
A[i] = 表达式;
转化为
for (i = 0; i < N; i++)
A[i] = 条件? 表达式:A[i];
可能会产生数据竞争。
-ftree-循环分布
执行循环分发。 这个标志可以提高大循环体的缓存性能
并允许进一步的循环优化,如并行化或矢量化,采取
地方。 例如,循环
我是否 = 1, N
A(我) = B(我) + C
D(我) = E(我) * F
恩多
转化为
我是否 = 1, N
A(我) = B(我) + C
恩多
我是否 = 1, N
D(我) = E(我) * F
恩多
-ftree-循环分布模式
执行可以通过调用生成的代码的模式的循环分布
图书馆。 此标志在默认情况下启用 -氧气.
此传递分发初始化循环并生成对 memset 零的调用。
例如,循环
我是否 = 1, N
A(我)= 0
B(我) = A(我) + 我
恩多
转化为
我是否 = 1, N
A(我)= 0
恩多
我是否 = 1, N
B(我) = A(我) + 我
恩多
并且初始化循环被转换为对 memset 零的调用。
-ftree-循环-im
在树上执行循环不变运动。 这个pass只移动困难的不变量
在 RTL 级别处理(函数调用、扩展到非平凡序列的操作)
的insn)。 和 -funswitch循环 它还移动条件的操作数
循环外的不变性,因此我们可以在
循环取消切换。 通行证还包括商店动议。
-Ftree-Loop-Ivcanon
为循环中的迭代次数创建一个规范计数器,以确定
迭代次数需要复杂的分析。 以后的优化可能
轻松确定数量。 特别适用于展开。
-fivots
执行归纳变量优化(强度降低、归纳变量
合并和归纳变量消除)在树上。
-ftree-并行化-循环=n
并行化循环,即拆分它们的迭代空间以在 n 个线程中运行。 这是
仅适用于迭代独立且可任意的循环
重新排序。 优化仅在多处理器机器上有利可图,for 循环
那些是 CPU 密集型的,而不是受内存带宽等限制。 这个选项
暗示 -p线程,因此仅支持支持
-p线程.
-ftree-pta
对树执行函数局部点分析。 默认情况下启用此标志
at -O 更高。
-ftree-sra
执行聚合的标量替换。 此传递替换结构引用
使用标量防止过早将结构提交到内存中。 这个标志是
默认情况下启用 -O 更高。
-ftree-copyrename
在树上执行副本重命名。 此传递尝试将编译器临时文件重命名为
复制位置的其他变量,通常会导致变量名更多
与原始变量非常相似。 此标志在默认情况下启用 -O 和
更高。
-ftree-coalesce-inlined-vars
告诉 copyrename pass(见 -ftree-copyrename) 尝试结合小用户-
也定义了变量,但前提是它们是从其他函数内联的。 它是一个
更有限的形式 -ftree-合并变量. 这可能会损害此类的调试信息
内联变量,但它会将内联函数的变量与
彼此,这样他们更有可能在一个
调试会话。 这是 4.7 之前的 GCC 版本中的默认设置。
-ftree-合并变量
告诉 copyrename pass(见 -ftree-copyrename) 尝试结合小用户-
也定义了变量,而不仅仅是编译器临时变量。 这可能会严重限制
调试优化程序的能力 -fno-var-跟踪分配.
在否定形式中,此标志可防止 SSA 合并用户变量,包括
内联的。 默认情况下启用此选项。
-树三
在 SSA-> 正常阶段执行临时表达式替换。 单身的
use/single def 临时文件在它们的使用位置被替换为它们的定义
表达。 这会导致非 GIMPLE 代码,但为扩展器提供了更多
处理复杂的树,从而产生更好的 RTL。 这是由
默认在 -O 更高。
-ftree-slsr
对树木进行直线强度降低。 这承认相关
涉及乘法的表达式并用更便宜的计算替换它们
如果可能。 这在默认情况下启用 -O 更高。
-ftree-矢量化
在树上执行循环向量化。 此标志在默认情况下启用 -氧气.
-ftree-slp-矢量化
在树上执行基本块矢量化。 此标志在默认情况下启用 -氧气 和
,尤其是 -ftree-矢量化 启用。
-ftree-vect-循环版本
在树上进行循环矢量化时执行循环版本控制。 当循环出现时
可矢量化,除非无法确定数据对齐或数据相关性
在编译时,然后生成循环的矢量化和非矢量化版本
以及运行时检查对齐或依赖以控制哪个版本
执行。 默认情况下启用此选项,但级别除外 -你 它被禁用的地方。
-fvect-成本模型
启用矢量化的成本模型。 此选项在默认情况下启用 -氧气.
-ftree-vrp
在树上执行值范围传播。 这类似于常量传播
通过,但不是值,而是传播值的范围。 这允许
优化器删除不必要的范围检查,如数组边界检查和空指针
检查。 这在默认情况下启用 -氧气 和更高。 空指针检查消除
仅当 -fdelete-空指针检查 启用。
-跟踪器
执行尾部复制以扩大超级块大小。 这种转变简化了
函数的控制流允许其他优化做得更好。
- 有趣的循环
展开循环,其迭代次数可以在编译时或之后确定
进入循环。 - 有趣的循环 暗示 -frerun-cse-循环后. 此选项使
代码更大,可能会也可能不会让它运行得更快。
-funroll-所有循环
展开所有循环,即使循环执行时它们的迭代次数不确定
进入。 这通常会使程序运行得更慢。 -funroll-所有循环 暗示
相同的选项 - 有趣的循环,
-fsplit-ivs-in-unroller
在后面的迭代中启用归纳变量的值的表达
使用第一次迭代中的值展开循环。 这打破了长期依赖
链,从而提高调度通道的效率。
的组合 -fweb 和 CSE 通常足以获得相同的效果。
但是,在循环体比循环体更复杂的情况下,这是不可靠的
单个基本块。 由于某些架构,它也根本不起作用
CSE 通行证中的限制。
默认情况下启用此优化。
-f 展开器中的变量扩展
使用此选项,编译器会在以下情况下创建某些局部变量的多个副本
展开一个循环,这可以产生更好的代码。
-f 部分内联
函数的内联部分。 此选项仅在内联本身为
由 -finline-函数 or -finline-小功能 选项。
在级别启用 -氧气.
-f预测共同点
执行预测性公共优化,即重用计算(尤其是
内存加载和存储)在之前的循环迭代中执行。
此选项在级别启用 -氧气.
-fprefetch 循环数组
如果目标机器支持,生成指令预取内存到
提高访问大型数组的循环的性能。
这个选项可能会生成更好或更坏的代码; 结果高度依赖于
源代码中的循环结构。
级别禁用 -你.
-fno-窥视孔
-fno-窥视孔2
禁用任何特定于机器的窥视孔优化。 和...之间的不同
-fno-窥视孔 和 -fno-窥视孔2 在于它们在编译器中的实现方式; 一些
目标使用一种,一些使用另一种,少数使用两者。
-f窥视孔 默认情况下启用。 -f窥孔2 在级别启用 -氧气, -氧气, -你.
-fno-guess-分支概率
不要使用启发式方法猜测分支概率。
GCC 使用启发式方法来猜测分支概率,如果它们不是由
分析反馈(-f轮廓弧)。 这些启发式基于控制流
图形。 如果某些分支概率由 __builtin_expect,则
启发式用于猜测其余控制流的分支概率
图,取 __builtin_expect 信息考虑在内。 之间的相互作用
启发式和 __builtin_expect 可能很复杂,在某些情况下,它可能很有用
禁用启发式,以便 __builtin_expect 更容易
理解。
默认是 -fguess 分支概率 在水平上 -O, -氧气, -氧气, -你.
-freorder块
重新排序已编译函数中的基本块以减少采用的数量
分支并提高代码局部性。
在级别启用 -氧气, -氧气.
-freorder-块和分区
除了对编译函数中的基本块进行重新排序之外,为了减少
采取的分支数量,将冷热基本块划分为单独的部分
程序集和 .o 文件,以提高分页和缓存局部性性能。
这种优化在存在异常处理的情况下会自动关闭,
对于 linkonce 节、具有用户定义的节属性的函数以及任何
不支持命名节的体系结构。
-freorder 函数
重新排序目标文件中的函数以提高代码局部性。 这是
通过使用最常执行的特殊小节“.text.hot”来实现
函数和“.text.unlikely”用于不太可能执行的函数。 重新排序由
链接器因此目标文件格式必须支持命名节并且链接器必须放置
他们以合理的方式。
此外,必须提供配置文件反馈才能使此选项有效。 看
-f轮廓弧 了解详情。
在级别启用 -氧气, -氧气, -你.
-fstrict-别名
允许编译器采用适用于该语言的最严格的别名规则
正在编译。 对于 C(和 C++),这会根据类型激活优化
表达式。 特别是,假设一种类型的对象永远不会驻留在
相同地址作为不同类型的对象,除非类型几乎相同。
例如,“unsigned int”可以作为“int”的别名,但不能作为“void*”或“double”的别名。 一种
字符类型可以作为任何其他类型的别名。
特别注意这样的代码:
联合 a_union {
int i;
双d;
};
诠释 f() {
联合 a_union t;
td = 3.0;
返回 ti;
}
从与最近的工会成员不同的工会成员处阅读的做法
写入(称为“类型双关”)很常见。 即使 -fstrict-别名, 类型-
如果通过联合类型访问内存,则允许双关语。 所以
上面的代码按预期工作。 但是,此代码可能不会:
诠释 f() {
联合 a_union t;
国际* ip;
td = 3.0;
ip = &t.i;
返回 *ip;
}
类似地,通过获取地址、转换结果指针和
取消引用结果具有未定义的行为,即使强制转换使用联合类型,
例如:
诠释 f() {
双 d = 3.0;
return ((union a_union *) &d)->i;
}
这款 -fstrict-别名 选项在级别启用 -氧气, -氧气, -你.
-fstrict-溢出
允许编译器根据语言采用严格的有符号溢出规则
正在编译。 对于 C(和 C++),这意味着在进行算术运算时会溢出
有符号数是未定义的,这意味着编译器可能会假设它没有
发生。 这允许进行各种优化。 例如,编译器假定
像“i + 10 > i”这样的表达式对于带符号的“i”总是成立的。 这个假设是
仅在未定义有符号溢出时有效,因为如果“i + 10”则表达式为假
使用二进制补码算法时溢出。 当此选项有效时,任何
尝试确定是否必须写入对有符号数溢出的操作
小心不要真正涉及溢出。
此选项还允许编译器采用严格的指针语义:给定一个
指向对象的指针,如果向该指针添加偏移量不会产生指针
对于同一个对象,添加是未定义的。 这允许编译器得出结论
对于指针“p”和无符号整数“u”,“p + u > p”始终为真。 这个
假设仅有效,因为指针环绕未定义,因为表达式是
如果“p + u”使用二进制补码算法溢出,则为 false。
另见 -fwrapv 选项。 使用 -fwrapv 意味着整数有符号溢出是
完全定义:它包装。 什么时候 -fwrapv 使用,没有区别
-fstrict-溢出 和 -fno-严格溢出 对于整数。 和 -fwrapv 某种类型
溢出是允许的。 例如,如果编译器在执行时发生溢出
常量的算术,溢出的值仍然可以用于 -fwrapv, 但不是
除此以外。
这款 -fstrict-溢出 选项在级别启用 -氧气, -氧气, -你.
-falign 函数
-falign 函数=n
将函数的开始对齐到下一个大于的 XNUMX 的幂 n, 跳到 n
字节。 例如, -falign 函数=32 将函数与下一个 32 字节对齐
边界,但 -falign 函数=24 仅在以下情况下对齐到下一个 32 字节边界
可以通过跳过 23 个字节或更少来完成。
-fno-align-函数 和 -falign 函数=1 是等价的,意味着函数
没有对齐。
某些汇编程序仅在以下情况下支持此标志 n 是二的幂; 在那种情况下,它是
四舍五入。
If n 未指定或为零,请使用与机器相关的默认值。
在级别启用 -氧气, -氧气.
-falign 标签
-falign 标签=n
将所有分支目标对齐到 XNUMX 的幂边界,向上跳至 n 字节之类的
-falign 函数. 这个选项很容易让代码变慢,因为它必须插入
在通常的代码流程中达到分支目标时的虚拟操作。
-fno-对齐标签 和 -falign 标签=1 是等价的,意味着标签不是
对齐。
If -falign 循环 or -falign 跳跃 适用且大于此值,则
而是使用它们的值。
If n 未指定或为零,使用与机器相关的默认值,这很可能
成为 1,表示没有对齐。
在级别启用 -氧气, -氧气.
-falign 循环
-falign循环=n
将循环对齐到 XNUMX 的幂边界,跳到 n 字节之类的 -falign 函数.
如果循环被执行多次,这将弥补虚拟机的任何执行
操作。
-fno-对齐循环 和 -falign循环=1 是等价的,意味着循环不是
对齐。
If n 未指定或为零,请使用与机器相关的默认值。
在级别启用 -氧气, -氧气.
-falign 跳跃
-falign 跳跃=n
将分支目标与 XNUMX 的幂边界对齐,对于分支目标
只能通过跳跃到达,跳到 n 字节之类的 -falign 函数。在
在这种情况下,不需要执行虚拟操作。
-fno-对齐-跳跃 和 -falign 跳跃=1 是等价的,意味着循环不是
对齐。
If n 未指定或为零,请使用与机器相关的默认值。
在级别启用 -氧气, -氧气.
-一次一次的乐趣
出于兼容性原因保留此选项。 -一次一次的乐趣 没有效果,而
-fno-unit-a-a-time 暗示 -fno-toplevel-重新排序 和 -fno-部分锚点.
默认启用。
-fno-toplevel-重新排序
不要对顶级函数、变量和“asm”语句重新排序。 输出它们
它们出现在输入文件中的顺序相同。 使用此选项时,
未引用的静态变量不会被删除。 此选项旨在支持
依赖于特定顺序的现有代码。 对于新代码,最好使用
属性。
在级别启用 -氧气. 当明确禁用时,它还意味着 -fno-部分锚点,
否则在 -氧气 在某些目标上。
-fweb
构建通常用于寄存器分配目的的网络并分配每个网络
个人伪寄存器。 这允许寄存器分配传递操作
直接pseudos,但也加强了其他几个优化通道,例如CSE,
循环优化器和琐碎的死代码移除器。 但是,它可以使调试
不可能,因为变量不再停留在“本地寄存器”中。
默认情况下启用 - 有趣的循环.
-f整个程序
假设当前编译单元代表正在编译的整个程序。
所有公共函数和变量,除了“main”和那些被合并的
属性“externally_visible”成为静态函数并在效果上进行了优化
过程间优化器更积极。
此选项不应与“-flto”结合使用。 而是依靠一个
链接器插件应该提供更安全和更精确的信息。
-flto[=n]
此选项运行标准链接时优化器。 当用源代码调用时,它
生成 GIMPLE(GCC 的内部表示之一)并将其写入特殊 ELF
目标文件中的部分。 当目标文件链接在一起时,所有的
函数体从这些 ELF 部分读取并实例化,就好像它们已经被
同一翻译单元的一部分。
要使用链接时优化器, -flto 需要在编译时和期间指定
最后的链接。 例如:
gcc -c -O2 -flto foo.c
gcc -c -O2 -flto bar.c
gcc -o myprog -flto -O2 foo.o bar.o
对 GCC 的前两次调用将 GIMPLE 的字节码表示保存到特殊的
里面的 ELF 部分 foo.o 和 酒吧. 最后的调用读取 GIMPLE 字节码
在 foo.o 和 酒吧, 将两个文件合并为一个内部镜像,并编译
结果照常。 由于两者 foo.o 和 酒吧 合并成一个单一的图像,这
导致 GCC 中的所有过程间分析和优化在整个过程中工作
两个文件就好像它们是一个文件一样。 这意味着,例如,内联是
能够内联函数 酒吧 进入函数 foo.o 反之亦然。
启用链接时间优化的另一种(更简单)方法是:
gcc -o myprog -flto -O2 foo.c bar.c
以上生成字节码 foo.c 和 酒吧, 将它们合并为一个
GIMPLE 表示并像往常一样优化它们以产生 MYPROG.
要记住的唯一重要的事情是启用链接时优化
-flto 标志需要传递给编译和链接命令。
为了使整个程序优化有效,必须使某些整体
程序假设。 编译器需要知道哪些函数和变量可以是
由链接时优化单元之外的库和运行时访问。 什么时候
由链接器支持,链接器插件(见 -fuse 链接器插件) 通过
向编译器提供有关使用的和外部可见的符号的信息。 当。。。的时候
链接器插件不可用, -f整个程序 应该用于允许编译器
做出这些假设,从而导致更积极的优化决策。
请注意,当文件编译时 -flto, 生成的目标文件大于
一个常规的目标文件,因为它包含 GIMPLE 字节码和通常的最终代码。
这意味着带有 LTO 信息的对象文件可以作为普通对象链接
档案; 如果 -flto 没有传递给链接器,没有过程间优化
应用。
此外,用于编译单个文件的优化标志不是
必然与链接时使用的那些有关。 例如,
gcc -c -O0 -flto foo.c
gcc -c -O0 -flto bar.c
gcc -o myprog -flto -O3 foo.o bar.o
这会生成带有未优化汇编代码的单个目标文件,但是
结果二进制 MYPROG 优化在 -氧气. 相反,如果最终的二进制文件是
没有生成 -flto, 然后 MYPROG 没有优化。
在生成最终二进制文件时 -flto, GCC 只应用链接时优化
到那些包含字节码的文件。 因此,您可以混合和匹配目标文件
和带有 GIMPLE 字节码和最终目标代码的库。 GCC 自动选择
在 LTO 模式下优化哪些文件以及无需进一步链接哪些文件
处理。
GCC 在生成字节码时保留了一些代码生成标志,如
它们需要在最后的链接阶段使用。 目前,以下选项
被保存到 GIMPLE 字节码文件中: -fPIC, -fcommon 和所有的 -m 目标标志。
在链接时,这些选项被读入并重新应用。 请注意,当前
实现不会尝试识别这些选项的冲突值。 如果
不同的文件具有相互冲突的选项值(例如,一个文件是用 -fPIC
另一个不是),编译器只使用从字节码中读取的最后一个值
文件。 那么,建议您编译所有参与
具有相同选项的相同链接。
如果 LTO 遇到带有 C 链接的对象,这些对象在单独的文件中声明为不兼容的类型
要链接在一起的翻译单元(根据 ISO C99 的未定义行为
6.2.7),可能会发布非致命诊断。 该行为在运行时仍未定义
时间。
LTO 的另一个特点是可以应用过程间优化
关于用不同语言编写的文件。 这需要语言方面的支持
结尾。 目前,C、C++ 和 Fortran 前端能够发出 GIMPLE
字节码,所以这样的事情应该工作:
gcc -c -flto foo.c
g++ -c -flto bar.cc
gfortran -c -flto baz.f90
g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
请注意,最后的链接已完成 克++ 获取 C++ 运行时库和
-lgfortran 添加以获取 Fortran 运行时库。 一般来说,混合时
LTO 模式下的语言,您应该使用与混合时相同的链接命令选项
常规(非 LTO)编译中的语言; 所有你需要添加的是 -flto 所有
编译和链接命令。
如果包含 GIMPLE 字节码的目标文件存储在库存档中,例如
libfoo.a,如果您使用的是 LTO 链接,则可以在 LTO 链接中提取和使用它们
具有插件支持的链接器。 要启用此功能,请使用标志 -fuse 链接器插件
在链接时:
gcc -o myprog -O2 -flto -fuse-linker-plugin ao bo -lfoo
启用链接器插件后,链接器将从中提取所需的 GIMPLE 文件
libfoo.a 并将它们传递给正在运行的 GCC 使它们成为聚合的一部分
要优化的 GIMPLE 图像。
如果您没有使用支持插件的链接器和/或不启用链接器
插件,然后是里面的对象 libfoo.a 像往常一样被提取和链接,但它们
不参与 LTO 优化过程。
链接时优化不需要整个程序的存在来运行。
如果程序不需要导出任何符号,则可以组合
-flto 和 -f整个程序 允许过程间优化器使用更多
激进的假设可能会导致改进的优化机会。 用于
-f整个程序 当链接器插件处于活动状态时不需要(请参阅 -fuse 链接器插件).
LTO 的当前实现没有尝试生成字节码
可在不同类型的主机之间移植。 字节码文件是版本化的,并且有
是一种严格的版本检查,因此在一个版本的 GCC 中生成的字节码文件不会
使用较旧/较新版本的 GCC。
链接时优化不适用于调试信息的生成。
结合 -flto - -g 目前正在试验中,预计会产生错误
结果。
如果您指定可选 n, 在链接时完成的优化和代码生成
使用并行执行 n 使用已安装的并行作业 使 程序。
环境变量 MAKE 可用于覆盖所使用的程序。 默认的
的价值 n 是1。
您还可以指定 -flto=作业服务器 使用 GNU make 的作业服务器模式来确定
并行作业的数量。 当调用 GCC 的 Makefile 已经存在时,这很有用
并行执行。 你必须在前面加上 + 到父级中的命令配方
Makefile 为此工作。 此选项可能仅适用于 MAKE 是 GNU make。
默认情况下禁用此选项。
-flto-分区=ALG
指定链接时优化器使用的分区算法。 价值是
要么“1to1”指定镜像原始源文件的分区,要么
“平衡”以指定划分为相同大小的块(尽可能)或
"max" 尽可能为每个符号创建新分区。 将“无”指定为
一种算法完全禁用分区和流。 默认值为
“均衡”。 虽然“1to1”可以用作各种代码排序的解决方法
问题,“最大”分区仅用于内部测试。
-flto-压缩级别=n
此选项指定用于编写中间语言的压缩级别
到 LTO 目标文件,并且仅与 LTO 模式(-flto).
有效值为 0(无压缩)到 9(最大压缩)。 在此之外的值
范围被限制为 0 或 9。如果未给出该选项,则默认平衡
使用压缩设置。
-flto 报告
打印一份报告,其中包含有关链接时间优化器工作的内部详细信息。 这
本报告的内容因版本而异。 它旨在对 GCC 有用
开发人员在 LTO 模式下处理目标文件时(通过 -flto).
默认情况下禁用。
-fuse 链接器插件
在链接时优化期间启用链接器插件。 此选项依赖
链接器中的插件支持,可在 Gold 或 GNU ld 2.21 或
较新。
此选项启用从库中提取带有 GIMPLE 字节码的目标文件
档案。 这通过向链接公开更多代码来提高优化质量 -
时间优化器。 此信息指定可以从外部访问哪些符号
(通过非 LTO 对象或在动态链接期间)。 由此产生的代码质量改进
二进制文件(和使用隐藏可见性的共享库)类似于
“-f 整个程序”。 看 -flto 有关此标志的效果以及如何使用的说明
用它。
当 GCC 中的 LTO 支持已启用且 GCC 已启用时,此选项默认启用
配置为与支持插件的链接器一起使用(GNU ld 2.21 或更新版本或 gold)。
-ffat-lto-对象
Fat LTO 对象是包含中间语言和
对象代码。 这使得它们可用于 LTO 链接和正常链接。 这个
选项仅在编译时有效 -flto 并且在链接时被忽略。
-fno-fat-lto-对象 改进了普通 LTO 的编译时间,但需要
完整的工具链以了解 LTO。 它需要一个带有链接器插件支持的链接器
对于基本功能。 此外, nm, ar 和 运行库 需要支持链接器
允许全功能构建环境的插件(能够构建静态
图书馆等)。 GCC 提供了 海湾合作委员会-ar, gcc纳米, gcc-ranlib 包装器传递
这些工具的正确选择。 使用非胖 LTO makefile 需要修改才能使用
他们。
默认是 -ffat-lto-对象 但这个默认值打算在未来改变
当启用链接器插件的环境变得更加普遍时发布。
-fcompare-elim
寄存器分配和后寄存器分配指令拆分后,识别
计算类似于比较操作的处理器标志的算术指令
基于该算法。 如果可能,消除显式比较操作。
此 pass 仅适用于某些无法明确表示的目标
寄存器分配完成前的比较操作。
在级别启用 -O, -氧气, -氧气, -你.
-保险丝-ld=bfd
使用 bfd 链接器而不是默认链接器。
-fuse-ld=黄金
使用 金 链接器而不是默认链接器。
-fcprop-寄存器
寄存器分配和后寄存器分配指令拆分后,执行
复制传播传递,以尝试减少调度依赖性,偶尔
消除副本。
在级别启用 -O, -氧气, -氧气, -你.
-fprofile-更正
使用用于多线程程序的检测二进制文件收集的配置文件可能是
由于错过计数器更新而不一致。 当指定此选项时,GCC 使用
启发式方法来纠正或消除这种不一致。 默认情况下,GCC 发出一个
检测到不一致的配置文件时出现错误消息。
-fprofile-目录=径
设置要在其中搜索配置文件数据文件的目录 径. 这个选项
仅影响由生成的配置文件数据 -fprofile-生成, -ftest-覆盖,
-f轮廓弧 并由 -fprofile 使用 和 -fbranch-概率 及其相关
选项。 绝对路径和相对路径都可以使用。 默认情况下,GCC 使用
当前目录为 径,因此配置文件数据文件出现在与
目标文件。
-fprofile-生成
-fprofile-生成=径
启用通常用于检测应用程序以生成有用的配置文件的选项
用于以后使用基于配置文件反馈的优化重新编译。 你必须使用
-fprofile-生成 在编译和链接程序时。
启用了以下选项:“-fprofile-arcs”、“-fprofile-values”、“-fvpt”。
If 径 指定后,GCC 会查看 径 查找配置文件反馈数据文件。
参见 -fprofile-目录.
-fprofile 使用
-fprofile-使用=径
启用配置文件反馈定向优化,优化通常有利可图
仅提供个人资料反馈。
启用以下选项:“-fbranch-probabilities”、“-fvpt”、
“-funroll-loops”、“-fpeel-loops”、“-ftracer”、“-ftree-vectorize”、
“ftree-loop-distribute-patterns”
默认情况下,如果反馈配置文件与配置文件不匹配,GCC 会发出错误消息
源代码。 这个错误可以通过使用变成警告 -W覆盖不匹配.
请注意,这可能会导致代码优化不佳。
If 径 指定后,GCC 会查看 径 查找配置文件反馈数据文件。
参见 -fprofile-目录.
以下选项控制有关浮点运算的编译器行为。
这些选项在速度和正确性之间进行权衡。 所有都必须特别启用。
-float-存储
不要在寄存器中存储浮点变量,并禁止其他选项
可能会改变浮点值是从寄存器还是内存中获取的。
此选项可防止在 68000 等机器上出现不需要的过度精度,其中
浮动寄存器(68881)保持比“双精度”更高的精度
具有。 x86 架构也是如此。 对于大多数程序,超额精度
确实很好,但有一些程序依赖于 IEEE 浮动的精确定义
观点。 用 -float-存储 对于此类程序,在修改它们以存储所有
相关的中间计算到变量中。
-fexcess-精度=样式
此选项允许进一步控制在浮动的机器上的超额精度
点寄存器比 IEEE “float” 和 “double” 类型具有更高的精度,并且
处理器不支持四舍五入到这些类型的操作。 默认情况下,
-fexcess-precision=快 有效; 这意味着操作是在
寄存器的精度,并且在四舍五入到类型时是不可预测的
源代码中指定的发生。 编译C时,如果
-fexcess-precision=标准 指定然后超额精度遵循规则
ISO C99 中规定; 特别是,强制转换和赋值都会导致值变为
四舍五入到它们的语义类型(而 -float-存储 只影响作业)。
如果严格的一致性选项,例如
-std=c99 用来。
-fexcess-precision=标准 没有为 C 以外的语言实现,并且没有
效果如果 -funsafe-数学优化 or -ffast-数学 被指定。 在 x86 上,它
也没有效果,如果 -mfpmath=sse or -mfpmath=sse+387 已指明; 在前者
在这种情况下,IEEE 语义在没有过度精确的情况下适用,在后者中,四舍五入是
不可预测的。
-ffast-数学
套数 -fno-数学错误号, -funsafe-数学优化, -finite-math-only,
-fno-舍入数学, -fno-信令-nans 和 -fcx-有限范围.
此选项导致定义预处理器宏“__FAST_MATH__”。
任何人都没有打开此选项 -O 选项之外 -奥法斯特 因为它会导致
依赖于 IEEE 或 ISO 的精确实现的程序的错误输出
数学函数的规则/规范。 然而,它可能会产生更快的代码
不需要这些规范保证的程序。
-fno-数学错误号
调用用单个函数执行的数学函数后不要设置“errno”
指令,例如“sqrt”。 一个依赖于 IEEE 数学错误异常的程序
处理可能希望使用此标志来提高速度,同时保持 IEEE 算术
兼容性。
任何人都没有打开此选项 -O 选项,因为它可能导致错误的输出
对于依赖于 IEEE 或 ISO 的精确实现的程序
数学函数的规则/规范。 然而,它可能会产生更快的代码
不需要这些规范保证的程序。
默认是 -fmath-errno.
在 Darwin 系统上,数学库从不设置“errno”。 因此没有理由
让编译器考虑它可能的可能性,以及 -fno-数学错误号 是
默认。
-funsafe-数学优化
允许对浮点运算进行优化,即 (a) 假设参数和
结果有效且 (b) 可能违反 IEEE 或 ANSI 标准。 在链接时使用时,
它可能包括更改默认 FPU 控制字的库或启动文件或
其他类似的优化。
任何人都没有打开此选项 -O 选项,因为它可能导致错误的输出
对于依赖于 IEEE 或 ISO 的精确实现的程序
数学函数的规则/规范。 然而,它可能会产生更快的代码
不需要这些规范保证的程序。 启用
-fno 有符号零, -fno-捕获数学, - 联想数学 和 -倒数数学.
默认是 -fno-不安全数学优化.
- 联想数学
允许在一系列浮点运算中重新关联操作数。 这个
通过可能改变计算结果违反了 ISO C 和 C++ 语言标准。
注意:重新排序可能会改变零的符号以及忽略 NaN 并禁止或
创建下溢或溢出(因此不能用于依赖舍入的代码
行为类似于“(x + 2**52) - 2**52”。 也可以重新排序浮点比较和
因此在需要有序比较时可能不使用。 此选项要求
都 -fno 有符号零 和 -fno-捕获数学 生效。 此外,它不会使
很有意义 -基础数学. 对于 Fortran,该选项在以下情况下自动启用
都 -fno 有符号零 和 -fno-捕获数学 有效。
默认是 -fno 关联数学.
-倒数数学
允许使用一个值的倒数而不是除以这个值,如果这
启用优化。 例如“x / y”可以替换为“x * (1/y)”,即
如果“(1/y)”受公共子表达式消除的影响,则很有用。 请注意,这
失去精度并增加对值进行操作的触发器数量。
默认是 -fno-倒数-数学.
-finite-math-only
允许优化浮点运算,假设参数和
结果不是 NaN 或 +-Infs。
任何人都没有打开此选项 -O 选项,因为它可能导致错误的输出
对于依赖于 IEEE 或 ISO 的精确实现的程序
数学函数的规则/规范。 然而,它可能会产生更快的代码
不需要这些规范保证的程序。
默认是 -fno-仅限有限数学.
-fno 有符号零
允许优化忽略零符号的浮点算法。
IEEE 算术指定不同 +0.0 和 -0.0 值的行为,然后
禁止简化表达式,例如 x+0.0 或 0.0*x(即使有
-finite-math-only)。 此选项意味着零结果的符号不是
重大。
默认是 -f有符号零.
-fno-捕获数学
假设浮点运算不能生成用户可见的编译代码
陷阱。 这些陷阱包括被零除、上溢、下溢、不精确结果和
无效操作。 此选项要求 -fno-信令-nans 生效。
如果依赖于“不间断”IEEE 算法,则设置此选项可能会允许更快的代码,
例如。
任何人都不应打开此选项 -O 选项,因为它可能导致
依赖于 IEEE 或 ISO 的精确实现的程序的错误输出
数学函数的规则/规范。
默认是 -ftrapping-数学.
-基础数学
禁用假定默认浮点舍入的转换和优化
行为。 对于所有浮点到整数转换,这是舍入到零,并且
所有其他算术截断的舍入到最接近。 这个选项应该是
为动态更改 FP 舍入模式的程序指定,或者可能是
以非默认舍入模式执行。 此选项禁用常量折叠
编译时的浮点表达式(可能受舍入模式影响)
在存在符号相关的情况下不安全的算术变换
舍入模式。
默认是 -fno-舍入数学.
此选项是实验性的,目前不保证禁用所有 GCC
受舍入模式影响的优化。 GCC 的未来版本可能会提供
使用 C99 的“FENV_ACCESS”编译指示更好地控制此设置。 这个命令行
选项将用于指定“FENV_ACCESS”的默认状态。
-f信令-nans
编译代码,假设 IEEE 信号 NaN 可能会在执行期间生成用户可见的陷阱
浮点运算。 设置此选项会禁用可能更改的优化
通过信号 NaN 可见的异常数量。 这个选项意味着
-ftrapping-数学.
此选项导致定义预处理器宏“__SUPPORT_SNAN__”。
默认是 -fno-信令-nans.
此选项是实验性的,目前不保证禁用所有 GCC
影响信号 NaN 行为的优化。
-f单精度常量
将浮点常量视为单精度而不是隐式转换
它们转换为双精度常量。
-fcx-有限范围
启用后,此选项表明在以下情况下不需要范围缩减步骤
执行复杂的划分。 此外,没有检查结果是否
复杂的乘法或除法是“NaN + I*NaN”,试图挽救
在那种情况下。 默认是 -fno-cx-有限范围, 但由
-ffast-数学.
此选项控制 ISO C99“CX_LIMITED_RANGE”编译指示的默认设置。
尽管如此,该选项适用于所有语言。
-fcx-fortran-规则
复杂的乘法和除法遵循 Fortran 规则。 范围缩小是这样完成的
复数除法的一部分,但不检查复数的结果是否
乘法或除法是“NaN + I*NaN”,试图挽救局面
在这种情况下。
默认是 -fno-cx-fortran-规则.
以下选项控制可能会提高性能的优化,但不会
由任何启用 -O 选项。 本节包括可能产生的实验选项
损坏的代码。
-fbranch-概率
运行编译的程序后 -f轮廓弧,可以二次编译
运用 -fbranch-概率, 改进基于次数的优化
每个分支都被占用了。 当程序编译时 -f轮廓弧 退出,它保存
arc 执行计数到一个名为 源名称.gcda 对于每个源文件。 这
此数据文件中的信息非常依赖于生成的结构
代码,因此您必须对两者使用相同的源代码和相同的优化选项
汇编。
在 -fbranch-概率, GCC 提出了一个 REG_BR_PROB 注意每个 跳转_INSN 和
呼叫_INSN. 这些可用于改进优化。 目前,它们仅用于
一处:在 重组文件, 而不是猜测分支最有可能走哪条路径
拿, REG_BR_PROB 值用于准确确定多走哪条路径
经常。
-f 配置文件值
如果结合 -f轮廓弧,它添加了代码,以便一些关于值的数据
程序中的表达式被收集。
在 -fbranch-概率,它读回从分析值收集的数据
用于优化的表达式。
启用 -fprofile-生成 和 -fprofile 使用.
-fvpt
如果结合 -f轮廓弧,此选项指示编译器将代码添加到
收集有关表达式值的信息。
在 -fbranch-概率,它读回收集的数据并实际执行
基于它们的优化。 目前的优化包括专业化
使用有关分母值的知识进行除法运算。
-frename-寄存器
尝试通过使用剩余的寄存器来避免调度代码中的错误依赖
寄存器分配后结束。 这种优化最有利于处理器
的寄存器。 根据目标采用的调试信息格式,
然而,它会使调试变得不可能,因为变量不再停留在“家”中
登记”。
默认情况下启用 - 有趣的循环 和 -f剥离循环.
-跟踪器
执行尾部复制以扩大超级块大小。 这种转变简化了
函数的控制流允许其他优化做得更好。
启用 -fprofile 使用.
- 有趣的循环
展开循环,其迭代次数可以在编译时或之后确定
进入循环。 - 有趣的循环 暗示 -frerun-cse-循环后, -fweb 和
-frename-寄存器. 它还打开完整的循环剥离(即完全去除
具有少量恒定迭代次数的循环)。 此选项使代码更大,并且
可能会也可能不会让它运行得更快。
启用 -fprofile 使用.
-funroll-所有循环
展开所有循环,即使循环执行时它们的迭代次数不确定
进入。 这通常会使程序运行得更慢。 -funroll-所有循环 暗示
相同的选项 - 有趣的循环.
-f剥离循环
Peels 循环,其中有足够的信息,它们不会滚动太多(从
个人资料反馈)。 它还打开完整的循环剥离(即完全去除
迭代次数较少的循环)。
启用 -fprofile 使用.
-fmove 循环不变量
在 RTL 循环优化器中启用循环不变运动传递。 在级别启用
-氧气
-funswitch循环
将具有循环不变条件的分支移出循环,并复制
在两个分支上循环(根据条件的结果修改)。
-f函数部分
-fdata-sections.
将每个函数或数据项放入输出文件中自己的部分,如果目标
支持任意部分。 函数名称或数据项名称
确定输出文件中节的名称。
在链接器可以执行优化以改进的系统上使用这些选项
指令空间中的引用位置。 大多数系统使用 ELF 对象
格式和运行 Solaris 2 的 SPARC 处理器具有具有此类优化的链接器。
AIX 将来可能会有这些优化。
仅当这样做有显着好处时才使用这些选项。 当你
指定这些选项,汇编器和链接器会创建更大的对象和可执行文件
文件,而且速度也较慢。 如果指定此选项,则不能在所有系统上使用“gprof”
选项,并且如果您同时指定此选项和
-g.
-fbranch-目标-加载-优化
在序言/结尾线程之前执行分支目标寄存器加载优化。
目标寄存器的使用通常只能在重新加载期间暴露,从而提升
循环加载和执行块间调度需要单独优化
通过。
-fbranch-目标-加载-优化2
在序言/结尾线程处理后执行分支目标寄存器加载优化。
-fbtr-bb-独家
执行分支目标寄存器加载优化时,不要重用分支目标
在任何基本块中注册。
-fstack-保护器
发出额外的代码来检查缓冲区溢出,例如堆栈粉碎攻击。 这个
是通过向具有易受攻击对象的函数添加保护变量来完成的。 这个
包括调用“alloca”的函数,以及缓冲区大于 8 字节的函数。
守卫在进入一个函数时被初始化,然后在
函数退出。 如果保护检查失败,则会打印错误消息并且程序
退出。
注意:在 Ubuntu 6.10 和更高版本中,默认情况下为 C、C++、
ObjC、ObjC++,如果没有 -fno-堆栈保护器, -nostdlib也没有 -f独立 旨在
找到。
-fstack-保护器-所有
喜欢 -fstack-保护器 除了所有功能都受到保护。
-fsection-锚点
尝试通过使用共享“锚点”来减少符号地址计算的次数
符号来寻址附近的物体。 这种转变有助于减少数量
某些目标上的 GOT 条目和 GOT 访问。
例如下面函数“foo”的实现:
静态 int a, b, c;
int foo (void) { 返回 a + b + c; }
通常计算所有三个变量的地址,但如果你编译它
-fsection-锚点,它改为从公共锚点访问变量。 这
效果类似于以下伪代码(不是有效的 C):
int foo(空)
{
注册 int *xr = &x;
返回 xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
}
并非所有目标都支持此选项。
--参数 姓名=折扣值
在某些地方,GCC 使用各种常量来控制优化的数量
已经完成了。 例如,GCC 不会内联包含多个特定值的函数
指令数。 您可以在命令行上控制其中一些常量
使用 --参数 选项。
特定参数的名称和值的含义与
编译器的内部结构,将来如有更改,恕不另行通知
版本。
在每种情况下, 折扣值 是一个整数。 允许的选择 姓名 是:
可预测的分支结果
当预测分支以低于此阈值的概率被采用时
(百分比),那么它被认为是可预测的。 默认值为 10。
最大交叉跳跃边缘
交叉跳转要考虑的最大传入边数。 算法
用于 -f越野跳跃 传入每个块的边数为 O(N^2)。
增加值意味着更积极的优化,使编译时间
随着可执行文件大小的小幅改进而增加。
最小交叉跳跃insns
两个块末尾必须匹配的最小指令数
在对它们执行交叉跳转之前。 在这种情况下,此值将被忽略
其中交叉跳转的块中的所有指令都匹配。 这
默认值为 5。
最大增长复制 bb insns
复制基本块时的最大代码大小扩展因子而不是
跳跃。 扩展是相对于跳转指令的。 默认值为
8.
最大 goto 重复 inns
复制到跳转到一个块的最大指令数
计算转到。 为了避免多次传递中的 O(N^2) 行为,GCC 因素
在编译过程的早期计算 goto,并在最晚对它们进行分解
可能的。 仅在基本块的末尾计算跳转,不超过 max-
goto-duplication-insns 是未分解的。 默认值为 8。
最大延迟时隙-insn-search
查找指令时要考虑的最大指令数
填充延迟槽。 如果超过这个任意数量的指令
搜索,填充延迟槽节省的时间是最小的,所以停止
搜索。 增加值意味着更积极的优化,使
编译时间增加,执行时间可能略有改善。
最大延迟时隙实时搜索
尝试填充延迟槽时,要考虑的最大指令数
搜索具有有效实时注册信息的块时。 增加这个
任意选择的值意味着更积极的优化,增加
编译时间。 当延迟槽代码为
重写以维护控制流图。
最大 gcse 内存
可以分配的近似最大内存量以执行
全局公共子表达式消除优化。 如果内存大于
指定是必需的,优化没有完成。
最大 gcse 插入比率
如果表达式插入与删除的比率大于此值
任何表达式,然后 RTL PRE 插入或删除表达式,从而离开
指令流中的部分冗余计算。 默认值为
20.
最大挂起列表长度
刷新之前允许的最大挂起依赖项调度数
当前状态并重新开始。 具有很少分支或调用的大型函数可以
创建过大的列表,不必要地消耗内存和资源。
最大模回溯尝试
取模时调度程序应进行的最大回溯尝试次数
调度一个循环。 较大的值可以成倍地增加编译时间。
最大内联-insns-单
几个参数控制 GCC 中使用的树内联程序。 这个数字设置
最大指令数(在 GCC 的内部表示中计算)
树内联器考虑用于内联的单个函数。 这只会影响
内联声明的函数和在类声明中实现的方法 (C++)。
默认值为 400。
最大内联-insns-自动
当您使用 -finline-函数 (包括在 -氧气), 很多功能
否则不考虑由编译器内联进行调查。 到
那些功能,与功能相比不同(更具限制性)的限制
可以应用内联声明。 默认值为 40。
内联最小加速
当调用者 + 被调用者运行时的估计性能改进超过此值时
阈值(以 precent 表示),该函数可以被内联,而不受限制
--参数 最大内联-insns-单 和 --参数 最大内联-insns-自动.
大型函数insns
指定真正大函数的限制。 对于大于此限制的函数
内联后,内联受约束 --参数 大功能成长。 这
参数主要用于避免非编译导致的极端编译时间
后端使用的线性算法。 默认值为 2700。
大功能成长
以百分比形式指定由内联引起的大型函数的最大增长。 这
默认值为 100,这将大型函数的增长限制为原始值的 2.0 倍
大小。
大型单位-insns
指定大型翻译单元的限制。 单元内联导致的增长
大于这个限制被限制 --参数 内联单元增长. 对于小单位
这可能太紧了。 例如,考虑一个由函数 A 组成的单元
那是内联的,而 B 只调用了 A 三次。 如果 B 相对于 A 很小,
单位的增长是 300\%,但这种内联是非常理智的。 对于非常大
由小的内联函数组成的单元,然而,整体单元增长
需要限制以避免代码大小的指数爆炸。 因此对于较小的
单位,大小增加到 --参数 大型单位-insns 在申请之前 --参数
内联单元增长. 默认值为 10000。
内联单元增长
指定由内联引起的编译单元的最大整体增长。 这
默认值为 30,这将单位增长限制为原始大小的 1.3 倍。
ipcp-单位-增长
指定由过程间引起的编译单元的最大整体增长
不断传播。 默认值为 10,将单位增长限制为 1.1
倍原尺寸。
大栈帧
指定大堆栈帧的限制。 虽然内联算法正在尝试
不要超过这个限制太多。 默认值为 256 字节。
大堆栈帧增长
以百分比为单位指定由内联引起的大堆栈帧的最大增长。
默认值为 1000,这将大型堆栈帧的增长限制为 11 倍
原始尺寸。
max-inline-insns-递归
最大内联-insns-递归-自动
指定最大指令数,一个自我的外部副本。
递归内联函数可以通过执行递归内联来成长。
对于内联声明的函数, --参数 max-inline-insns-递归 被纳入
帐户。 对于未声明为内联的函数,递归内联仅在以下情况发生
-finline-函数 (包括在 -氧气) 已启用并且 --参数 最大内联insns-
递归自动 用来。 默认值为 450。
最大内联递归深度
最大内联递归深度自动
指定用于递归内联的最大递归深度。
对于内联声明的函数, --参数 最大内联递归深度 被纳入
帐户。 对于未声明为内联的函数,递归内联仅在以下情况发生
-finline-函数 (包括在 -氧气) 已启用并且 --参数 最大内联递归-
深度自动 用来。 默认值为 8。
最小内联递归概率
递归内联仅对具有深度递归的函数有利
平均并且可能会通过增加递归深度来伤害具有很小递归深度的函数
其他优化器的函数体的序言大小或复杂性。
当个人资料反馈可用时(请参阅 -fprofile-生成) 实际递归
可以从函数通过给定调用递归的概率猜测深度
表达。 此参数将内联限制为仅调用具有以下特征的表达式
概率超过给定的阈值(以百分比为单位)。 默认值为 10。
早期内联insns
指定早期内联可以产生的增长。 实际上它增加了数量
内联具有较大抽象惩罚的代码。 默认值为 10。
最大早期内联迭代次数
最大早期内联迭代次数
早期内联的迭代限制。 这基本上限制了数量
早期内联程序可以解决嵌套的间接调用。 更深的链条还在
由后期内联处理。
数据共享概率
数据共享概率
具有 comdat 可见性的 C++ 内联函数的概率(以百分比为单位)
跨多个编译单元共享。 默认值为 20。
最小向量循环边界
循环不向量化的最小迭代次数
-ftree-矢量化 用来。 矢量化后的迭代次数需要
大于此选项指定的值以允许矢量化。 这
默认值为 0。
gcse-成本-距离-比率
计算表达式可以移动的最大距离时的比例因子
GCSE 优化。 目前仅在代码提升通道中支持此功能。
比值越大,代码提升越积极
表达式,即成本小于 gcse-不受限制-
成本. 指定 0 将禁用简单表达式的提升。 默认值为
10.
gcse-不受限制的成本
成本,粗略衡量为单个典型机器指令的成本,在
哪些 GCSE 优化不限制表达式可以传播的距离。
目前仅在代码提升通道中支持此功能。 成本越低,
更积极的代码提升是。 指定 0 允许所有表达式
旅行不受限制的距离。 默认值为 3。
最大提升深度
在支配树中搜索要提升的表达式的深度。 这是用
避免提升算法中的二次行为。 0的值不限制
在搜索上,但可能会减慢大型函数的编译速度。 默认值
是30。
最大尾合并比较
与 bb 进行比较的类似 bbs 的最大数量。 这是用来避免
树尾合并中的二次行为。 默认值为 10。
最大尾合并迭代
通过函数的最大迭代次数。 这用于
限制树尾合并的编译时间。 默认值为 2。
最大展开的insns
循环可能必须展开的最大指令数。 如果一个循环
展开,这个参数也决定了循环代码的次数
展开。
最大平均展开的insns
受其执行概率影响的最大指令数
可能必须展开循环。 如果一个循环被展开,这个参数也
确定循环代码展开的次数。
最大展开次数
单个循环的最大展开次数。
最大去皮insns
循环可能必须剥离的最大指令数。 如果一个循环
被剥皮,这个参数也决定了循环代码被剥皮的次数。
最大剥离次数
单个循环的最大剥皮次数。
最大剥离分支
通过剥离序列的热路径上的最大分支数。
最大完全剥离的insns
完全剥离循环的最大insn数。
最大完全剥离次数
适合完全剥离的循环的最大迭代次数。
最大完全剥离循环嵌套深度
适合完全剥皮的环形巢穴的最大深度。
最大取消开关-insns
未切换循环的最大insn数。
最大取消切换级别
单个循环中未切换的最大分支数。
昂贵的
循环不变运动中昂贵表达式的最低成本。
iv-考虑所有候选人的限制
约束归纳变量的候选数量,低于该数量的所有候选
被考虑用于归纳变量优化中的每次使用。 如果有
比这更多的候选人,只有最相关的才被考虑避免
二次时间复杂度。
iv-max-thinked-uses
归纳变量优化放弃包含更多归纳的循环
变量用途。
iv-总是修剪-cand-set-bound
如果集合中的候选数小于这个值,总是尝试
添加新的 ivs 时从集合中删除不必要的 ivs。
scev-max-expr-大小
受标量演化分析器中使用的表达式大小的限制。 大的
表达式会减慢分析器的速度。
scev-max-expr-复杂度
受限于标量演化分析器中表达式的复杂性。
复杂的表达式会减慢分析器的速度。
欧米茄最大变量
Omega 约束系统中的最大变量数。 默认值
是128。
欧米茄-最大-geqs
Omega 约束系统中不等式的最大数量。 默认的
值是256。
欧米茄-max-eqs
Omega 约束系统中等式的最大数量。 默认值
是128。
欧米茄最大通配符
Omega 求解器能够插入的最大通配符变量数。
默认值为 18。
omega-哈希表大小
Omega 求解器中哈希表的大小。 默认值为 550。
欧米茄最大键
Omega 求解器使用的最大密钥数。 默认值为 500。
欧米茄消除冗余约束
当设置为 1 时,使用昂贵的方法来消除所有冗余约束。 这
默认值为 0。
用于对齐检查的 vect 最大版本
执行循环时可以执行的最大运行时检查次数
用于在矢量化器中对齐的版本控制。 查看选项 -ftree-vect-循环版本
获取更多信息。
别名检查的 vect 最大版本
执行循环时可以执行的最大运行时检查次数
矢量化器中别名的版本控制。 查看选项 -ftree-vect-循环版本
更多信息。
最大迭代跟踪
一个循环的最大迭代次数 蛮力算法分析
的循环尝试评估的迭代次数。
热 bb-count-ws-permille
如果基本块配置文件计数有助于给定
整个分析执行的 permillage(即 0...1000)。
hot-bb-频率分数
选择入口块中基本块执行频率的分数
给定基本块的函数需要被认为是热的。
最大预测迭代次数
我们静态预测的最大循环迭代次数。 这在
函数包含一个已知边界的循环和另一个循环的情况
与未知的界限。 已知的迭代次数被正确预测,而
未知的迭代次数平均约为 10。这意味着循环
相对于另一个,无界显得人为地冷。
对齐阈值
选择一个基本块的最大执行频率的一部分
对齐基本块的功能。
对齐循环迭代
预期至少迭代选定的迭代次数的循环是对齐的。
示踪动态覆盖
示踪动态覆盖反馈
该值用于限制超级块的形成,一旦达到给定的百分比
执行的指令被覆盖。 这限制了不必要的代码大小扩展。
这款 示踪动态覆盖反馈 仅在配置文件反馈为
可用的。 真实的配置文件(与静态估计的配置文件相反)很多
不太平衡,允许阈值更大。
示踪最大代码增长
一旦代码增长达到给定百分比,停止尾部重复。 这是一个
相当人为的限制,因为大多数重复后来在交叉中被消除
跳跃,因此它可能被设置为比所需的代码增长高得多的值。
示踪剂最小分支比
当最佳边缘的反向概率小于这个时停止反向增长
阈值(百分比)。
示踪剂最小分支比
示踪剂最小分支比率反馈
如果最佳边缘的概率低于此阈值,则停止向前增长。
类似于 示踪动态覆盖 存在两个值,一个用于编译
用于配置文件反馈,另一种用于编译。 编译值
个人资料反馈需要更保守(更高)才能使
示踪剂有效。
最大 cse 路径长度
CSE 考虑的路径上基本块的最大数量。 默认值为 10。
最大 cse-insns
刷新前 CSE 处理的最大指令数。 默认是
1000.
ggc-min-展开
GCC 使用垃圾收集器来管理自己的内存分配。 这个参数
指定垃圾收集器堆的最小百分比
允许在集合之间扩展。 调整此项可能会提高编译速度;
它对代码生成没有影响。
默认值为 30% + 70% * (RAM/1GB),当 RAM >= 100GB 时上限为 1%。
如果“getrlimit”可用,则“RAM”的概念是实际 RAM 中最小的一个,并且
“RLIMIT_DATA”或“RLIMIT_AS”。 如果 GCC 无法计算特定的 RAM
平台,使用 30% 的下限。 设置这个参数和 ggc-分钟-
堆大小 归零会导致在每一个机会都发生一次完整的收集。 这是
非常慢,但对调试很有用。
ggc-最小堆大小
垃圾收集器开始费心收集之前的最小堆大小
垃圾。 第一次收集发生在堆扩展之后 ggc-min-展开%
以外 ggc-最小堆大小. 同样,调整此项可以提高编译速度,并且
对代码生成没有影响。
默认值是 RAM/8、RLIMIT_RSS 或试图确保的限制中的较小者
未超出 RLIMIT_DATA 或 RLIMIT_AS,但下限为 4096
(四兆字节)和上限 131072(128 兆字节)。 如果 GCC 不能
要计算特定平台上的 RAM,使用下限。 设置这个
参数非常大有效地禁用垃圾收集。 设置这个
参数和 ggc-min-展开 归零会导致每次都发生一次完整的收集
的机会,这是您不能错过的机会。现在就联系我们,让我们带您亲身体验芭堤雅的生活方式!
最大重新加载搜索insns
最大指令重载次数应该向后看等价
登记。 增加值意味着更积极的优化,使
编译时间增加,性能可能稍好一些。 默认的
值是100。
最大 cselib 内存位置
cselib 应考虑的最大内存位置数。
增加值意味着更积极的优化,使编译时间
增加可能会稍微好一点的性能。 默认值为 500。
重新排序块重复
重新排序块重复反馈
由基本块重新排序传递使用来决定是否使用无条件
分支或复制其目的地的代码。 代码被复制时
估计大小小于此值乘以估计大小
无条件跳转程序热点。
这款 重新排序块重复反馈 仅在配置文件反馈为
可用的。 它可以设置为高于 重新排序块重复 自
热点信息更准确。
最大计划就绪 insns
调度程序应准备发出的最大指令数
在第一次调度过程中的任何给定时间考虑。 增加价值
意味着更彻底的搜索,使编译时间可能增加
好处不大。 默认值为 100。
最大调度区域块
块间考虑的区域中的最大块数
调度。 默认值为 10。
最大管道区域块
一个区域中要考虑进行流水线处理的最大块数
选择性调度程序。 默认值为 15。
最大调度区域insns
考虑interblock的区域内insns的最大数量
调度。 默认值为 100。
最大管道区域insns
一个区域内被考虑用于流水线的最大insn数
选择性调度程序。 默认值为 200。
最小规格概率
块间到达源块的最小概率(以百分比为单位)
推测性调度。 默认值为 40。
最大调度扩展区域迭代器
通过 CFG 扩展区域的最大迭代次数。 值为 0(
默认)禁用区域扩展。
最大调度-insn-冲突延迟
推测性运动要考虑的 insn 的最大冲突延迟。
默认值为 3。
计划规格概率截止
投机成功的最小概率(以百分比为单位),因此投机
insn是预定的。 默认值为 40。
调度规范状态边缘概率截止
边缘必须具有的最小概率调度程序保存其状态
穿过它。 默认值为 10。
计划内存真实成本
针对相同内存的存储和加载之间的最小距离(以 CPU 周期为单位)
地点。 默认值为 1。
selsched-最大前瞻
选择性调度的前瞻窗口的最大大小。 这是一个深度
的搜索可用说明。 默认值为 50。
selsched 最大调度次数
指令在选择性期间被调度的最大次数
调度。 这是迭代次数的限制
指令可以流水线化。 默认值为 2。
selsched-max-insns 重命名
准备好的列表中被考虑的最佳指令的最大数量
在选择性调度程序中重命名。 默认值为 2。
短信-分钟-sc
摆动模调度器生成的阶段计数的最小值。 这
默认值为 2。
最大最后值 rtl
以可以记录在表达式中的 RTL 数量来衡量的最大大小
在伪寄存器的组合器中作为该寄存器的最后一个已知值。 这
默认值为 10000。
整数共享限制
小整数常量可以使用共享数据结构,减少编译器的
内存使用情况并提高其速度。 这设置了共享的最大值
整数常量。 默认值为 256。
ssp 缓冲区大小
接收堆栈粉碎保护的缓冲区(即数组)的最小大小
,尤其是 -fstack-保护 用来。
Ubuntu 10.10 之前的默认值是“8”。 目前是“4”,增加
堆栈保护器保护的函数数。
最大跳转线程重复 stmts
需要复制的块中允许的最大语句数
穿线跳跃。
最大字段对字段敏感
期间以字段敏感方式处理的结构中的最大字段数
指针分析。 默认为零 -氧气 和 -氧气和100 for -你, -氧气及
-氧气.
预取延迟
估计预取前执行的平均指令数
完成。 提前预取的距离与这个常数成正比。
增加此数字还可能导致预取的流减少(请参阅
同时预取).
同时预取
可以同时运行的最大预取数。
l1-缓存行大小
L1 缓存中缓存行的大小,以字节为单位。
l1-缓存大小
L1 缓存的大小,以千字节为单位。
l2-缓存大小
L2 缓存的大小,以千字节为单位。
最小插入预取比
指令数与预取数的最小比例
在循环中启用预取。
prefetch-min-insn-to-mem 比率
指令数与内存数的最小比例
在循环中启用预取的引用。
使用规范类型
编译器是否应该使用“规范”类型系统。 默认情况下,这
应始终为 1,它使用更有效的内部机制进行比较
C++ 和 Objective-C++ 中的类型。 但是,如果规范类型系统中的错误是
导致编译失败,将此值设置为 0 以禁用规范类型。
开关转换最大分支比
开关初始化转换拒绝创建大于
开关转换最大分支比 乘以交换机中的分支数。
最大部分反长度
在树部分期间计算的部分反集的最大长度
冗余消除优化(-ftree-pre) 优化时 -氧气 以上。
对于某些类型的源代码,增强的部分冗余消除
优化可能会跑掉,消耗主机上的所有可用内存
机器。 此参数对计算的集合的长度设置了限制,
这可以防止失控行为。 将此参数的值设置为 0
允许无限的设置长度。
sccvn-最大-scc-大小
SCCVN 处理期间强连接组件 (SCC) 的最大大小。 如果
达到此限制,整个函数的 SCCVN 处理未完成,并且
依赖于它的优化被禁用。 默认的最大 SCC 大小为
10000.
sccvn-每次访问最大别名查询数
我们在寻找冗余时执行的最大别名 oracle 查询数
用于装载和存储。 如果达到此限制,则搜索将中止并且加载或
store 不被认为是多余的。 查询的数量是算法上的
限于从加载到函数入口的所有路径上的存储数量。
默认的最大查询数为 1000。
ira-max-循环数
IRA 默认使用区域寄存器分配。 如果一个函数包含更多
循环次数比这个参数给定的次数多,最多只能给给定的次数
最常执行的循环形成区域寄存器分配的区域。
该参数的默认值为 100。
ira-max-冲突表大小
尽管 IRA 使用复杂的算法来压缩冲突表,
table 仍然需要大量的内存来处理巨大的函数。 如果
函数的冲突表可能大于由此给出的以 MB 为单位的大小
参数,寄存器分配器改为使用更快、更简单和更低的
不需要建立伪寄存器冲突表的质量算法。
该参数的默认值为 2000。
ira 循环保留寄存器
IRA 可用于评估循环中更准确的寄存器压力以进行决策
移动循环不变量(见 -氧气)。 保留的可用寄存器数量
此参数给出了其他一些用途。 的默认值
参数为2,这是典型需要的最少寄存器数
指示。 该值是从众多实验中发现的最佳值。
循环不变最大-bbs-in-loop
循环不变运动可能非常昂贵,无论是在编译时间还是在
所需的编译时内存量,具有非常大的循环。 循环更多
基本块比这个参数不会有循环不变的运动优化
对他们进行。 该参数的默认值为 1000 -氧气 4th 和5th 轴车削中心
-氧气 以上。
循环 max-datarefs-for-datadeps
对于非常大的循环,构建数据相关性的成本很高。 这个参数
限制为数据考虑的循环中数据引用的数量
依赖性分析。 这些大循环不会由使用的优化处理
循环数据依赖。 默认值为 1000。
最大 vartrack 大小
设置在变量跟踪数据流期间使用的最大哈希表槽数
任何函数的分析。 如果在变量跟踪时超出此限制
启用分配,在没有它的情况下重试对该函数的分析,之后
从函数中删除所有调试 insn。 如果即使没有超过限制
调试insns,该功能完全禁用var跟踪分析。
将参数设置为零使其不受限制。
max-vartrack-expr-深度
尝试映射变量名称时设置最大递归级别数或
调试临时值表达式。 这会以编译时间换取更多
完整的调试信息。 如果设置太低,则值表达式
可用并且可以在调试信息中表示可能最终不会被使用;
将此设置得更高可能会使编译器找到更复杂的调试
表达式,但编译时间和内存使用可能会增加。 默认值为 12。
最小非调试-insn-uid
使用从此参数开始的 uids 用于非调试 insns。 范围低于
参数专为由创建的调试 insns 保留
-fvar-跟踪任务, 但调试 insns 可能会得到(非重叠)以上的 uid
如果保留范围已用尽。
ipa-sra-ptr-生长因子
IPA-SRA 仅用一个或多个新参数替换指向聚合的指针
当它们的累积大小小于或等于 ipa-sra-ptr-生长因子 时代的
原始指针参数的大小。
tm-max-聚合大小
在事务中复制线程局部变量时,此参数
指定大小(以字节为单位),之后变量与日志一起保存
功能与保存/恢复代码序列对相反。 仅此选项
使用时适用 -fgnu-tm.
石墨最大 nb 范围参数
为了避免石墨循环变换中的指数效应,
静态控制部分 (SCoP) 中的参数是有界的。 默认值为 10
参数。 在编译时值未知并已定义的变量
SCoP 之外是 SCoP 的参数。
石墨-最大-bbs-per-function
为了避免 SCoP 检测中的指数效应,函数的大小
Graphite 分析是有界的。 默认值为 100 个基本块。
循环块大小
循环阻塞或剥离挖掘转换,启用 -floop块 or
-floop-strip-mine, 将循环嵌套中的每个循环剥离给定数量的
迭代。 可以使用以下命令更改条带长度 循环块大小
范围。 默认值为 51 次迭代。
ipa-cp 值列表大小
IPA-CP 尝试跟踪传递给函数的所有可能的值和类型
参数以传播它们并执行去虚拟化。 ipa-cp-值-
列表大小 是每个形式存储的值和类型的最大数量
函数的参数。
lto-分区
指定在 WHOPR 编译期间生成的所需分区数。 这
分区数应超过用于编译的 CPU 数。 这
默认值为 32。
分区
WHOPR 的最小分区大小(在估计的说明中)。 这可以防止
将非常小的程序分成太多分区的费用。
cxx-max-namespaces-for-diagnostic-help
C++ 名称查找时要咨询的最大命名空间数
标识符失败。 默认值为 1000。
下沉频率阈值
目标块的最大相对执行频率(以百分比为单位)
相对于语句的原始块以允许语句下沉
陈述。 更大的数字会导致更激进的语句下沉。 这
默认值为 75。对带有
内存操作数,因为那些更有利可图,所以下沉。
最大商店到接收器
可以沉没的最大条件存储对数。 如果设置为 0
要么向量化(-ftree-矢量化) 或 if 转换 (-ftree-loop-if 转换)
被禁用。 默认值为 2。
允许加载数据竞争
允许优化器在加载时引入新的数据竞争。 设置为 1 以允许,
否则为 0。默认情况下启用此选项,除非隐式设置
-f内存模型= 选项。
允许存储数据竞争
允许优化器在商店中引入新的数据竞争。 设置为 1 以允许,
否则为 0。默认情况下启用此选项,除非隐式设置
-f内存模型= 选项。
允许打包加载数据竞争
允许优化器在打包数据加载时引入新的数据竞争。 设置为 1 到
允许,否则为 0。默认情况下启用此选项,除非隐式设置
此 -f内存模型= 选项。
允许打包存储数据竞争
允许优化器在打包数据存储上引入新的数据竞争。 设置为 1 到
允许,否则为 0。默认情况下启用此选项,除非隐式设置
此 -f内存模型= 选项。
案例值阈值
最好使用跳转表的不同值的最少数量
而不是条件分支树。 如果值为 0,则使用默认值
机器。 默认值为 0。
树重新关联宽度
设置在关联树中并行执行的最大指令数。
此参数覆盖默认使用的目标相关启发式,如果有
零值。
调度压力算法
在两个可用的实现之间进行选择 -fsched-压力. 算法 1
是原始实现,更有可能阻止指令
被重新排序。 算法 2 被设计为在
算法 1 采取的相对保守的方法和相当激进的方法
默认调度程序采用的方法。 它更依赖于拥有一个
常规寄存器文件和准确的寄存器压力等级。 看 海法-sched.c
在 GCC 来源中了解更多详细信息。
默认选择取决于目标。
最大 slsr 扫描
设置在寻找时将考虑的现有候选人的最大数量
新的直线强度折减候选的基础。
附加选项 控制 此 预处理器
这些选项控制 C 预处理器,它在实际执行之前在每个 C 源文件上运行
汇编。
如果使用 -E 选项,除了预处理之外什么都不做。 其中一些选项
只有和 -E 因为它们导致预处理器输出
不适合实际编译。
-Wp,选项
您可以使用 -Wp,选项 绕过编译器驱动程序并通过 选项 直接通过
到预处理器。 如果 选项 包含逗号,它被分成多个选项在
逗号。 然而,许多选项被修改、翻译或解释
在传递给预处理器之前的编译器驱动程序,以及 -WP 强行绕过
这个阶段。 预处理器的直接接口未记录并受制于
改变,所以只要有可能,你应该避免使用 -WP 并让司机处理
选项代替。
-X预处理器 选项
通过 选项 作为预处理器的一个选项。 您可以使用它来提供系统-
GCC 无法识别的特定预处理器选项。
如果要传递带参数的选项,则必须使用 -X预处理器
两次,一次用于选项,一次用于参数。
-无集成-cpp
在编译之前将预处理作为单独的通道执行。 默认情况下,GCC 执行
预处理作为输入标记化和解析的一个组成部分。 如果这个选项
提供,适当的语言前端(cc1, cc1plus或 cc1对象 对于 C、C++、
和 Objective-C)被调用两次,一次仅用于预处理
一次用于实际编译预处理输入。 这个选项可能有用
连同 -B or -包装器 指定备用预处理器的选项或
在正常预处理和
汇编。
-D 姓名
预定义 姓名 作为宏,定义为 1。
-D 姓名=定义
内容 定义 被标记和处理,就好像它们出现在
翻译第三阶段 #定义 指示。 特别地,定义将是
被嵌入的换行符截断。
如果您从 shell 或类 shell 程序调用预处理器,您可能需要
使用 shell 的引用语法来保护字符,例如具有
shell 语法中的意思。
如果你想在命令行上定义一个类似函数的宏,写下它的参数
在等号(如果有)前用括号括起来的列表。 括号是
对大多数 shell 有意义,因此您需要引用该选项。 和 sh 和 长山壕,
-D'姓名(参数...)=定义' 作品。
-D 和 -U 选项按照它们在命令行中给出的顺序进行处理。 全部
-宏 文件 和 -包括 文件 选项毕竟被处理 -D 和 -U 选项。
-U 姓名
取消任何以前的定义 姓名,无论是内置的还是提供了一个 -D 选项。
-undef
不要预定义任何特定于系统或特定于 GCC 的宏。 标准预定义
宏保持定义。
-I DIR
添加目录 DIR 到要搜索头文件的目录列表。
命名的目录 -I 在标准系统包含目录之前搜索。
如果目录 DIR 是一个标准的系统包含目录,该选项被忽略
确保系统目录的默认搜索顺序和特殊处理
系统头文件没有被打败。 如果 DIR 以“=”开头,那么“=”就是
替换为 sysroot 前缀; 看 --系统根目录 和 -isysroot.
-o 文件
将输出写入 文件. 这与指定相同 文件 作为第二个非选项
争论 CPP. GCC 对第二个非选项参数有不同的解释,
所以你必须使用 -o 指定输出文件。
-墙
打开所有对正常代码来说需要的可选警告。 目前这
is -W评论, -字形, -W多字符 以及关于整数提升的警告导致
更改“#if”表达式中的符号。 请注意,许多预处理器的警告
默认情况下处于打开状态,并且没有选项来控制它们。
-W评论
-W评论
每当评论开始序列时发出警告 /* 出现在一个 /* 评论,或每当
反斜杠换行出现在 // 评论。 (两种形式具有相同的效果。)
-字形
注释中的大多数三合字母不会影响程序的含义。 然而,一个
将形成转义换行符的三合字母 (??/ 在一行的末尾)可以,通过
更改评论开始或结束的位置。 因此,只有会形成的三合字母
转义的换行符会在评论中产生警告。
此选项隐含在 -墙。 如果 -墙 未给出,此选项仍处于启用状态
除非启用了三字符。 要在没有警告的情况下进行三字母转换,但得到
其他 -墙 警告,使用 -三合字母 -墙 -Wno-三字母组.
-传统的
警告某些在传统和 ISO C 中表现不同的结构。另外
警告没有传统 C 等效项的 ISO C 构造,并且存在问题
应该避免的构造。
-文德夫
每当遇到不是宏的标识符时发出警告 #如果 指示,
在外面 定义. 此类标识符被替换为零。
-Wunused-宏
警告主文件中定义的未使用的宏。 一个宏是 用过的 如果是
扩展或测试存在至少一次。 预处理器也会警告如果
宏在重新定义或未定义时尚未使用。
内置宏、命令行定义的宏和include中定义的宏
文件不会被警告。
请注意: 如果实际使用了宏,但仅在跳过的条件块中使用,则
CPP 会将其报告为未使用。 为了避免这种情况下的警告,您可能会改进
宏定义的范围,例如,将其移动到第一个跳过的
堵塞。 或者,您可以提供一个虚拟使用,例如:
#如果定义了the_macro_causing_the_warning
#ENDIF
-Wendif-标签
警告每当 的#else 或 #ENDIF 后面跟着文字。 这通常发生在
表格代码
#如果FOO
...
#否则FOO
...
#endif FOO
第二个和第三个“FOO”应该在注释中,但通常不在旧程序中。
默认情况下,此警告处于开启状态。
-错误
将所有警告变成硬错误。 触发警告的源代码将是
被拒绝。
-W系统标头
对系统标头中的代码发出警告。 这些通常无助于寻找
您自己的代码中的错误,因此被抑制。 如果您对系统负责
图书馆,你可能想看看他们。
-w 禁止所有警告,包括 GNU CPP 默认发出的警告。
-迂腐
发出 C 标准中列出的所有强制性诊断。 他们中的一些人留下了
默认情况下,因为它们经常在无害的代码上触发。
-迂腐的错误
发出所有强制诊断,并将所有强制诊断都变成错误。
这包括 GCC 在没有问题的情况下发出的强制性诊断 -迂腐 但视为
警告。
-M 不是输出预处理的结果,而是输出适合于的规则 使
描述主源文件的依赖关系。 预处理器输出一个
使 包含该源文件的目标文件名、冒号和名称的规则
所有包含的文件,包括那些来自 -包括 or -宏 命令
线选项。
除非明确指定(与 -公吨 or -MQ),目标文件名由
带有任何后缀的源文件的名称替换为目标文件后缀和任何
删除了前导目录部分。 如果有很多包含的文件,那么规则是
使用分成几行 \-新队。 规则没有命令。
此选项不会抑制预处理器的调试输出,例如 -dM。 避免
将此类调试输出与您应该明确指定的依赖项规则混合在一起
依赖输出文件 -MF,或使用环境变量,如
依赖输出. 调试输出仍将发送到常规输出流
正常。
通过 -M 对司机意味着 -E, 并用隐式抑制警告 -w.
-MM 喜欢 -M 但不要提及在系统头目录中找到的头文件,
也不是直接或间接包含在此类头文件中的头文件。
这意味着选择尖括号或双引号 的#include
指令本身并不确定该标头是否会出现在 -MM
依赖输出。 这是从 GCC 3.0 版和
早。
-MF 文件
当与 -M or -MM, 指定要写入依赖项的文件。 如果不 -MF
switch 预处理器将规则发送到它本来发送的同一个地方
预处理输出。
与驱动程序选项一起使用时 -医学博士 or -MMD, -MF 覆盖默认依赖
输出文件。
-MG 结合一个选项,例如 -M 请求依赖生成, -MG 假设
缺少的头文件是生成的文件,并添加到依赖列表中,而不需要
引发错误。 依赖文件名直接取自“#include”
指令而不预先设置任何路径。 -MG 还抑制预处理输出,作为
缺少头文件使这无用。
此功能用于生成文件的自动更新。
-MP 此选项指示 CPP 为每个依赖项添加一个虚假目标,而不是
main 文件,导致每个文件都不依赖任何东西。 这些虚拟规则可以解决错误
使 如果您删除头文件而不更新 生成文件 匹配。
这是典型的输出:
test.o:test.c test.h
测试.h:
-公吨 目标
更改依赖生成发出的规则的目标。 默认情况下,CPP 需要
主输入文件的名称,删除任何目录组件和任何文件后缀
如 .c, 并附加平台的常用对象后缀。 结果就是目标。
An -公吨 选项会将目标设置为您指定的字符串。 如果你想
多个目标,您可以将它们指定为单个参数 -公吨,或使用多个
-公吨 选项。
例如, -公吨 '$(objpfx)foo.o' 可能会给
$(objpfx)foo.o: foo.c
-MQ 目标
与...一样 -公吨, 但它引用了任何特殊的 Make 字符。
-MQ '$(objpfx)foo.o' 给
$$(objpfx)foo.o: foo.c
默认目标是自动引用的,就好像它是用 -MQ.
-医学博士 -医学博士 相当于 -M -MF 文件,除了 -E 不是暗示。 司机
确定 文件 基于是否 -o 给出了选项。 如果是,则驱动程序使用其
参数,但后缀为 .d, 否则它采用输入文件的名称,
删除任何目录组件和后缀,并应用 .d 后缀。
If -医学博士 与 -E, 任何 -o 开关被理解为指定
依赖输出文件,但如果不使用 -E,每个 -o 被理解为指定一个
目标对象文件。
建立 -E 不是暗示, -医学博士 可用于生成依赖项输出文件作为
编译过程的副作用。
-MMD
喜欢 -医学博士 除了只提到用户头文件,而不是系统头文件。
-fpch-deps
使用预编译头时,此标志将导致依赖项输出标志
还列出来自预编译头的依赖项的文件。 如果未指定仅
将列出预编译的头文件,而不是用于创建它的文件
因为在使用预编译头时不会查询这些文件。
-fpch-预处理
此选项允许将预编译头文件与 -E. 它插入一个特殊的
"#pragma", "#pragma GCC pch_preprocess "文档名称”” 在输出中标记位置
预编译头文件所在的位置,以及它的 文件名。 何时 -f预处理 在
使用时,GCC 会识别此“#pragma”并加载 PCH。
此选项默认关闭,因为生成的预处理输出仅
非常适合作为 GCC 的输入。 它是由 -保存临时.
您不应在自己的代码中编写此“#pragma”,但编辑
文件名,如果 PCH 文件在不同的位置可用。 文件名可能是
绝对或它可能是相对于 GCC 的当前目录。
-x c
-x C ++
-x 目标
-x 汇编器与 cpp
指定源语言:C、C++、Objective-C 或汇编。 这无关
符合标准或扩展; 它只是选择要使用哪种基本语法
预计。 如果你没有给出这些选项,cpp 会从
源文件的扩展名: .c, 的cc, .m或 .S. 其他一些常见的扩展
C++ 和汇编也被识别。 如果 cpp 不能识别扩展名,它
将文件视为 C; 这是最通用的模式。
请注意: 以前版本的 cpp 接受了 -郎 选项同时选择了
语言和标准的一致性级别。 此选项已被删除,因为
它与 -l 选项。
-标准=
-ansi
指定代码应遵循的标准。 目前 CPP 知道 C
和 C++ 标准; 将来可能会添加其他人。
可能是以下之一:
“C90”
“C89”
“iso9899:1990”
1990 年的 ISO C 标准。 c90 是这个版本的习惯简写
标准。
这款 -ansi 选项相当于 -std=c90.
“iso9899:199409”
1990 年 C 标准,1994 年修订。
“iso9899:1999”
“C99”
“iso9899:199x”
“c9x”
修订的 ISO C 标准,于 1999 年 XNUMX 月发布。在发布之前,本
被称为C9X。
“iso9899:2011”
“C11”
“c1x”
修订的 ISO C 标准,于 2011 年 XNUMX 月发布。在发布之前,本
被称为C1X。
“gnu90”
“gnu89”
1990 C 标准加上 GNU 扩展。 这是默认设置。
“gnu99”
“gnu9x”
1999 C 标准加上 GNU 扩展。
“gnu11”
“gnu1x”
2011 C 标准加上 GNU 扩展。
“c++98”
1998 ISO C++ 标准加上修正。
“GNU++98”
与...相同 -std=c++98 加上 GNU 扩展。 这是 C++ 代码的默认设置。
-一世- 拆分包含路径。 指定的任何目录 -I 之前的选项 -一世- 旨在
仅搜索使用“#include”请求的标头文件””; 他们没有被搜索
“#包括文件>". 如果指定了其他目录 -I 之后的选项
-一世-, 这些目录被搜索所有 的#include 指令。
此外, -一世- 禁止使用当前文件目录的目录作为
“#include”的第一个搜索目录文件””. 此选项已被弃用。
-nostdinc
不要在标准系统目录中搜索头文件。 只有目录
您已指定 -I 选项(和当前文件的目录,如果
适当)进行搜索。
-nostdinc++
不要在特定于 C++ 的标准目录中搜索头文件,但仍然
搜索其他标准目录。 (此选项在构建 C++ 时使用
图书馆。)
-包括 文件
流程 文件 好像“#include“file””作为主要来源的第一行出现
文件。 但是,第一个目录搜索 文件 是预处理器的工作
目录 代替 of 包含主源文件的目录。 如果没有找到
在那里,它在 "#include "..."" 搜索链的其余部分中被搜索为
正常。
如果多个 -包括 给出了选项,文件按它们的顺序包含
出现在命令行中。
-宏 文件
完全像 -包括, 除了扫描产生的任何输出 文件 被抛出
离开。 它定义的宏保持定义。 这允许您获取所有宏
来自标题而不处理其声明。
指定的所有文件 -宏 在由指定的所有文件之前处理 -包括.
-irafter DIR
搜索 DIR 对于头文件,但这样做 after 指定的所有目录 -I 和
标准系统目录已用尽。 DIR 被视为一个系统包括
目录。 如果 DIR 以“=”开头,那么“=”将被替换为sysroot
字首; 看 --系统根目录 和 -isysroot.
-前缀 字首
指定 字首 作为后续的前缀 -i 带前缀 选项。 如果前缀
代表一个目录,你应该包括最后的 /.
-i 带前缀 DIR
-iwithprefixbefore DIR
附加 DIR 到先前指定的前缀 -前缀,并添加结果
目录到包含搜索路径。 -iwithprefixbefore 把它放在同一个地方 -I
将; -i 带前缀 把它放在哪里 -irafter 将。
-isysroot DIR
这个选项就像 --系统根目录 选项,但仅适用于头文件(除了
Darwin 目标,它同时适用于头文件和库)。 见
--系统根目录 选项以获取更多信息。
-imultilib DIR
使用 DIR 作为包含特定于目标的 C++ 头文件的目录的子目录。
-ISystem. DIR
搜索 DIR 对于头文件,在指定的所有目录之后 -I 但在此之前
标准系统目录。 将其标记为系统目录,以便获得相同的
应用于标准系统目录的特殊处理。 如果 DIR 开始
使用“=”,那么“=”将被sysroot前缀替换; 看 --系统根目录 和
-isysroot.
-我引用 DIR
搜索 DIR 仅适用于使用“#include”请求的头文件文件””; 他们不是
搜索“#include文件>", 在指定的所有目录之前 -I 在之前
标准系统目录。 如果 DIR 以“=”开头,那么“=”将被替换为
sysroot 前缀; 看 --系统根目录 和 -isysroot.
-f仅指令
预处理时,处理指令,但不展开宏。
选项的行为取决于 -E 和 -f预处理 选项。
在 -E, 预处理仅限于处理诸如“#define”之类的指令,
“#ifdef”和“#error”。 其他预处理器操作,例如宏扩展和
不执行三字符转换。 除此之外 -DD 选项是隐含的
启用。
在 -f预处理, 命令行和大多数内置宏的预定义是
禁用。 处理上下文相关的诸如“__LINE__”之类的宏
一般。 这可以编译以前用“-E”预处理过的文件
-fdirectives-only”。
既 -E 和 -f预处理,规则 -f预处理 取得优先权。 这个
启用对先前使用“-E”预处理的文件的完全预处理
-fdirectives-only”。
-fdollars-in-标识符
接受 $ 在标识符中。
- 扩展标识符
接受标识符中的通用字符名称。 此选项是实验性的; 在一个
GCC 的未来版本,默认情况下会为 C99 和 C++ 启用。
-fno-规范系统标头
预处理时,不要通过规范化缩短系统头路径。
-f预处理
向预处理器指示输入文件已被预处理。 这个
抑制宏扩展、三字符转换、转义换行符拼接等内容,
和处理大多数指令。 预处理器仍然识别并删除
注释,以便您可以传递经过预处理的文件 -C 编译器没有
问题。 在这种模式下,集成的预处理器只不过是一个标记器
对于前端。
-f预处理 如果输入文件具有扩展名之一,则为隐式 .i, .ii or .mi.
这些是 GCC 用于预处理文件的扩展名 -保存临时.
-ftabstop=宽度
设置制表位之间的距离。 这有助于预处理器报告正确的列
警告或错误中的数字,即使选项卡出现在行上。 如果值小于
大于 1 或大于 100,则忽略该选项。 默认值为 8。
-fdebug-cpp
此选项仅对调试 GCC 有用。 当与 -E, 转储调试
有关位置图的信息。 输出中的每个标记前面都有转储
其位置所属的地图。 保存令牌位置的地图转储
将会:
{"P":F ;"F":F ;"L": ;“C”: ;"S": ;"M": ;"E": ,"位置": }
不使用时 -E,此选项无效。
-ftrack-宏扩展[=水平]
跨宏扩展跟踪令牌的位置。 这允许编译器发出
出现编译错误时关于当前宏扩展堆栈的诊断
宏观扩张。 使用此选项会使预处理器和编译器消耗
更多的记忆。 这 水平 参数可用于选择token的精度等级
位置跟踪从而在必要时减少内存消耗。 价值 0 of
水平 取消激活此选项就像没有一样 -ftrack-宏扩展 出现在
命令行。 价值 1 以降级模式跟踪令牌位置,以便
最小的内存开销。 在这种模式下,所有由扩展产生的令牌
类函数宏的参数具有相同的位置。 价值 2 跟踪令牌
位置完全。 这个值是最需要内存的。 当给出这个选项时
无参数,默认参数值为 2.
请注意 -ftrack-macro-expansion=2 默认激活。
-fexec-字符集=字符集
设置执行字符集,用于字符串和字符常量。 默认的
是 UTF-8。 字符集 可以是系统的“iconv”库支持的任何编码
常规。
-fwide-exec-字符集=字符集
设置宽执行字符集,用于宽字符串和字符常量。
默认为 UTF-32 或 UTF-16,以对应于“wchar_t”的宽度为准。 作为
- -fexec 字符集, 字符集 可以是系统的“iconv”支持的任何编码
图书馆例程; 但是,您将遇到不适合的编码问题
正好在“wchar_t”中。
-finput-字符集=字符集
设置输入字符集,用于从输入的字符集翻译过来
文件到 GCC 使用的源字符集。 如果语言环境未指定,或 GCC
无法从语言环境中获取此信息,默认为 UTF-8。 这可以
被语言环境或此命令行选项覆盖。 目前命令
如果存在冲突,则 line 选项优先。 字符集 可以是任何编码
由系统的“iconv”库例程支持。
-fworking-目录
在预处理器输出中启用行标记的生成,这将使编译器
在预处理时知道当前的工作目录。 当这个选项是
启用,预处理器将在初始行标记之后发出第二个行标记
当前工作目录后跟两个斜杠。 GCC 将使用这个
目录,当它存在于预处理输入中时,作为发出的目录
某些调试信息格式的当前工作目录。 这个选项是
如果启用调试信息,则隐式启用,但这可以通过
否定形式 -fno-工作目录。 如果 -P 标志存在于命令中
行,此选项无效,因为不会发出任何“#line”指令。
-fno-显示列
不要在诊断中打印列号。 如果诊断是必要的,这可能是必要的
被不理解列号的程序扫描,例如
德亚格努.
-A 谓词=回答
使用谓词进行断言 谓词 并回答 回答. 这个表格是
优先于旧形式 -A 谓词(回答),这仍然受支持,因为它
不使用外壳特殊字符。
-A -谓词=回答
用谓词取消断言 谓词 并回答 回答.
-dCHARS
字符 是以下一个或多个字符的序列,并且不能是
前面有一个空格。 其他字符由编译器正确解释,或
保留给 GCC 的未来版本,因此被默默忽略。 如果您指定
行为冲突的字符,结果未定义。
M 生成一个列表,而不是正常的输出 #定义 所有的指令
预处理器执行期间定义的宏,包括预定义的
宏。 这使您可以找出在您的版本中预定义的内容
预处理器。 假设你没有文件 foo.h, 命令
触摸 foo.h; cpp -dM foo.h
将显示所有预定义的宏。
如果你使用 -dM 没有 -E 选项, -dM 被解释为的同义词
-fdump-rtl-mach.
D 喜欢 M 除了两个方面:它确实 而不去 包括预定义的宏,它
输出 都 此 #定义 指令和预处理的结果。 两种
输出到标准输出文件。
N 喜欢 D,但只发出宏名称,而不是它们的扩展。
I 输出 的#include 指令以及预处理的结果。
U 喜欢 D 除了仅扩展的宏或测试其定义性的宏
在预处理器指令中,是输出; 输出延迟到使用或
宏测试; 和 #undef 指令也会为测试的宏输出,但是
当时未定义。
-P 禁止在预处理器的输出中生成线标记。 这可能是
在非 C 代码上运行预处理器时很有用,并且将被发送
到可能被行标记混淆的程序。
-C 不要丢弃评论。 所有注释都传递到输出文件,除了
对于已处理指令中的注释,这些注释与指令一起被删除。
使用时应做好副作用的准备 -C; 它导致预处理器
将评论视为其本身的标记。 例如,评论出现在
将是指令行的开始具有将该行变成
普通的源代码行,因为该行的第一个标记不再是 #.
-CC 不要丢弃注释,包括在宏扩展期间。 这就像 -C, 除
包含在宏中的注释也会传递到输出文件中
宏被展开。
除了副作用之外 -C 选项, -CC 选项导致所有 C++ 风格
要转换为 C 样式注释的宏中的注释。 这是为了防止以后
使用该宏无意中注释掉了源代码行的其余部分。
这款 -CC option 通常用于支持 lint 注释。
-传统-cpp
尝试模仿老式 C 预处理器的行为,而不是 ISO C
预处理器。
-三合字母
处理三字符序列。 这些是三个字符的序列,都以
??, 由 ISO C 定义为代表单个字符。 例如, ??/ 看台
\,所以 '??/n' 是换行符的字符常量。 默认情况下,GCC 忽略
三合字母,但在符合标准的模式下,它会转换它们。 见 -标准 和 -ansi
选项。
九个三合字母及其替代品是
三合字母:??( ??) ??< ??> ??= ??/ ??' ??! ??-
替换: [ ] { } # \ ^ | ~
-重新映射
启用特殊代码来解决只允许非常短的文件的文件系统
名称,例如 MS-DOS。
- 帮帮我
--目标帮助
打印描述所有命令行选项的文本,而不是预处理任何内容。
-v 详细模式。 在执行开始时打印出 GNU CPP 的版本号,以及
报告包含路径的最终形式。
-H 除了其他正常活动之外,打印所使用的每个头文件的名称。 每个
名称缩进以显示在 的#include 堆栈是。 预编译头
文件也会被打印出来,即使它们被发现是无效的; 无效的预编译
头文件打印为 ...X 和一个有效的 ...! .
-版
- 版
打印出 GNU CPP 的版本号。 用一个破折号,继续像往常一样预处理。
用两个破折号,立即退出。
通过 附加选项 至 此 汇编
您可以将选项传递给汇编程序。
-哇,选项
通过 选项 作为汇编程序的一个选项。 如果 选项 包含逗号,它被拆分
逗号处的多个选项。
-X汇编程序 选项
通过 选项 作为汇编程序的一个选项。 您可以使用它来提供系统特定的
GCC 无法识别的汇编器选项。
如果要传递带参数的选项,则必须使用 -X汇编程序 两次,
一次用于选项,一次用于参数。
附加选项 链接
当编译器将目标文件链接到可执行文件时,这些选项就会发挥作用
输出文件。 如果编译器没有执行链接步骤,它们就毫无意义。
对象文件名
不以特殊识别后缀结尾的文件名被认为是命名一个
目标文件或库。 (目标文件通过链接器与库区分开来
根据文件内容。)如果链接完成,这些目标文件用作
链接器的输入。
-c
-S
-E 如果使用这些选项中的任何一个,则不会运行链接器,并且目标文件名
不应用作参数。
-l图书馆
-l 图书馆
搜索名为的库 图书馆 链接时。 (第二种选择
库作为单独的参数仅适用于 POSIX 合规性,不推荐使用。)
在命令中编写此选项的位置有所不同; 链接器搜索
并按照指定的顺序处理库和目标文件。 因此, foo.o
-lz 酒吧 搜索图书馆 z 文件后 foo.o 但之前 酒吧。 如果 酒吧 指
功能 z,这些功能可能无法加载。
链接器搜索库的标准目录列表,这实际上是
一个名为 图书馆.a. 链接器然后使用这个文件,就好像它已经被指定一样
正是按名称。
搜索的目录包括几个标准系统目录以及您
指定 -L.
通常以这种方式找到的文件是库文件——其成员为
目标文件。 链接器通过扫描成员来处理存档文件
其中定义了迄今为止已被引用但尚未定义的符号。 但如果
找到的文件是一个普通的目标文件,它以通常的方式链接。 这
使用之间的唯一区别 -l 选项并指定文件名是 -l
围绕着 图书馆 - LIB 和 .a 并搜索几个目录。
-lobjc
你需要这个特殊情况 -l 选项以链接 Objective-C 或
目标 C++ 程序。
-无启动文件
链接时不要使用标准系统启动文件。 标准体系
库是正常使用的,除非 -nostdlib or -无默认库 用来。
-无默认库
链接时不要使用标准系统库。 仅您指定的库
传递给链接器,以及指定系统库链接的选项,例如
作为“-static-libgcc”或“-shared-libgcc”,被忽略。 标准的启动文件是
正常使用,除非 -无启动文件 用来。
编译器可能会生成对“memcmp”、“memset”、“memcpy”和“memmove”的调用。 这些
条目通常由 libc 中的条目解析。 这些入口点应该是
当指定此选项时,通过某种其他机制提供。
-nostdlib
链接时不要使用标准系统启动文件或库。 没有启动
文件,并且只有您指定的库会传递给链接器,以及选项
指定系统库的链接,例如“-static-libgcc”或
“-shared-libgcc”,被忽略。
编译器可能会生成对“memcmp”、“memset”、“memcpy”和“memmove”的调用。 这些
条目通常由 libc 中的条目解析。 这些入口点应该是
当指定此选项时,通过某种其他机制提供。
绕过的标准库之一 -nostdlib 和 -无默认库 is libgcc.a,以
GCC 用来克服特定缺陷的内部子程序库
机器,或某些语言的特殊需求。
在大多数情况下,您需要 libgcc.a 即使您想避免使用其他标准库。
换句话说,当您指定 -nostdlib or -无默认库 你通常应该
指定 -lgcc 以及。 这确保您没有未解析的引用
内部 GCC 库子程序。 (这种内部子程序的一个例子是
__主要的,用于确保调用 C++ 构造函数。)
-馅饼
在支持它的目标上生成位置无关的可执行文件。 对于可预见的
结果,您还必须指定用于编译的相同选项集(-fpie,
-fPIE,或模型子选项)当您指定此链接器选项时。
-r动态
传递旗帜 -出口动态 到 ELF 链接器,在支持它的目标上。 这个
指示链接器将所有符号(不仅是使用过的符号)添加到动态符号中
桌子。 “dlopen”的某些用途需要此选项或允许获取
从程序内回溯。
-s 从可执行文件中删除所有符号表和重定位信息。
-静态的
在支持动态链接的系统上,这会阻止与共享的链接
图书馆。 在其他系统上,此选项无效。
-共享
产生一个共享对象,然后它可以与其他对象链接以形成一个
可执行。 并非所有系统都支持此选项。 为了获得可预测的结果,您必须
还指定用于编译的相同选项集(-fpic, -fPIC, 或模型
子选项)当您指定此链接器选项时。[1]
-共享-libgcc
-静态libgcc
在提供 库 作为共享库,这些选项强制使用
分别是共享版本或静态版本。 如果没有共享版本 库 是
在配置编译器时构建,这些选项无效。
有几种情况应用程序应该使用共享 库
而不是静态版本。 其中最常见的是当应用程序
希望在不同的共享库中抛出和捕获异常。 在这种情况下,
每个库以及应用程序本身都应该使用共享 库.
因此,G++ 和 GCJ 驱动程序会自动添加 -共享-libgcc 每当你建造
共享库或主可执行文件,因为 C++ 和 Java 程序通常使用
例外,所以这是正确的做法。
相反,如果您使用 GCC 驱动程序创建共享库,您可能会发现它们
并不总是与共享链接 库. 如果 GCC 发现,在它的配置
时间,您有一个非 GNU 链接器或一个不支持选项的 GNU 链接器
--eh-帧-hdr,它链接了共享版本 库 进入共享库
默认。 否则,它会利用链接器并优化链接
与共享版本 库, 与 libgcc 的静态版本链接
默认。 这允许异常通过此类共享库传播,而无需
在图书馆加载时产生搬迁成本。
但是,如果库或主可执行文件应该抛出或捕获异常,您
必须使用 G++ 或 GCJ 驱动程序链接它,适用于
程序,或使用选项 -共享-libgcc,这样它就与共享的
库.
-静态-libasan
当。。。的时候 -fsanitize=地址 选项用于链接程序,GCC 驱动程序
自动链接 利巴桑。 如果 利巴桑 可用作共享库,并且
此 -静态的 选项未使用,则此链接针对共享版本 利巴桑.
这款 -静态-libasan 选项指示 GCC 驱动程序链接 利巴桑 静态的,没有
必须静态链接其他库。
-静态libtsan
当。。。的时候 -fsanitize=线程 选项用于链接程序,GCC 驱动程序
自动链接 力赞。 如果 力赞 可用作共享库,并且
此 -静态的 选项未使用,则此链接针对共享版本 力赞.
这款 -静态libtsan 选项指示 GCC 驱动程序链接 力赞 静态的,没有
必须静态链接其他库。
-静态-libstdc++
当。。。的时候 克++ program 用于链接 C++ 程序,它通常会自动链接
驳 库标准++。 如果 库标准++ 可用作共享库,并且 -静态的
选项未使用,则此链接针对共享版本 库标准++。 那是
通常很好。 但是,有时冻结版本是有用的 库标准++
由程序使用,而无需一直到完全静态链接。 这
-静态-libstdc++ 选项指示 克++ 要链接的驱动程序 库标准++ 静态的,没有
必须静态链接其他库。
-象征性的
在构建共享对象时绑定对全局符号的引用。 警告任何
未解析的引用(除非被链接编辑器选项覆盖 -Xlinker -z
-Xlinker 定义)。 只有少数系统支持此选项。
-T 脚本
使用 脚本 作为链接器脚本。 大多数使用该选项的系统都支持此选项
GNU 链接器。 在某些目标上,例如没有操作系统的裸板目标,
此 -T 链接时可能需要选项以避免引用未定义的符号。
-Xlinker 选项
通过 选项 作为链接器的一个选项。 您可以使用它来提供系统特定的
GCC 无法识别的链接器选项。
如果要传递带有单独参数的选项,则必须使用 -Xlinker
两次,一次用于选项,一次用于参数。 例如,要通过 -断言
定义,你必须写 -Xlinker -断言 -Xlinker 定义. 这是行不通的
写 -Xlinker “-断言 定义”,因为这将整个字符串作为
单个参数,这不是链接器所期望的。
使用 GNU 链接器时,通常将参数传递给链接器更方便
选项使用 选项=折扣值 语法而不是作为单独的参数。 例如,你
可以指定 -Xlinker -Map=输出.map 而非 -Xlinker -地图 -Xlinker 输出图.
其他链接器可能不支持命令行选项的这种语法。
-Wl,选项
通过 选项 作为链接器的一个选项。 如果 选项 包含逗号,它被分成
逗号处的多个选项。 您可以使用此语法将参数传递给
选项。 例如, -Wl,-Map,输出.map 通行证 -地图 输出图 到链接器。 什么时候
使用 GNU 链接器,您也可以获得相同的效果 -Wl,-Map = output.map.
注意:在 Ubuntu 8.10 及更高版本中,对于 LDFLAGS,选项 -Wl,-z,relro 用来。
要禁用,请使用 -Wl,-z,诺雷罗.
-u 符号
假装符号 符号 未定义,强制链接库模块以定义
它。 您可以使用 -u 多次使用不同的符号来强制加载
额外的库模块。
附加选项 目录 搜索
这些选项指定用于搜索头文件、库和部件的目录
编译器:
-IDIR
添加目录 DIR 到要搜索的目录列表的头部
文件。 这可用于覆盖系统头文件,替换您自己的
版本,因为在系统头文件之前搜索这些目录
目录。 但是,您不应使用此选项添加包含以下内容的目录
供应商提供的系统头文件(使用 -ISystem. 为了那个原因)。 如果您使用多个
-I 选项,按从左到右的顺序扫描目录; 标准体系
目录紧随其后。
如果标准系统包含目录,或指定的目录 -ISystem.,东京国立癌症中心医院
还指定了 -I是, -I 选项被忽略。 该目录仍在搜索中,但
作为系统目录在系统包含链中的正常位置。 这是为了
确保 GCC 的程序修复有问题的系统头文件和命令
“include_next”指令不会被无意中更改。 如果你真的需要改变
系统目录的搜索顺序,使用 -nostdinc 和 -ISystem. 选项。
-iplugindir=DIR
设置目录搜索通过的插件 -f插件=姓名 而不是
-f插件=径/姓名。所以. 此选项不供用户使用,而仅供
被司机路过。
-我引用DIR
添加目录 DIR 到要搜索的目录列表的头部
仅适用于以下情况的文件 的#include "文件"; 他们没有被搜索 的#include <文件>,
否则就像 -I.
-LDIR
添加目录 DIR 到要搜索的目录列表 -l.
-B字首
此选项指定在哪里可以找到可执行文件、库、包含文件和
编译器本身的数据文件。
编译器驱动程序运行一个或多个子程序 CPP, cc1, as 和 ld.
它尝试 字首 作为它尝试运行的每个程序的前缀,无论有没有
/版本/.
对于每个要运行的子程序,编译器驱动程序首先尝试 -B 前缀,如果有的话。
如果未找到该名称,或者 -B 未指定,驱动程序尝试两种标准
前缀, /usr/库/gcc/ 和 /usr/本地/lib/gcc/. 如果这两者都没有导致
找到的文件名,使用搜索未修改的程序名
在您指定的目录 PATH 环境变量。
编译器检查是否提供的路径 -B 指的是一个目录,和
如有必要,它会在路径末尾添加一个目录分隔符。
-B 有效指定目录名称的前缀也适用于
链接器,因为编译器将这些选项翻译成 -L 链接器的选项。
它们也适用于预处理器中的包含文件,因为编译器会翻译
这些选项变成 -ISystem. 预处理器的选项。 在这种情况下,编译器
附加 包括 到前缀。
运行时支持文件 libgcc.a 也可以搜索使用 -B 前缀,如果
需要。 如果在那里找不到,则尝试上面的两个标准前缀,然后
是全部。 如果通过这些方式找不到该文件,则该文件将被排除在链接之外。
另一种指定前缀的方法很像 -B 前缀是使用环境
变量 GCC_EXEC_PREFIX.
作为一个特殊的kludge,如果路径由 -B is [目录/]舞台N/,其中 N 是一个数字
在 0 到 9 的范围内,那么它被替换为 [目录/]包括. 这是为了帮助引导-
捆绑编译器。
-规格=文件
流程 文件 编译器读入标准后 眼镜 文件,以覆盖
默认值 GCC 驱动程序在确定要传递的开关时使用
至 cc1, cc1plus, as, ld等等。不止一个 -规格=文件 可以在
命令行,从左到右依次处理。
--系统根=DIR
使用 DIR 作为头文件和库的逻辑根目录。 例如,如果
编译器通常在 / usr / include 和图书馆 / usr / lib目录,但
而是搜索 目录/用户/包含 和 目录/用户/库.
如果您同时使用此选项和 -isysroot 选项,然后 --系统根目录 选项
适用于图书馆,但 -isysroot 选项适用于头文件。
GNU 链接器(从 2.16 版开始)对此有必要的支持
选项。 如果你的链接器不支持这个选项,头文件方面
--系统根目录 仍然有效,但图书馆方面没有。
--no-sysroot-后缀
对于某些目标,会在指定的根目录中添加后缀 --系统根目录,
取决于使用的其他选项,例如可以在
目录/后缀/usr/包含 而不是 目录/用户/包含. 此选项禁用添加
这样的后缀。
-一世- 此选项已被弃用。 请用 -我引用 取而代之的是 -I 之前的目录
此 -一世- 并删除 -一世-. 您指定的任何目录 -I 之前的选项
-一世- 仅在以下情况下搜索选项 的#include "文件"; 他们没有被搜查
的#include <文件>.
如果指定了其他目录 -I 之后的选项 -一世-这些
搜索所有目录 的#include 指令。 (按说 所有 -I 目录
是这样使用的。)
此外,该 -一世- 选项禁止使用当前目录(其中
当前输入文件来自)作为第一个搜索目录 的#include "文件".
没有办法覆盖这种效果 -一世-。 同 -一世。 您可以指定搜索
调用编译器时的当前目录。 那不完全是
与默认情况下预处理器所做的相同,但通常令人满意。
-一世- 不禁止将标准系统目录用于头文件。
从而, -一世- 和 -nostdinc 是独立的。
指定 目标 系统 和 编译器 版本
运行 GCC 的通常方法是运行名为 GCC或 -海湾合作委员会 当交叉
编译,或 -海湾合作委员会-版本 运行已安装版本以外的版本
持续。
硬件 型号 和 型号
每个目标机器类型都可以有自己的特殊选项,从 -m, 选择
在各种硬件型号或配置之间——例如,68010 vs 68020,浮动
协处理器或没有。 编译器的单个安装版本可以为任何模型编译
或配置,根据指定的选项。
编译器的一些配置还支持额外的特殊选项,通常用于
与同一平台上的其他编译器兼容。
AAArch64 附加选项
这些选项是为 AArch64 实现定义的:
-mbig-endian
生成大端代码。 这是为 GCC 配置时的默认设置
aarch64_be-*-* 目标。
-mgeneral-regs-仅
生成仅使用通用寄存器的代码。
-小端
生成小端代码。 这是为 GCC 配置时的默认设置
aarch64-*-* 但不是 aarch64_be-*-* 目标。
-mcmodel=微小
为小代码模型生成代码。 程序及其静态定义的符号
彼此之间必须在 1GB 以内。 指针是 64 位的。 程序可以是静态的
或动态链接。 这个模型没有完全实现,主要被视为
小.
-mcmodel=小
为小代码模型生成代码。 程序及其静态定义
符号之间必须在 4GB 之内。 指针是 64 位的。 程序可以
静态或动态链接。 这是默认的代码模型。
-mcmodel=大
为大代码模型生成代码。 这对地址和
节的大小。 指针是 64 位的。 程序只能静态链接。
-严格对齐
不要假设系统会处理未对齐的内存引用。
-momit 叶帧指针
-mno-省略叶帧指针
在叶函数中省略或保留帧指针。 前一种行为是
默认。
-mtls-方言=desc
使用 TLS 描述符作为动态访问 TLS 的线程本地存储机制
变量。 这是默认设置。
-mtls-方言=传统
使用传统的 TLS 作为 TLS 动态访问的线程本地存储机制
变量。
-mfix-皮质-a53-835769
-mno-修复皮质-a53-835769
启用或禁用 ARM Cortex-A53 勘误编号 835769 的解决方法。这
将涉及在内存指令和 64 位之间插入一条 NOP 指令
整数乘法累加指令。
-三月=姓名
指定目标架构的名称,可选后缀一个或多个
特征修饰符。 此选项具有以下形式 -三月=拱{+[没有]特集}*,其中
唯一的价值 拱 is ARMV8-A. 可能的值 特集 记录在
下面分节。
如果指定了冲突的特征修饰符,则使用最右边的特征。
GCC 使用这个名称来确定它在生成时可以发出什么样的指令
汇编代码。 此选项可以与 -单片机=
选项。
-单片机=姓名
指定目标处理器的名称,可选择后缀一个或多个功能
修饰符。 此选项具有以下形式 -单片机=CPU{+[没有]特集}*,在可能的情况下
的值 CPU 旨在 通用, 大. 可能的值 特集 记录在
下面的小节。
如果指定了冲突的特征修饰符,则使用最右边的特征。
GCC 使用这个名称来确定它在生成时可以发出什么样的指令
汇编代码。
-mtune=姓名
指定要为其调整性能的处理器的名称。 代码将被调整
好像目标处理器属于此选项中指定的类型,但仍在使用
与指定的目标处理器兼容的指令 -单片机= 选项。 这个
选项不能以特征修饰符作为后缀。
-行进 和 -微处理器 特征修饰符
使用的特征修饰符 -行进 和 -微处理器 可以是以下之一:
加密
启用加密扩展。 这意味着启用了高级 SIMD。
fp 启用浮点指令。
SIMD
启用高级 SIMD 指令。 这意味着浮点指令是
启用。 这是选项的所有当前可能值的默认值 -行进 和
-单片机=.
适应症 顿悟 附加选项
这些 -m Adapteva Epiphany 定义了选项:
-mhalf-reg-文件
不要在“r32”...“r63”范围内分配任何寄存器。 这允许代码运行
缺少这些寄存器的硬件变体。
-mprefer-short-insn-regs
优先分配允许生成短指令的寄存器。 这个可以
导致指令数增加,因此这可能会减少或增加整体
代码大小。
-mbranch-成本=NUM
将分支的成本设置为大致 NUM “简单”指令。 这个成本只是一个
启发式,不能保证在不同版本之间产生一致的结果。
-mcmove
启用条件移动的生成。
-mnops=NUM
发射 NUM 在每个其他生成的指令之前执行 NOP。
-mno-soft-cmpsf
对于单精度浮点比较,发出“fsub”指令并测试
旗帜。 这比软件比较快,但可能会得到不正确的结果
在存在 NaN 时,或者当比较两个不同的小数时,使得
它们的差值计算为零。 默认是 -msoft-cmpsf,它的用途
较慢但符合 IEEE 标准的软件比较。
-mstack 偏移量=NUM
设置栈顶和栈指针之间的偏移量。 例如,值为 8
意味着叶函数可以使用范围“sp+0...sp+7”中的八个字节
没有堆栈分配。 其他值 8 or 16 未经测试且不太可能
工作。 另请注意,此选项会更改 ABI; 编译一个程序
与编译的库不同的堆栈偏移量通常不会
工作。 如果要评估不同的堆栈偏移量,则此选项很有用
会给你更好的代码,但实际上使用不同的堆栈偏移量来构建
工作程序,建议使用适当的配置工具链
--with-堆栈偏移量=NUM 选项。
-mno-round-最近的
使调度程序假定舍入模式已设置为截断。 这
默认是 -mround-最近的.
-mlong 通话
如果属性没有另外指定,则假设所有调用都可能超出
“b”/“bl”指令的偏移范围,因此加载函数地址
在执行(否则直接)调用之前放入寄存器。 这是默认设置。
-mshort-电话
如果属性没有另外指定,则假设所有直接调用都在范围内
"b" / "bl" 指令,所以使用这些指令进行直接调用。 这
默认是 -mlong 通话.
-msmall16
假设地址可以作为 16 位无符号值加载。 这不适用于
函数地址 -mlong 通话 语义有效。
-mfp-模式=模式
设置浮点单元的流行模式。 这决定了浮动-
在函数调用和返回时提供和预期的点模式。 制作
此模式匹配您在功能启动时主要需要的模式可以使您
通过避免不必要的模式切换,程序更小、更快。
模式 可以设置为以下值之一:
呼叫者
函数入口处的任何模式都有效,并在函数进入时保留或恢复
返回,以及当它调用其他函数时。 这种模式对于编译很有用
您可能想要合并到不同的库或其他编译单元
具有不同流行 FPU 模式的程序,以及能够
使用单个目标文件超过任何额外模式的大小和速度开销
可能需要的切换,与更多的需要的切换相比
特定选择流行的 FPU 模式。
截短
这是用于带有截断(即舍入)的浮点计算的模式
向零)舍入模式。 这包括从浮点数到
整数。
最接近的
这是用于具有舍入到最近或 - 的浮点计算的模式
甚至舍入模式。
INT 这是用于在 FPU 中执行整数计算的模式,例如 integer
乘法或整数乘法累加。
默认是 -mfp-mode=来电者
-mnosplit-lohi
-mno-postinc
-mno-后修改
分别禁用拆分 32 位负载的代码生成调整,
生成后增量地址和生成后修改地址。 这
默认值是 姆斯普利特洛希, -mpost-公司及 -mpost-修改.
-mnovect-双
将首选 SIMD 模式更改为 SImode。 默认是 -mvect-双,它的用途
DImode 作为首选的 SIMD 模式。
-最大向量对齐=NUM
SIMD 矢量模式类型的最大对齐。 NUM 可能是 4 或 8。默认是
8. 请注意,这是 ABI 更改,即使许多库函数接口是
如果他们不在影响大小和/或的地方使用 SIMD 矢量模式,则不受影响
相关类型的对齐。
-msplit-vecmove-早期
在重新加载之前,拆分向量移动到单个单词移动中。 理论上这可以给
更好的寄存器分配,但到目前为止,情况似乎正好相反。
-m1reg-章
指定一个寄存器来保存常数 -1,这使得加载小负
常量和某些位掩码更快。 允许值 章 旨在 r43 和 r63,
指定将该寄存器用作固定寄存器,并且 没有,这意味着没有
寄存器用于此目的。 默认是 -m1reg-无.
ARM 附加选项
这些 -m 选项是为高级 RISC 机器 (ARM) 架构定义的:
-马比=姓名
为指定的 ABI 生成代码。 允许的值为: apcs gnu, 自动售货机, 美联社,
aapcs Linux 和 微信.
-mapcs-框架
为所有生成符合 ARM 过程调用标准的堆栈帧
函数,即使这对于正确执行代码并不是绝对必要的。
指定 -fomit帧指针 使用此选项会导致堆栈帧不被
为叶函数生成。 默认是 -mno-apcs-框架.
-mapcs
这是同义词 -mapcs-框架.
-拇指互通
生成支持在 ARM 和 Thumb 指令集之间调用的代码。
如果没有这个选项,在 v5 之前的架构上,这两个指令集不能
在一个程序中可靠地使用。 默认是 -mno-拇指互操作,由于略
更大的代码生成时 -拇指互通 被指定。 在 AAPCS 配置中
这个选项没有意义。
-mno-sched-序言
防止重新排序函数序言中的指令,或合并
那些指令与函数体中的指令。 这意味着所有
函数从一组可识别的指令开始(或者实际上是一个选择
来自一小组不同的功能序言),并且这些信息可用于
在可执行代码段中定位函数的开头。 默认是
-msched-序言.
-mfloat-abi=姓名
指定要使用的浮点 ABI。 允许的值为: 软, 软体 和
硬.
指定 软 导致 GCC 生成包含对浮动的库调用的输出
点操作。 软体 允许使用硬件浮点生成代码
指令,但仍使用软浮点调用约定。 硬 允许
生成浮点指令并使用特定于 FPU 的调用约定。
默认值取决于特定的目标配置。 请注意,硬浮动
和软浮动 ABI 不兼容链接; 你必须编译你的整个程序
相同的 ABI,并与一组兼容的库链接。
-小端
为以小端模式运行的处理器生成代码。 这是默认设置
所有标准配置。
-mbig-endian
为以大端模式运行的处理器生成代码; 默认是编译
小端处理器的代码。
-mwords-小端
此选项仅适用于为 big-endian 处理器生成代码时。 产生
用于小端字序但大端字节序的代码。 也就是说,一个字节
表格顺序 32107654. 注意:只有在您需要时才应使用此选项
与由不同版本生成的大端 ARM 处理器的代码兼容
2.8 之前的编译器。 此选项现已弃用。
-三月=姓名
这指定了目标 ARM 体系结构的名称。 GCC 使用这个名称来
确定它在生成汇编代码时可以发出什么样的指令。 这个
选项可以与 -单片机= 选项。 允许
名称是: ARMv2, ARMv2a, ARMv3, 手臂v3m, ARMv4, ARMV4T, ARMv5, ARMV5T, ARMV5E,
ARMV5TE, ARMv6, 手臂v6j, ARMv6t2, ARMV6Z, ARMV6ZK, ARMV6-M, ARMv7, ARMV7-A, ARMV7-R,
ARMV7-M, ARMV7E-M ARMV8-A, 微信, iwmmxt2, ep9312.
-march=本地 导致编译器自动检测构建的架构
计算机。 目前,该功能仅在 GNU/Linux 上支持,并非所有
架构被认可。 如果自动检测不成功,则该选项没有
效果。
-mtune=姓名
此选项指定 GCC 应为其调整的目标 ARM 处理器的名称
代码的性能。 对于一些 ARM 实现,更好的性能可以是
使用此选项获得。 允许的名称是: arm2, arm250, arm3, arm6,
arm60, arm600, arm610, arm620, arm7, 臂7米, 臂7d, ARM7DM, ARM7DI, 臂7dmi, arm70,
arm700, ARM700i, arm710, ARM710C, arm7100, arm720, arm7500, ARM7500FE, ARM7TDMI,
ARM7TDMI-S, 手臂710t, 手臂720t, 手臂740t, 强壮有力的手臂, 强臂110, 强臂1100,
强臂1110, arm8, arm810, arm9, 手臂9e, arm920, 手臂920t, 手臂922t, ARM946E-S,
ARM966E-S, ARM968E-S, ARM926EJ-S, 手臂940t, ARM9TDMI, ARM10TDMI, 手臂1020t, ARM1026EJ-S,
手臂10e, 手臂1020e, 手臂1022e, ARM1136J-S, ARM1136JF-S, 核心, mpcorenovfp, ARM1156T2-S,
ARM1156T2F-S, ARM1176JZ-S, ARM1176JZF-S, 皮质A5, 皮质A7, 皮质A8, 皮质A9,
皮质A15, 皮质-r4, 皮质-r4f, 皮质-r5, 皮层m4, 皮层m3, 皮层m1,
皮层m0, 皮质-m0plus, 奇迹-pj4, 比例尺, 微信, iwmmxt2, ep9312, fa526, fa626,
发606te, 发626te, mp626, 发726te.
-mtune=通用-拱 指定 GCC 应调整混合的性能
架构内的处理器 拱. 目的是生成在
当前最流行的处理器,在有利于某些人的优化之间进行平衡
范围内的 CPU,并避免其他 CPU 的性能缺陷。 的影响
随着 CPU 模型的出现和变化,此选项可能会在未来的 GCC 版本中发生变化。
-mtune=本地 导致编译器自动检测构建计算机的 CPU。 在
目前,此功能仅在 GNU/Linux 上支持,并非所有架构都支持
认可。 如果自动检测不成功,则该选项无效。
-单片机=姓名
这指定了目标 ARM 处理器的名称。 GCC 使用此名称来派生
目标 ARM 架构的名称(就像由 -行进) 和 ARM 处理器
要调整性能的类型(就像由 -mtune)。 这个选项在哪里
与 -行进 or -mtune,这些选项优先于
此选项的适当部分。
此选项的允许名称与 -mtune.
-mcpu=通用-拱 也是允许的,等价于 -三月=拱
-mtune=通用-拱。 看 -mtune 获取更多信息。
-mcpu=本地 导致编译器自动检测构建计算机的 CPU。 在
目前,此功能仅在 GNU/Linux 上支持,并非所有架构都支持
认可。 如果自动检测不成功,则该选项无效。
-mfpu=姓名
这指定了可用的浮点硬件(或硬件仿真)
目标。 允许的名称是: 虚拟机, vfpv3, vfpv3-fp16, vfpv3-d16, vfpv3-d16-fp16,
vfpv3xd, vfpv3xd-fp16, 氖, 霓虹-fp16, vfpv4, vfpv4-d16, fpv4-sp-d16, 霓虹灯-vfpv4,
fp-armv8, 霓虹灯-fp-armv8及 加密霓虹灯-fp-armv8.
If -msoft-浮动 is specified 这指定了浮点值的格式。
如果所选的浮点硬件包括 NEON 扩展(例如 -mfpu=氖),
请注意,浮点运算不是由 GCC 的自动矢量化传递生成的
除非 -funsafe-数学优化 也有规定。 这是因为 NEON 硬件
没有完全实现浮点运算的 IEEE 754 标准(在
特定的非正规值被视为零),因此使用 NEON 指令可能
导致精度损失。
-mfp16-格式=姓名
指定“__fp16”半精度浮点类型的格式。 允许
名字是 没有, IEEE及 替代; 默认是 没有,在这种情况下“__fp16”
类型未定义。
-m结构大小边界=n
所有结构和联合的大小四舍五入为数量的倍数
此选项设置的位。 允许的值为 8、32 和 64。默认值
不同的工具链有所不同。 对于 COFF 目标工具链,默认值为
8. 仅当底层 ABI 支持时才允许值为 64。
指定更大的数字可以生成更快、更高效的代码,但也可以
增加程序的大小。 不同的值可能不兼容。
用一个值编译的代码不一定能与代码或库一起工作
如果它们使用结构或联合交换信息,则使用另一个值编译。
-mabort-on-return
在“noreturn”函数的末尾生成对函数“abort”的调用。 这是
如果函数试图返回则执行。
-mlong 通话
-mno-长通话
告诉编译器通过首先加载地址来执行函数调用
函数写入寄存器,然后在该寄存器上执行子程序调用。 这个
如果目标函数位于 64 兆字节寻址范围之外,则需要切换
子程序调用指令的基于偏移量版本的范围。
即使启用了这个开关,也不是所有的函数调用都会变成长调用。
启发式是静态函数,具有 短线 属性,
作用域内的函数 #pragma 无长通话 指令,和
其定义已在当前编译中编译的函数
单位不会变成长通话。 这条规则的例外是弱
函数定义,函数 长话 属性或 部分 属性,
和范围内的功能 #pragma 长话短说 指令总是
变成了长时间的通话。
默认情况下不启用此功能。 指定 -mno-长通话 恢复
默认行为,就像将函数调用放在 a 的范围内一样 #pragma
长通话关闭 指示。 请注意,这些开关对编译器的方式没有影响
生成代码以通过函数指针处理函数调用。
-ms单图片库
将用于 PIC 寻址的寄存器视为只读,而不是将其加载到
每个功能的序言。 运行时系统负责初始化这个
在执行开始之前注册一个适当的值。
-mpic-寄存器=章
指定用于 PIC 寻址的寄存器。 对于标准 PIC 基本情况,
默认将是由编译器确定的任何合适的寄存器。 对于单个 PIC 底座
情况下,默认为 R9 如果目标是基于 EABI 的或启用了堆栈检查,
否则默认是 R10.
-mpoke-功能名称
将每个函数的名称写入文本部分,直接位于函数之前
序幕。 生成的代码类似于:
t0
.ascii "arm_poke_function_name", 0
。对齐
t1
.word 0xff000000 + (t1 - t0)
arm_poke_function_name
移动 ip, sp
stmfd sp!, {fp, ip, lr, pc}
副 fp, ip, #4
执行堆栈回溯时,代码可以检查存储在“fp +
0”。如果跟踪功能然后查看位置“pc - 12”并且前 8 位是
设置,然后我们知道在此之前嵌入了一个函数名称
位置并且长度为“((pc[-3]) & 0xff000000)”。
-拇指
-马尔姆
在生成在 ARM 和 Thumb 状态下执行的代码之间进行选择。 默认为
大多数配置是生成在ARM状态下执行的代码,但默认
可以通过配置 GCC 来更改 --with-模式=州 配置选项。
-mtpcs-帧
生成符合 Thumb 过程调用标准的堆栈帧
所有非叶函数。 (叶函数是一个不调用任何其他函数的函数
函数。)默认是 -mno-tpcs-框架.
-mtpcs-叶框
生成符合 Thumb 过程调用标准的堆栈帧
所有叶函数。 (叶函数是不调用任何其他函数的函数。)
默认是 -mno-apcs-叶子框架.
-mcallee-超级互通
为正在编译的文件中的所有外部可见函数提供一条 ARM 指令
设置在执行其余功能之前切换到 Thumb 模式的标头。
这允许从非互通代码调用这些函数。 这个选项是
在 AAPCS 配置中无效,因为默认情况下启用互通。
-mcaller-超级互通
允许通过函数指针(包括虚函数)调用正确执行
无论目标代码是否已编译为互通。
如果此选项,则执行函数指针的成本会有很小的开销
已启用。 此选项在 AAPCS 配置中无效,因为互通是
默认启用。
-mtp=姓名
指定线程本地存储指针的访问模型。 有效的模型是
软, 生成对“__aeabi_read_tp”的调用, cp15, 获取线程
直接来自“cp15”的指针(在 arm6k 架构中支持),以及 汽车,这
对所选处理器使用最佳可用方法。 默认设置是
汽车.
-mtls-方言=方言
指定用于访问线程本地存储的方言。 二 方言S是
支持的 - -GNU 和 GNU2。 该 GNU 方言选择原始的 GNU 方案
支持本地和全局动态 TLS 模型。 这 GNU2 方言选择GNU
描述符方案,为共享库提供更好的性能。 GNU
描述符方案与原始方案兼容,但确实需要新的
汇编器、链接器和库支持。 初始和本地 exec TLS 模型是
不受此选项的影响并始终使用原始方案。
-mword-重定位
仅对字大小的值(即 R_ARM_ABS32)生成绝对重定位。 这是
默认情况下在运行时加载程序强加的目标(uClinux、SymbianOS)上启用
这个限制,当 -fpic or -fPIC 已指定。
-mfix-皮质-m3-ldrd
当使用“ldrd”指令时,某些 Cortex-M3 内核可能会导致数据损坏
使用重叠的目标寄存器和基址寄存器。 此选项可避免生成
这些说明。 默认情况下启用此选项 -mcpu=皮质-m3 is
指定的。
-munaligned-访问
-mno-未对齐访问
启用(或禁用)从地址读取和写入 16 位和 32 位值
不是 16 位或 32 位对齐的。 默认情况下,所有未对齐访问都被禁用
pre-ARMv6 和所有 ARMv6-M 架构,并为所有其他架构启用。 如果
未启用未对齐访问,则将访问打包数据结构中的字
一次一个字节。
ARM 属性“Tag_CPU_unaligned_access”将在生成的目标文件中设置
为真或假,取决于此选项的设置。 如果未对齐
访问被启用,那么预处理器符号“__ARM_FEATURE_UNALIGNED”也将是
定义。
AVR 附加选项
这些选项是为 AVR 实现定义的:
-mmcu=MCU
指定 Atmel AVR 指令集架构 (ISA) 或 MCU 类型。
此选项的默认值为@tie{}"avr2"。
GCC 支持以下 AVR 设备和 ISA:
“avr2”
具有高达 8@tie{}KiB 程序存储器的“经典”设备。 MCU@tie{}="attiny22",
"attiny26", "at90c8534", "at90s2313", "at90s2323", "at90s2333", "at90s2343",
"at90s4414", "at90s4433", "at90s4434", "at90s8515", "at90s8535".
“avr25”
“经典”设备具有高达 8@tie{}KiB 的程序存储器和“MOVW”
指令。 MCU@tie{}= "ata5272", "ata6289", "attiny13", "attiny13a",
“attiny2313”、“attiny2313a”、“attiny24”、“attiny24a”、“attiny25”、“attiny261”、
“attiny261a”、“attiny43u”、“attiny4313”、“attiny44”、“attiny44a”、“attiny45”、
“attiny461”、“attiny461a”、“attiny48”、“attiny84”、“attiny84a”、“attiny85”、
“attiny861”、“attiny861a”、“attiny87”、“attiny88”、“at86rf401”。
“avr3”
具有 16@tie{}KiB 高达 64@tie{}KiB 程序存储器的“经典”设备。
MCU@tie{}= "at43usb355", "at76c711"。
“avr31”
具有 128@tie{}KiB 程序存储器的“经典”设备。 MCU@tie{}="atmega103",
“at43usb320”。
“avr35”
“经典”设备具有 16@tie{}KiB 高达 64@tie{}KiB 的程序存储器和
“MOVW”指令。 MCU@tie{}= "ata5505", "atmega16u2", "atmega32u2",
“atmega8u2”、“attiny1634”、“attiny167”、“at90usb162”、“at90usb82”。
“avr4”
具有高达 8@tie{}KiB 程序存储器的“增强型”设备。 MCU@tie{}="ata6285",
"ata6286", "atmega48", "atmega48a", "atmega48p", "atmega48pa", "atmega8",
"atmega8a", "atmega8hva", "atmega8515", "atmega8535", "atmega88", "atmega88a",
"atmega88p", "atmega88pa", "at90pwm1", "at90pwm2", "at90pwm2b", "at90pwm3",
“at90pwm3b”、“at90pwm81”。
“avr5”
具有 16@tie{}KiB 至 64@tie{}KiB 程序存储器的“增强型”设备。
MCU@tie{}= "ata5790", "ata5790n", "ata5795", "atmega16", "atmega16a",
"atmega16hva", "atmega16hva2", "atmega16hvb", "atmega16hvbrevb", "atmega16m1",
"atmega16u4", "atmega161", "atmega162", "atmega163", "atmega164a", "atmega164p",
"atmega164pa", "atmega165", "atmega165a", "atmega165p", "atmega165pa",
"atmega168", "atmega168a", "atmega168p", "atmega168pa", "atmega169", "atmega169a",
"atmega169p", "atmega169pa", "atmega26hvg", "atmega32", "atmega32a", "atmega32c1",
"atmega32hvb", "atmega32hvbrevb", "atmega32m1", "atmega32u4", "atmega32u6",
"atmega323", "atmega324a", "atmega324p", "atmega324pa", "atmega325", "atmega325a",
"atmega325p", "atmega3250", "atmega3250a", "atmega3250p", "atmega3250pa",
"atmega328", "atmega328p", "atmega329", "atmega329a", "atmega329p", "atmega329pa",
"atmega3290", "atmega3290a", "atmega3290p", "atmega3290pa", "atmega406",
"atmega48hvf", "atmega64", "atmega64a", "atmega64c1", "atmega64hve", "atmega64m1",
"atmega64rfa2", "atmega64rfr2", "atmega640", "atmega644", "atmega644a",
"atmega644p", "atmega644pa", "atmega645", "atmega645a", "atmega645p",
"atmega6450", "atmega6450a", "atmega6450p", "atmega649", "atmega649a",
"atmega649p", "atmega6490", "atmega6490a", "atmega6490p", "at90can32",
"at90can64", "at90pwm161", "at90pwm216", "at90pwm316", "at90scr100", "at90usb646",
“at90usb647”、“at94k”、“m3000”。
“avr51”
具有 128@tie{}KiB 程序存储器的“增强型”设备。 MCU@tie{}="atmega128",
"atmega128a", "atmega128rfa1", "atmega1280", "atmega1281", "atmega1284",
"atmega1284p", "at90can128", "at90usb1286", "at90usb1287".
“avr6”
具有 3 字节 PC 的“增强型”设备,即超过 128@tie{}KiB 的程序
记忆。 MCU@tie{}= "atmega2560", "atmega2561"。
“avrxmega2”
“XMEGA”设备具有超过 8@tie{}KiB 和高达 64@tie{}KiB 的程序存储器。
MCU@tie{}= "atmxt112sl", "atmxt224", "atmxt224e", "atmxt336s", "atxmega16a4",
"atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16x1", "atxmega32a4",
"atxmega32a4u", "atxmega32c4", "atxmega32d4", "atxmega32e5", "atxmega32x1".
“avrxmega4”
具有超过 64@tie{}KiB 和高达 128@tie{}KiB 的程序的“XMEGA”设备
记忆。 MCU@tie{}= "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1",
"atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4".
“avrxmega5”
具有超过 64@tie{}KiB 和高达 128@tie{}KiB 的程序的“XMEGA”设备
内存和超过 64@tie{}KiB 的 RAM。 MCU@tie{}= "atxmega64a1",
“atxmega64a1u”。
“avrxmega6”
“XMEGA”设备具有超过 128@tie{}KiB 的程序存储器。 MCU@领带{}=
“atmxt540s”、“atmxt540sreva”、“atxmega128a3”、“atxmega128a3u”、“atxmega128b1”、
"atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3",
"atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b",
"atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3",
“atxmega384d3”。
“avrxmega7”
“XMEGA”设备具有超过 128@tie{}KiB 的程序存储器和超过
64@tie{}KiB 的 RAM。 MCU@tie{}= "atxmega128a1", "atxmega128a1u", "atxmega128a4u"。
“avr1”
该 ISA 由最小的 AVR 内核实现,仅支持汇编程序。
MCU@tie{}= "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200"。
-积累参数
累积传出函数参数并获取/释放所需的堆栈空间
在函数序言/结语中传出函数参数一次。 如果没有这个选项,
传出参数在调用函数之前被推送并在之后弹出。
在函数调用之后弹出参数在 AVR 上可能很昂贵,因此
积累堆栈空间可能会导致较小的可执行文件,因为参数需要
在这样的函数调用后不会从堆栈中删除。
此选项可以减少执行多次调用的函数的代码大小
在堆栈上获取参数的函数,就像对类似 printf 的函数的调用一样。
-mbranch-成本=成本
将条件分支指令的分支成本设置为 成本. 合理的价值观
成本 是小的非负整数。 默认分支成本为 0。
-mcall-序言
函数序言/尾声被扩展为对适当子程序的调用。 代码
尺寸更小。
-mint8
假设“int”是 8 位整数。 这会影响所有类型的大小:“char”为 1
字节,一个“int”是1个字节,一个“long”是2个字节,而“long long”是4个字节。 请
请注意,此选项不符合 C 标准,但会导致较小的
代码大小。
-mno-中断
生成的代码与硬件中断不兼容。 代码量更小。
-放松
尝试替换“CALL”resp。 “JMP”指令由较短的“RCALL”resp。 “RJMP”
说明(如果适用)。 设置“-mrelax”只是将“--relax”选项添加到
调用链接器时的链接器命令行。
跳转松弛由链接器执行,因为之前不知道跳转偏移量
代码位于。 所以编译器生成的汇编代码是一样的,
但可执行文件中的指令可能与汇编程序中的指令不同
码。
如果需要链接器存根,则必须打开松弛,请参阅“EIND”部分和
下面的链接器存根。
-msp8
将堆栈指针寄存器视为一个 8 位寄存器,即假设高字节为
堆栈指针为零。 通常,您不需要手动设置此选项。
编译器在内部使用此选项来选择和构建多库
架构“avr2”和“avr25”。 这些架构混合了有和没有的设备
“SPH”。 对于“-mmcu=avr2”或“-mmcu=avr25”以外的任何设置,编译器驱动程序
将从编译器本身的命令行中添加或删除此选项,因为
编译器然后知道设备或架构是否有一个 8 位堆栈指针,因此
是否没有“SPH”寄存器。
-严格-X
以硬件建议的方式使用地址寄存器“X”。 这意味着“X”是
仅用于间接寻址、后递增或前递减寻址。
如果没有这个选项,“X”寄存器可以像“Y”或“Z”一样使用
然后由附加指令模拟。 例如,加载一个值
“X+const”用一个小的非负“const < 64”寻址到寄存器 Rn is
表现为
adiw r26, const ; X += 常量
编号, X ; = *X
sbiw r26, const ; X -= 常量
-mtiny-stack
仅更改堆栈指针的低 8@tie{} 位。{}
-Waddr-空间转换
在结果地址的情况下警告地址空间之间的转换
空间不包含在传入的地址空间中。
“EIND”和具有超过 128 Ki 字节闪存的设备
实现中的指针为 16@tie{} 位宽。 函数或标签的地址
表示为字地址,以便间接跳转和调用可以针对任何代码
地址在 64@tie{}Ki 字范围内。{}
为了便于在超过 128@tie{}Ki 字节的设备上进行间接跳转
程序存储空间,有一个称为“EIND”的特殊功能寄存器,用作
当“EICALL”或“EIJMP”指令被执行时,目标地址的最重要部分
用过的。
这些设备上的间接跳转和调用由编译器按如下方式处理,并且是
受到一些限制:
· 编译器从不设置“EIND”。
· 编译器在“EICALL”/“EIJMP”指令中隐含地使用“EIND”,或者可能读取
直接“EIND”以通过“RET”模拟间接调用/跳转
指令。
· 编译器假定“EIND”在启动代码期间或在
应用。 特别是,“EIND”不会在函数或中断中保存/恢复
服务例行序幕/尾声。
· 对于函数的间接调用和计算的 goto,链接器生成 存根. 存根
有时也被称为跳板 蹦床. 因此,间接调用/跳转跳转到
这样的存根。 存根包含到所需地址的直接跳转。
· 必须打开链接器松弛,以便链接器生成存根
正确的所有情况。 请参阅编译器选项“-mrelax”和 linler 选项
“ - 放松”。 在某些极端情况下,链接器应该生成存根,但
没有放松并且没有有用的错误消息就中止。
· 默认链接描述文件是为“EIND = 0”的代码安排的。 如果代码应该
要使用“EIND != 0”进行设置,必须按顺序使用自定义链接器脚本
将名称以“.trampolines”开头的部分放入其中
“EIND”指向。
· 来自 libgcc 的启动代码从不设置“EIND”。 请注意,启动代码是一个混合
来自 libgcc 和 AVR-LibC 的代码。 AVR-LibC对“EIND”的影响,见AVR-
LibC 用户手册 ("http://nongnu.org/avr-libc/user-manual/“)。
· 用户特定的启动代码提前设置“EIND”是合法的,例如通过
位于“.init3”部分的初始化代码的方式。 这样的代码运行在
初始化 RAM 并调用构造函数的通用启动代码,但在
来自 AVR-LibC 的启动代码将“EIND”设置为向量表所在的段
位于。
#包括
静态空隙
__attribute__((section(".init3"),naked,used,no_instrument_function))
init3_set_eind(无效)
{
__asm 易失性 ("ldi r24,pm_hh8(__trampolines_start)\n\t"
"out %i0,r24" :: "n" (&EIND) : "r24","memory");
}
“__trampolines_start”符号在链接描述文件中定义。
· 如果满足以下两个条件,则链接器会自动生成存根
遇见:
——
(短缺 生成 存根) 像这样:
LDI r24, lo8(gs( ))
LDI r25, hi8(gs( ))
——
学校以外 存根所在的段。
· 编译器在以下情况下为代码标签发出这样的“gs”修饰符:
——
——
—— -mcall-序言>
命令行选项。
——
您可以指定的表 -fno-跳转表 命令行选项。
——
——
· 像这样跳转到非符号地址 而不去 支持:
int main(无效)
{
/* 在字地址 0x2 处调用函数 */
返回 ((int(*)(void)) 0x2)();
}
相反,必须设置存根,即必须通过符号调用该函数
(示例中的“func_4”):
int main(无效)
{
外部 int func_4 (void);
/* 在字节地址 0x4 处调用函数 */
返回 func_4();
}
并且应用程序与“-Wl,--defsym,func_4=0x4”链接。 或者,“func_4”
可以在链接描述文件中定义。
“RAMPD”、“RAMPX”、“RAMPY”和“RAMPZ”特殊功能寄存器的处理
某些 AVR 设备支持大于可访问的 64@tie{}KiB 范围的内存
带有 16 位指针。 要访问此 64@tie{}KiB 范围之外的内存位置,
“RAMP”寄存器的内容用作地址的高位部分:“X”、“Y”、“Z”
地址寄存器与“RAMPX”、“RAMPY”、“RAMPZ”特殊功能串联
分别注册以获得宽地址。 同样,“RAMPD”与
直接寻址。
· 启动代码用零初始化“RAMP”特殊功能寄存器。
· 如果一个 AVR 命名 地址 空间,命名 地址 空间 除了通用或“__flash”是
使用,然后在操作前根据需要设置“RAMPZ”。
· 如果设备支持大于64@tie{KiB}的RAM并且编译器需要改变
“RAMPZ”完成一次操作,操作后“RAMPZ”复位为零。
· 如果设备带有特定的“RAMP”寄存器,则 ISR 序言/尾声
保存/恢复该 SFR 并用零初始化它以防 ISR 代码可能
(隐含地)使用它。
· GCC 不支持 AVR 目标的 RAM 大于 64@tie{KiB}。 如果你使用
内联汇编器从 16 位地址范围之外的位置读取并更改
“RAMP”寄存器之一,您必须在访问后将其重置为零。
AVR 内置宏
GCC 定义了几个内置的宏,以便用户代码可以测试是否存在或
缺乏特征。 几乎所有以下内置宏都是从设备推导出来的
功能,因此由“-mmcu=”命令行选项触发。
有关更多 AVR 特定的内置宏,请参阅 AVR 命名 地址 余位 和 AVR 内建的
功能.
“__AVR_ARCH__”
内置宏,可解析为标识体系结构的十进制数和
取决于“-mmcu=微控制器” 选项。 可能的值为:
2,25,3,31,35,4,5,51,6,102,104,105,106,107
MCU="avr2", "avr25", "avr3", "avr31", "avr35", "avr4", "avr5", "avr51", "avr6",
分别为“avrxmega2”、“avrxmega4”、“avrxmega5”、“avrxmega6”、“avrxmega7”。 如果 MCU
指定一个设备,相应地设置这个内置宏。 例如,与
“-mmcu=atmega8”宏将定义为 4。
“__AVR_设备__"
设置“-mmcu=设备” 定义这个反映设备名称的内置宏。
例如,“-mmcu=atmega8”定义了内置宏“__AVR_ATmega8__”,
“-mmcu=attiny261a”定义了“__AVR_ATtiny261A__”等。
内置宏的名称遵循方案“__AVR_设备__" 哪里 设备 是
设备名称来自 AVR 用户手册。 和...之间的不同 设备 在内置
宏和 设备 在“-mmcu=设备” 是后者总是小写。
If 设备 不是设备而只是像“avr51”这样的核心架构,这个宏将
不被定义。
“__AVR_XMEGA__”
设备/架构属于 XMEGA 设备系列。
“__AVR_HAVE_ELPM__”
该设备具有“ELPM”指令。
“__AVR_HAVE_ELPMX__”
该设备具有“ELPM Rn,Z" 和“ELPM Rn,Z+" 指示。
“__AVR_HAVE_MOVW__”
该设备具有“MOVW”指令来执行 16 位寄存器寄存器移动。
“__AVR_HAVE_LPMX__”
该设备具有“LPM Rn,Z" 和“LPM Rn,Z+" 指示。
“__AVR_HAVE_MUL__”
该设备具有硬件乘法器。
“__AVR_HAVE_JMP_CALL__”
该设备具有“JMP”和“CALL”指令。 这是具有以下功能的设备的情况
至少 16@tie{}KiB 的程序存储器。
“__AVR_HAVE_EIJMP_EICALL__”
“__AVR_3_BYTE_PC__”
该设备具有“EIJMP”和“EICALL”指令。 这是设备的情况
具有超过 128@tie{}KiB 的程序存储器。 这也意味着程序
计数器 (PC) 是 3@tie{} 字节宽。{}
“__AVR_2_BYTE_PC__”
程序计数器 (PC) 是 2@tie{} 字节宽。 这是具有高达
128@tie{}KiB 的程序存储器。
“__AVR_HAVE_8BIT_SP__”
“__AVR_HAVE_16BIT_SP__”
堆栈指针 (SP) 寄存器被视为 8 位和 16 位寄存器
编译器。 这些宏的定义受“-mtiny-stack”影响。
“__AVR_HAVE_SPH__”
“__AVR_SP8__”
该设备具有 SPH(堆栈指针的高位部分)特殊功能寄存器或具有
一个 8 位堆栈指针,分别。 这些宏的定义受
“-mmcu=”,在“-mmcu=avr2”和“-mmcu=avr25”的情况下也由“-msp8”。
“__AVR_HAVE_RAMPD__”
“__AVR_HAVE_RAMPX__”
“__AVR_HAVE_RAMPY__”
“__AVR_HAVE_RAMPZ__”
该器件具有“RAMPD”、“RAMPX”、“RAMPY”、“RAMPZ”特殊功能寄存器,
。
“__NO_INTERRUPTS__”
这个宏反映了“-mno-interrupts”命令行选项。
“__AVR_ERRATA_SKIP__”
“__AVR_ERRATA_SKIP_JMP_CALL__”
某些 AVR 设备(AT90S8515、ATmega103)不得跳过 32 位指令,因为
硬件错误。 跳过指令是“SBRS”、“SBRC”、“SBIS”、“SBIC”和“CPSE”。
第二个宏仅在还设置了“__AVR_HAVE_JMP_CALL__”时才定义。
"__AVR_SFR_OFFSET__=抵消”
可以像“IN”一样直接寻址I/O特殊功能寄存器的指令,
“OUT”、“SBI”等可以使用不同的地址,就好像被指令寻址一样
访问 RAM,如“LD”或“STS”。 此偏移量取决于设备架构,并具有
从 RAM 地址中减去以获得相应的 I/O@tie{} 地址。{}
“__WITH_AVRLIBC__”
编译器配置为与 AVR-Libc 一起使用。 见
“--with-avrlibc”配置选项。
Blackfin处理器 附加选项
-单片机=CPU[-修订版]
指定目标 Blackfin 处理器的名称。 目前, CPU 可以是其中之一
bf512, bf514, bf516, bf518, bf522, bf523, bf524, bf525, bf526, bf527, bf531, bf532,
bf533, bf534, bf536, bf537, bf538, bf539, bf542, bf544, bf547, bf548, bf549, BF542米,
BF544米, BF547米, BF548米, BF549米, bf561, bf592.
可选的 修订版 指定目标 Blackfin 的硅版本
处理器。 已启用可用于目标芯片修订版的任何变通方法。
If 修订版 is 没有,没有启用任何解决方法。 如果 修订版 is 任何所有
启用了目标处理器的变通方法。 “__SILICON_REVISION__”宏
定义为两个十六进制数字,代表主次编号
硅改版。 如果 修订版 is 没有,“__SILICON_REVISION__”未定义。
If 修订版 is 任何,“__SILICON_REVISION__”定义为0xffff。 如果这
可选 修订版 未使用,GCC 假定最新的已知硅版本
目标 Blackfin 处理器。
GCC 为指定的对象定义了一个预处理器宏 CPU。 对于 小精灵 工具链,
这个选项会导致 libgloss 提供的硬件 BSP 被链接,如果 -msim is
没有给。
如果没有这个选项, bf532 默认情况下用作处理器。
请注意,支持 bf561 不完整。 为了 bf561,只有预处理器宏是
定义。
-msim
指定程序将在模拟器上运行。 这导致模拟器
由 libgloss 提供的 BSP 链接。此选项仅对 小精灵
工具链。 某些其他选项,例如 -mid-共享库 和 -mfdpic, 暗示
-msim.
-momit 叶帧指针
不要将帧指针保存在叶函数的寄存器中。 这避免了
保存、设置和恢复帧指针的指令,并制作一个额外的寄存器
在叶函数中可用。 选项 -fomit帧指针 删除框架
所有函数的指针,这可能会使调试更加困难。
-mspecld-异常
启用后,编译器确保生成的代码不包含
跳转指令后的推测加载。 如果使用此选项,
“__WORKAROUND_SPECULATIVE_LOADS”已定义。
-mno-specld-异常
不要生成额外的代码来防止发生推测性加载。
-mcsync-异常
启用后,编译器可确保生成的代码不包含 CSYNC 或
SSYNC 指令在条件分支后过早。 如果使用此选项,
“__WORKAROUND_SPECULATIVE_SYNCS”已定义。
-mno-csync-异常
不要生成额外的代码来防止 CSYNC 或 SSYNC 指令也发生
在条件分支之后不久。
-mlow-64k
启用后,编译器可以自由地利用整个
程序适合低 64k 的内存。
-mno-低-64k
假设程序是任意大的。 这是默认设置。
-mstack-检查-l1
使用 uClinux 放入 L1 暂存器内存的信息进行堆栈检查
核心。
-mid-共享库
通过库 ID 方法生成支持共享库的代码。 这允许
用于在没有虚拟内存的环境中就地执行和共享库
管理。 这个选项意味着 -fPIC。 有了 小精灵 目标,这个选项意味着
-msim.
-mno-id-共享库
生成不假定正在使用基于 ID 的共享库的代码。 这是
默认值。
-mleaf-id-共享库
通过库 ID 方法生成支持共享库的代码,但假设
该库或可执行文件不会链接到任何其他 ID 共享库。
这允许编译器使用更快的代码进行跳转和调用。
-mno-leaf-id-共享库
不要假设正在编译的代码不会链接到任何 ID 共享库。
为跳转和调用insns生成较慢的代码。
-mshared-library-id=n
指定正在编译的基于 ID 的共享库的标识号。
指定值 0 会生成更紧凑的代码; 指定其他值 force
将该数字分配给当前图书馆,但不再是空间或时间-
比省略此选项更有效。
-msep-数据
生成允许数据段位于不同内存区域的代码
从文本段。 这允许在不需要的环境中就地执行
通过消除针对文本部分的重定位来进行虚拟内存管理。
-mno-sep-数据
生成假定数据段跟在文本段之后的代码。 这是
默认值。
-mlong 通话
-mno-长通话
告诉编译器通过首先加载地址来执行函数调用
函数写入寄存器,然后在该寄存器上执行子程序调用。 这个
如果目标函数位于 24 位寻址范围之外,则需要切换
子程序调用指令的基于偏移量的版本。
默认情况下不启用此功能。 指定 -mno-长通话 恢复
默认行为。 请注意,这些开关对编译器生成的方式没有影响
通过函数指针处理函数调用的代码。
-mfast-fp
与快速浮点库链接。 这个库放松了一些 IEEE
浮点标准用于根据非数字 (NAN) 检查输入的规则,在
表现的兴趣。
-minline-plt
在对未知函数的函数调用中启用 PLT 条目的内联
本地绑定。 没有它就没有效果 -mfdpic.
-多核
为多核 Blackfin 处理器构建独立应用程序。 此选项导致
正确的启动文件和链接脚本支持使用的多核,并定义
宏“__BFIN_MULTICORE”。 它只能与 -单片机=bf561[-修订版].
此选项可用于 -mcorea or -mcoreb,它选择一个应用程序 -
每核编程模型。 没有 -mcorea or -mcoreb是,
使用单应用/双核编程模型。 在该模型中,主要
Core B 的函数应命名为“coreb_main”。
如果未使用此选项,则使用单核应用程序编程模型。
-mcorea
使用一个应用程序时为 BF561 的核心 A 构建一个独立的应用程序
核心编程模型。 使用适当的启动文件和链接脚本来支持 Core
A、定义了宏“__BFIN_COREA”。 此选项只能用于
与 -多核.
-mcoreb
使用一个应用程序时,为 BF561 的 Core B 构建一个独立的应用程序
核心编程模型。 使用适当的启动文件和链接脚本来支持 Core
B、定义了宏“__BFIN_COREB”。 使用此选项时,“coreb_main”
应该使用而不是“main”。 此选项只能与
-多核.
-msdram
为 SDRAM 构建一个独立的应用程序。 使用了正确的启动文件和链接脚本
将应用程序放入SDRAM,并定义宏“__BFIN_SDRAM”。 这
加载程序应在加载应用程序之前初始化 SDRAM。
-micplb
假设在运行时启用了 ICPLB。 这对某些异常有影响
解决方法。 对于 Linux 目标,默认是假设启用了 ICPLB; 为了
独立应用程序默认关闭。
C6X 附加选项
-三月=姓名
这指定了目标架构的名称。 GCC 使用这个名称来确定
生成汇编代码时可以发出什么样的指令。 允许
名称是: 62, 64, c64x+, 67, c67x+, 674.
-mbig-endian
为大端目标生成代码。
-小端
为小端目标生成代码。 这是默认设置。
-msim
选择适合模拟器的启动文件和链接描述文件。
-msdata=默认
将小的全局和静态数据放入 .neardata 部分,由
注册“B14”。 将小的未初始化的全局和静态数据放入 .bss 部分,
与 .neardata 部分。 将小的只读数据放入 .rodata
部分。 用于大块数据的相应部分是 .fardata, 。远的
和 .const.
-msdata=全部
将所有数据,而不仅仅是小对象,放入为小数据保留的部分,并且
使用相对于“B14”寄存器的寻址来访问它们。
-msdata=无
不使用为小数据保留的段,并使用绝对地址
访问所有数据。 将所有初始化的全局和静态数据放在 .fardata 部分,
和所有未初始化的数据 。远的 部分。 将所有常量数据放入 .const
部分。
CRIS 附加选项
这些选项是专门为 CRIS 端口定义的。
-三月=建筑类型
-单片机=建筑类型
为指定的架构生成代码。 的选择 建筑类型 旨在
v3, v8 和 v10 分别用于 ETRAX 4、ETRAX 100 和 ETRAX 100 LX。 默认是 v0
除了 cris-axis-linux-gnu,默认是 v10.
-mtune=建筑类型
调到 建筑类型 所有适用于生成的代码,除了
ABI 和可用指令集。 的选择 建筑类型 旨在
同为 -三月=建筑类型.
-mmax-堆栈帧=n
当函数的堆栈帧超出时发出警告 n 个字节。
-metrax4
-metrax100
选项 -metrax4 和 -metrax100 是...的同义词 -三月=v3 和 -三月=v8
。
-mmul-bug-解决方法
-mno-mul-bug-解决方法
解决 CPU 型号的“muls”和“mlu”指令中的错误
适用。 默认情况下,此选项处于活动状态。
-mp调试
在汇编代码中启用 CRIS 特定的详细调试相关信息。 这个
选项还具有关闭 #NO_APP 格式化代码指示符
汇编器在汇编文件的开头。
-mcc-init
不要使用上一条指令的条件码结果; 总是发出比较和
使用条件代码前的测试说明。
-mno-副作用
不要在后处理以外的寻址模式中发出有副作用的指令
增量。
-mstack对齐
-mno堆栈对齐
-mdata-对齐
-mno-数据-对齐
-mconst-对齐
-mno-常量对齐
这些选项(NO- 选项)安排(消除安排)堆栈帧,
为最大单一数据访问大小对齐的单个数据和常量
对于所选的 CPU 型号。 默认设置为 32 位对齐。 ABI
结构布局等细节不受这些选项的影响。
-m32 位
-m16 位
-m8 位
与上面的 stack-data- 和 const-align 选项类似,这些选项安排
堆栈帧、可写数据和常量都为 32 位、16 位或 8 位对齐。
默认为 32 位对齐。
-mno-序言-尾声
-前言-尾声
在 -mno-序言-尾声, 正常功能的序言和结语
堆栈帧被省略,没有返回指令或返回序列
代码中生成。 仅将此选项与目视检查一起使用
编译后的代码:当调用保存的寄存器必须被调用时,不会产生警告或错误
保存,或者需要分配局部变量的存储空间。
-mno-gotplt
-mgotplt
在 -fpic 和 -fPIC,不要生成(do generate)加载指令序列
来自 GOT 的 PLT 部分的函数地址,而不是(传统的其他
架构)调用 PLT。 默认是 -mgotplt.
-梅尔夫
仅使用 cris-axis-elf 和 cris-axis-linux-gnu 识别的传统 no-op 选项
的目标。
-mlinux
仅使用 cris-axis-linux-gnu 目标识别的旧无操作选项。
-SIM
这个选项,被识别为 cris-axis-elf,安排与输入输出链接
来自模拟器库的函数。 代码、初始化数据和零初始化数据
是连续分配的。
-sim2
喜欢 -SIM, 但传递链接器选项以在 0x40000000 和零-
0x80000000 处的初始化数据。
CR16 附加选项
这些选项是专门为 CR16 端口定义的。
-mmac
启用乘法累加指令的使用。 默认禁用。
-mcr16cplus
-mcr16c
为 CR16C 或 CR16C+ 架构生成代码。 CR16C+ 架构是默认的。
-msim
链接与模拟器兼容的库 libsim.a。 适用于ELF
仅编译器。
-mint32
选择整数类型为 32 位宽。
-mbit 操作
为位操作生成“sbit”/“cbit”指令。
-mdata-模型=模型
选择数据模型。 的选择 模型 旨在 近, 远 or 中等. 中等 是默认的。
然而, 远 无效 -mcr16c, 因为 CR16C 架构不支持
远数据模型。
达尔文 附加选项
这些选项是为运行 Darwin 操作系统的所有体系结构定义的。
Darwin 上的 FSF GCC 不会创建“胖”目标文件; 它为
GCC 构建目标的单一架构。 苹果在达尔文的 GCC 确实创造了“脂肪”
如果有多个文件 -拱 使用选项; 它通过运行编译器或链接器来实现
多次并将结果与 脂.
创建的文件的子类型(如 ppc7400 or ppc970 or i686) 由
指定 GCC 所针对的 ISA 的标志,例如 -微处理器 or -行进。 该
-force_cpusubtype_ALL 选项可用于覆盖它。
当出现 ISA 不匹配时,达尔文工具的行为会有所不同。 这
汇编程序, as, 只允许使用对子类型有效的指令
它正在生成的文件,因此您不能将 64 位指令放入 ppc750 目标文件。 这
共享库的链接器, /usr/bin/libtool, 失败并在要求时打印错误
创建一个共享库,其子类型的限制少于其输入文件(对于
例如,试图把一个 ppc970 目标文件在一个 ppc7400 图书馆)。 链接器为
可执行文件, ld, 悄悄地赋予可执行文件任何其最严格的子类型
输入文件。
-FDIR
添加框架目录 DIR 到要搜索的目录列表的头部
对于头文件。 这些目录与指定的目录交错 -I
选项并按从左到右的顺序进行扫描。
框架目录是一个包含框架的目录。 一个框架是一个
目录与 头 和 私人头文件 直接包含在其中的目录
在结束 。框架. 框架的名称是该目录的名称,不包括
此 。框架. 与框架相关联的标头可以在这两个标头之一中找到
目录,与 头 被首先搜索。 子框架是一个框架
框架中的目录 框架 目录。 包含子框架
标头只能出现在包含子框架的框架的标头中,或者
在同级子框架标头中。 如果两个子框架出现在
相同的框架。 子框架不应与框架同名; 一种
如果违反,则会发出警告。 目前一个子框架不能有
子框架; 将来,该机制可能会扩展以支持这一点。 这
标准框架可以在 /系统/图书馆/框架 和
/库/框架. 一个示例包含看起来像“#include ”,
哪里 骨架 表示框架的名称和 头文件.h 在中找到
私人头文件 or 头 目录。
-i框架DIR
喜欢 -F 除了目录被视为系统目录。 主要区别
这之间 -i框架 和 -F 是那个 -i框架 编译器不警告
关于通过找到的头文件中包含的构造 DIR. 此选项有效
仅适用于 C 系列语言。
-古斯
为使用的符号发出调试信息。 对于 stabs 调试格式,
这使 -feliminate-未使用的调试符号. 这是默认开启的。
-gfull
发出所有符号和类型的调试信息。
-mmacosx-版本-min=版本
此可执行文件将运行的最早版本的 MacOS X 是 版本。 典型的
的值 版本 包括 10.1、10.2 和 10.3.9。
如果编译器被构建为默认使用系统的头文件,则默认为
此选项是运行编译器的系统版本,否则
默认是做出与尽可能多的系统和代码库兼容的选择
可能。
-内核
启用内核开发模式。 这 -内核 选项集 -静态的, -fno-普通,
-fno-使用-cxa-atexit, -fno-异常, -fno-非调用异常, -fapple-kext,
-fno-弱 和 -fno-rtti 在适用的情况下。 此模式还设置 -mno-altivec,
-msoft-浮动, -fno 内置 和 -mlong-分支 用于 PowerPC 目标。
-mon-byte-bool
覆盖默认值 布尔 以便 大小(布尔)== 1. 默认情况下 大小(布尔) is 4
为 Darwin/PowerPC 编译时和 1 当为 Darwin/x86 编译时,所以这个选项
对 x86 没有影响。
警告: 这款 -mon-byte-bool switch 导致 GCC 生成非二进制代码
与没有该开关生成的代码兼容。 使用此开关可能需要
重新编译程序中的所有其他模块,包括系统库。 用这个
切换以符合非默认数据模型。
-mfix 并继续
-确定并继续
-findirect-数据
生成适合快速周转开发的代码,例如允许 GDB
动态加载“.o”文件到已经运行的程序中。 -findirect-数据 和
-确定并继续 提供向后兼容性。
-all_load
加载静态归档库的所有成员。 见人 ld(1) 了解更多信息。
-arch_errors_fatal
导致与具有错误架构的文件有关的错误是致命的。
-加载时绑定
使输出文件被标记,以便动态链接器将绑定所有
加载或启动文件时未定义的引用。
-束
生成 Mach-o 捆绑格式文件。 见人 ld(1) 了解更多信息。
-bundle_loader 可执行
此选项指定 可执行 这将加载构建输出文件
链接。 见人 ld(1) 了解更多信息。
-动态库
当传递此选项时,GCC 会在以下情况下生成动态库而不是可执行文件
链接,使用达尔文 的libtool 命令。
-force_cpusubtype_ALL
这会导致 GCC 的输出文件具有 全部 子类型,而不是由控制的一个
此 -微处理器 or -行进 选项。
-allowable_client 客户名称
-客户名称
-兼容性_版本
-当前版本
-dead_strip
-依赖文件
-dylib_文件
-dylinker_安装_名称
-动态
-导出符号列表
-文件列表
-平面命名空间
-force_flat_命名空间
-headerpad_max_install_names
-图像库
-在里面
-安装名称
-keep_private_externs
-多模块
-乘法定义
-multiply_define_unused
-noall_load
-no_dead_strip_inits_and_terms
-nofix预绑定
-nomultidefs
-noprebind
-noseglink编辑
-pagezero_size
-预绑定
-prebind_all_twolevel_modules
-private_bundle
-read_only_relocs
-扇区对齐
-教派对象符号
-为什么加载
-段1地址
-sectcreate
-教派对象符号
-扇区
-隔离地址
-segs_read_only_addr
-segs_read_write_addr
-段地址表
-seg_addr_表文件名
-seglinkedit
-segprot
-segs_read_only_addr
-segs_read_write_addr
-单模块
-静态的
-子库
-sub_umbrella
-twolevel_命名空间
-雨伞
-不明确的
-unexported_symbols_list.
-weak_reference_mismatches
-加载了什么
这些选项被传递给 Darwin 链接器。 Darwin 链接器手册页描述
他们详细。
DEC 阿尔法 附加选项
这些 -m 选项是为 DEC Alpha 实现定义的:
-mno-软浮动
-msoft-浮动
使用(不使用)硬件浮点指令进行浮点运算
操作。 什么时候 -msoft-浮动 被指定,函数在 libgcc.a 用于执行
浮点运算。 除非它们被模拟
浮点运算,或以调用此类仿真的方式编译
例程,这些例程发出浮点运算。 如果你正在编译
一个没有浮点运算的Alpha,必须保证库是建好的
以免打电话给他们。
请注意,没有浮点运算的 Alpha 实现需要具有
浮点寄存器。
-mfp-reg
-mno-fp-regs
生成使用(不使用)浮点寄存器集的代码。 -mno-fp-regs
暗示 -msoft-浮动. 如果不使用浮点寄存器组,则浮点
操作数在整数寄存器中传递,就好像它们是整数和浮点数一样
结果以 $0 而不是 $f0 传递。 这是一个非标准的调用序列,所以
任何带有浮点参数或返回值的函数被编译的代码调用
- -mno-fp-regs 还必须使用该选项进行编译。
此选项的典型用途是构建一个不使用的内核,因此需要
不保存和恢复,任何浮点寄存器。
-miee
Alpha 架构实现了为最大程度优化的浮点硬件
表现。 它主要符合 IEEE 浮点标准。 然而,
为了完全合规,需要软件帮助。 此选项生成代码
完全符合 IEEE 标准的代码 除 该 不精确标志 不维护(见下文)。
如果打开此选项,则预处理器宏“_IEEE_FP”在
汇编。 生成的代码效率较低,但能够正确支持
非规范化数字和异常 IEEE 值,例如非数字和加号/减号
无限。 其他 Alpha 编译器调用此选项 -ieee_with_no_inexact.
-mieee-不准确
就像 -miee 除了生成的代码还维护了 IEEE 不精确标志.
打开此选项会导致生成的代码实现完全符合 IEEE
数学。 除了“_IEEE_FP”之外,“_IEEE_FP_EXACT”被定义为预处理器宏。
在某些 Alpha 实现中,结果代码的执行速度可能明显慢于
默认生成的代码。 由于很少有代码依赖于
不精确标志,您通常不应指定此选项。 其他 Alpha 编译器调用
这个选项 -ieee_with_inexact.
-mfp 陷阱模式=陷阱模式
此选项控制启用哪些浮点相关陷阱。 其他阿尔法
编译器调用这个选项 -fptm 陷阱模式. 陷阱模式可以设置为四种之一
值:
n 这是默认(正常)设置。 唯一启用的陷阱是
不能在软件中禁用的那些(例如,除以零陷阱)。
u 除了启用的陷阱 n,下溢陷阱也被启用。
su 喜欢 u,但指令被标记为对软件完成是安全的(参见
有关详细信息,请参阅 Alpha 架构手册)。
上 喜欢 su,但也启用了不精确的陷阱。
-mfp-舍入模式=舍入模式
选择 IEEE 舍入模式。 其他 Alpha 编译器调用此选项 -fprm
舍入模式。 该 舍入模式 可以是以下之一:
n 正常的 IEEE 舍入模式。 浮点数四舍五入到最接近的
机器号或在平局的情况下向偶数机器号。
m 向负无穷大舍入。
c 切碎的舍入模式。 浮点数向零四舍五入。
d 动态舍入模式。 浮点控制寄存器中的一个字段(聚合酶链反应,请参阅
Alpha 体系结构参考手册)控制有效的舍入模式。 C
库初始化此寄存器以向正无穷大舍入。 因此,
除非你的程序修改了 聚合酶链反应, d 对应于向加舍入
无限。
-mtrap-精度=陷阱精度
在 Alpha 架构中,浮点陷阱是不精确的。 这意味着没有
软件协助无法从浮动陷阱和程序中恢复
执行通常需要终止。 GCC 可以生成可以辅助的代码
操作系统陷阱处理程序在确定导致
浮点陷阱。 根据应用的要求,不同的
可以选择精度级别:
p 程序精度。 此选项是默认选项,意味着陷阱处理程序只能
确定哪个程序导致了浮点异常。
f 函数精度。 陷阱处理程序可以确定导致
浮点异常。
i 指令精度。 陷阱处理程序可以确定准确的指令
导致浮点异常。
其他 Alpha 编译器提供了等效的选项,称为 -范围_安全 和
-恢复安全.
-符合标准
此选项将生成的代码标记为符合 IEEE。 您不得使用此选项
除非您还指定 -mtrap-精度=i ,要么 -mfp 陷阱模式=su or
-mfp 陷阱模式=sui. 它唯一的作用是发射线 .eflag 48 在函数中
生成的汇编文件的序言。
-mbuild-常量
通常 GCC 会检查 32 位或 64 位整数常量以查看它是否可以构造它
从两个或三个指令中的较小常量。 如果不能,则输出
常量作为文字并生成代码以在运行时从数据段加载它。
使用此选项要求 GCC 构建 所有 使用代码的整数常量,即使
它需要更多的指令(最多六个)。
您通常使用此选项来构建共享库动态加载程序。 本身一个
共享库,它必须在内存中重新定位自己才能找到变量和
常量在它自己的数据段中。
-mbwx
-mno-bwx
-mcix
-mno-cix
-mfix
-mno-修复
-最大
-mno-最大
指示 GCC 是否应生成代码以使用可选的 BWX、CIX、FIX 和 MAX
指令集。 默认是使用CPU支持的指令集
通过指定类型 -单片机= 选项或构建 GCC 的 CPU 的选项(如果没有)
指定的。
-mfloat-vax
-mfloat-ieee
生成使用(不使用)VAX F 和 G 浮点算法的代码
IEEE 单精度和双精度。
-meexplicit-relocs
-mno-显式重新定位
旧的 Alpha 汇编器没有提供生成符号重定位的方法,除了通过
汇编宏。 这些宏的使用不允许最佳指令调度。
GNU binutils 自 2.12 版起支持新的语法,允许编译器
明确标记哪些重定位应适用于哪些指令。 这个选项是
对调试最有用,因为 GCC 检测汇编器的功能时
构建并相应地设置默认值。
-msmall-数据
-mlarge 数据
什么时候 -meexplicit-relocs 实际上,静态数据是通过访问 gp-相对
搬迁。 什么时候 -msmall-数据 使用,8 字节或更小的对象被放置在
a 小 data 区 (“.sdata”和“.sbss”部分)并通过 16 位访问
从 $gp 寄存器重新定位。 这将小数据区的大小限制为
64KB,但允许通过单个指令直接访问变量。
默认是 -mlarge 数据. 使用此选项,数据区域仅限于正下方
2GB。 需要超过 2GB 数据的程序必须使用“malloc”或“mmap”来
在堆中而不是在程序的数据段中分配数据。
为共享库生成代码时, -fpic 暗示 -msmall-数据 和 -fPIC
暗示 -mlarge 数据.
-msmall-文本
-m大文本
什么时候 -msmall-文本 使用时,编译器假定整个程序的代码
(或共享库)大小为 4MB,因此可以通过分支指令访问。
什么时候 -msmall-数据 使用,编译器可以假设所有本地符号共享
相同的 $gp 值,从而减少函数所需的指令数量
从 4 拨到 1。
默认是 -m大文本.
-单片机=处理器类型
设置机器类型的指令集和指令调度参数
处理器类型. 您可以指定 EV 款式名称或对应的芯片编号。
GCC 支持 EV4、EV5 和 EV6 系列处理器的调度参数和
从您指定的处理器中为指令集选择默认值。 如果
您没有指定处理器类型,GCC 默认为处理器所在的处理器
编译器被构建。
支持的值 处理器类型 旨在
ev4
ev45
21064
作为 EV4 调度并且没有指令集扩展。
ev5
21164
作为 EV5 调度并且没有指令集扩展。
ev56
21164a
作为 EV5 计划并支持 BWX 扩展。
PCA56
21164pc
21164PC
作为 EV5 计划并支持 BWX 和 MAX 扩展。
ev6
21264
作为 EV6 计划并支持 BWX、FIX 和 MAX 扩展。
ev67
21264a
作为 EV6 计划并支持 BWX、CIX、FIX 和 MAX 扩展。
原生工具链也支持价值 本地人, 选择最佳架构
主机处理器的选项。 -mcpu=本地 如果 GCC 不识别则无效
处理器。
-mtune=处理器类型
只设置机器类型的指令调度参数 处理器类型。 该
指令集没有改变。
原生工具链也支持价值 本地人, 选择最佳架构
主机处理器的选项。 -mtune=本地 如果 GCC 不识别则无效
处理器。
-mmemory-延迟=次
设置调度程序应该为典型的内存引用假设的延迟,如
应用程序。 这个数字高度依赖于所使用的内存访问模式
由应用程序和机器上外部缓存的大小决定。
有效选项 次 旨在
数
代表时钟周期的十进制数。
L1
L2
L3
主
编译器包含对“典型”EV4 和
用于 5、1 和 2 级缓存(也称为 Dcache、Scache 和
Bcache),以及主内存。 请注意,L3 仅对 EV5 有效。
FR30 附加选项
这些选项是专门为 FR30 端口定义的。
-msmall-模型
使用小地址空间模型。 这可以产生更小的代码,但它确实假设
所有符号值和地址都适合 20 位范围。
-mno-lsim
假设已经提供了运行时支持,因此不需要包括
模拟器库(libsim.a) 在链接器命令行上。
利夫 附加选项
-mgpr-32
仅使用前 32 个通用寄存器。
-mgpr-64
使用全部 64 个通用寄存器。
-mfpr-32
仅使用前 32 个浮点寄存器。
-mfpr-64
使用所有 64 个浮点寄存器。
-mhard-浮动
使用硬件指令进行浮点运算。
-msoft-浮动
使用库例程进行浮点运算。
-malloc-cc
动态分配条件代码寄存器。
-mfixed-cc
不要尝试动态分配条件代码寄存器,只使用“icc0”和
“fcc0”。
-mdword
更改 ABI 以使用双字 insns。
-mno-双字
不要使用双字指令。
-mdouble
使用浮点双精度指令。
-mno-双
不要使用浮点双精度指令。
-媒体
使用媒体说明。
-mno媒体
不要使用媒体说明。
-mmuladd
使用乘法和加法/减法指令。
-mno-muladd
不要使用乘法和加法/减法指令。
-mfdpic
选择 FDPIC ABI,它使用函数描述符来表示指向
职能。 没有任何与 PIC/PIE 相关的选项,这意味着 -fPIE。 同 -fpic or
-fpie,它假设 GOT 条目和小数据在 GOT 的 12 位范围内
基地址; 和 -fPIC or -fPIE, GOT 偏移量是用 32 位计算的。 用一个
小精灵 目标,这个选项意味着 -msim.
-minline-plt
在对未知函数的函数调用中启用 PLT 条目的内联
本地绑定。 没有它就没有效果 -mfdpic. 默认情况下启用它,如果
优化速度和编译共享库(即, -fPIC or -fpic), 要么
当优化选项如 -氧气 或以上出现在命令行中。
-mTLS
在生成线程本地代码时假设一个大的 TLS 段。
-mtls
在生成线程本地代码时不要假设一个大的 TLS 段。
-mgprel-ro
允许在 FDPIC ABI 中使用“GPREL”重定位来处理已知的数据
只读部分。 它默认启用,除了 -fpic or -fpie: 虽然
它可能有助于使全局偏移表更小,它将 1 条指令换成 4 条指令。
-fPIC or -fPIE, 它将 3 条指令交换为 4 条指令,其中一条指令可能被多个指令共享
符号,它避免了引用符号的 GOT 条目的需要,所以它是
更有可能获胜。 如果不是, -mno-gprel-ro 可以用来禁用它。
-multilib-库-pic
与(库,不是 FD)图片库链接。 它暗示了 -图书馆图片,以及
如 -fPIC 和 -fpic 也完全不需要 -mfdpic. 您永远不必明确使用它。
-mlinked-fp
遵循 EABI 要求,每当堆栈帧时总是创建帧指针
被分配。 此选项默认启用,可以禁用
-mno-链接-fp.
-mlong 通话
使用间接寻址来调用当前编译单元之外的函数。 这个
允许将函数放置在 32 位地址空间内的任何位置。
-恶意标签
通过将 NOP 插入前一个数据包,尝试将标签与 8 字节边界对齐。
此选项仅在启用 VLIW 打包时有效。 它不会创建新的
数据包; 它只是向现有的 NOP 添加 NOP。
-图书馆图片
生成与位置无关的 EABI 代码。
-macc-4
仅使用前四个媒体累加器寄存器。
-macc-8
使用所有八个媒体累加器寄存器。
-mpack
打包 VLIW 说明。
-mno包
不要打包 VLIW 说明。
-mno-flags
不要在 e_flags 中标记 ABI 开关。
-mcond-移动
启用条件移动指令的使用(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-cond-移动
禁止使用条件移动指令。
此开关主要用于调试编译器,可能会在
未来版本。
-mscc
启用条件集指令的使用(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-scc
禁用条件设置指令的使用。
此开关主要用于调试编译器,可能会在
未来版本。
-mcond 执行
启用条件执行(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-条件执行
禁用条件执行。
此开关主要用于调试编译器,可能会在
未来版本。
-mvliw-分支
运行一个 pass 将分支打包成 VLIW 指令(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-vliw-分支
不要运行 pass 将分支打包到 VLIW 指令中。
此开关主要用于调试编译器,可能会在
未来版本。
-mmulti-条件执行
启用“&&”和“||”的优化在条件执行中(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-多条件执行
禁用“&&”和“||”的优化在条件执行中。
此开关主要用于调试编译器,可能会在
未来版本。
-mnested-cond-exec
启用嵌套条件执行优化(默认)。
此开关主要用于调试编译器,可能会在
未来版本。
-mno-嵌套条件执行
禁用嵌套条件执行优化。
此开关主要用于调试编译器,可能会在
未来版本。
-moptimize-membar
此开关从编译器生成的代码中删除多余的“membar”指令。
它默认启用。
-mno-优化-membar
此开关禁止自动删除冗余的“membar”指令
生成的代码。
-mtomcat-统计
导致 gas 打印出 tomcat 统计信息。
-单片机=CPU
选择要为其生成代码的处理器类型。 可能的值为 速度, fr550,
tomcat的, fr500, fr450, fr405, fr400, fr300 和 简单.
GNU / Linux的 附加选项
这些 -m 为 GNU/Linux 目标定义的选项:
-mglibc
使用 GNU C 库。 这是默认设置,除了 *-*-linux-*uclibc* 和
*-*-linux-*安卓* 的目标。
-mulibc
使用 uClibc C 库。 这是默认设置 *-*-linux-*uclibc* 的目标。
-仿生
使用仿生 C 库。 这是默认设置 *-*-linux-*安卓* 的目标。
-机器人
编译兼容Android平台的代码。 这是默认设置
*-*-linux-*安卓* 的目标。
编译时,此选项启用 -仿生, -fPIC, -fno-异常 和 -fno-rtti by
默认。 链接时,此选项使 GCC 驱动程序传递 Android 特定的选项
到链接器。 最后,这个选项使预处理器宏“__ANDROID__”成为
定义。
-tno-android-cc
禁用编译效果 -机器人, 即不启用 -仿生, -fPIC,
-fno-异常 和 -fno-rtti 默认情况下。
-tno-android-ld
禁用链接效果 -机器人,即,将标准 Linux 链接选项传递给
链接器。
H8 / 300 附加选项
这些 -m 为 H8/300 实现定义了选项:
-放松
如果可能,在链接时缩短一些地址引用; 使用链接器选项
-放松.
-mh 为 H8/300H 生成代码。
-多发性硬化症 为 H8S 生成代码。
-mn 在正常模式下为 H8S 和 H8/300H 生成代码。 必须使用这个开关
要么与 -mh or -多发性硬化症.
-MS2600
为 H8S/2600 生成代码。 此开关必须与 -多发性硬化症.
-mexr
在使用监视器执行函数之前,扩展寄存器存储在堆栈中
属性。 默认选项是 -mexr. 此选项仅对 H8S 目标有效。
-mno-exr
在使用监视器执行函数之前,扩展寄存器不会存储在堆栈中
属性。 默认选项是 -mno-exr. 此选项仅对 H8S 目标有效。
-mint32
默认情况下将“int”数据设为 32 位。
-malign-300
在 H8/300H 和 H8S 上,使用与 H8/300 相同的对齐规则。 默认的
对于 H8/300H 和 H8S 是在 4 字节边界上对齐 longs 和 floats。
-malign-300 使它们在 2 字节边界上对齐。 该选项无效
在 H8/300 上。
高压聚丙烯酰胺 附加选项
这些 -m 为 HPPA 系列计算机定义的选项:
-三月=建筑类型
为指定的架构生成代码。 的选择 建筑类型 旨在
1.0 对于 PA 1.0, 1.1 对于 PA 1.1,和 2.0 用于 PA 2.0 处理器。 参考
/usr/lib/sched.models 在 HP-UX 系统上确定正确的体系结构选项
为您的机器。 为编号较低的架构编译的代码在较高的架构上运行
编号架构,但不是相反。
-mpa-risc-1-0
-mpa-risc-1-1
-mpa-risc-2-0
的同义词 -三月=1.0, -三月=1.1及 -三月=2.0 。
-mbig-开关
生成适合大开关表的代码。 仅在以下情况下使用此选项
汇编程序/链接程序抱怨切换表中的分支超出范围。
-mjump-in-延迟
通过修改无条件跳转指令填充函数调用的延迟槽
作为条件跳转目标的函数调用的返回指针。
-mdisable-fpregs
防止以任何方式使用浮点寄存器。 这对于
编译内核来执行浮点寄存器的延迟上下文切换。 如果
您使用此选项并尝试执行浮点运算时,编译器
中止。
-m禁用索引
防止编译器使用索引地址模式。 这避免了一些
在 MACH 下编译 MIG 生成的代码时会隐藏问题。
-mno-空间-regs
生成假定目标没有空间寄存器的代码。 这允许 GCC
生成更快的间接调用并使用未缩放的索引地址模式。
此类代码适用于 0 级 PA 系统和内核。
-mfast-间接调用
生成假定调用从不跨越空间边界的代码。 这允许 GCC
发出执行更快间接调用的代码。
此选项在共享库或嵌套函数存在的情况下不起作用。
-mfixed-范围=寄存器范围
生成将给定寄存器范围视为固定寄存器的代码。 固定寄存器
是寄存器分配器不能使用的。 这在编译内核时很有用
代码。 寄存器范围指定为由破折号分隔的两个寄存器。 多种的
可以用逗号分隔指定寄存器范围。
-mlong-加载-存储
生成 HP-UX 3 有时需要的 10 条指令加载和存储序列
链接器。 这相当于 +k HP 编译器的选项。
-便携式运行时
使用 HP 为 ELF 系统建议的可移植调用约定。
-甲烷气体
启用只有 GAS 理解的汇编指令。
-mschedule=cpu类型
根据机器类型的约束安排代码 cpu类型. 选择
cpu类型 旨在 700 7100, 7100LC, 7200, 7300 和 8000。 参考
/usr/lib/sched.models 在 HP-UX 系统上确定正确的调度选项
你的机器。 默认调度是 8000.
-mlinker-opt
在 HP-UX 链接器中启用优化传递。 请注意,这会进行符号调试
不可能的。 它还会触发 HP-UX 8 和 HP-UX 9 链接器中的错误
链接某些程序时给出虚假的错误消息。
-msoft-浮动
生成包含浮点库调用的输出。 警告: 必要的
库并非适用于所有 HPPA 目标。 通常,酒店的设施
使用机器通常的 C 编译器,但这不能直接在跨
汇编。 您必须自行安排提供合适的图书馆
交叉编译功能。
-msoft-浮动 更改输出文件中的调用约定; 因此,它只是
如果你编译很有用 所有 具有此选项的程序。 特别是,你需要
编 libgcc.a,GCC自带的库,有 -msoft-浮动 为了这个
工作。
-msio
为服务器 IO 生成预定义“_SIO”。 默认是 -mwsio. 这会产生
工作站 IO 的预定义“__hp9000s700”、“__hp9000s700__”和“_WSIO”。
这些选项在 HP-UX 和 HI-UX 下可用。
-mgnu-ld
使用特定于 GNU 的选项 ld. 这通过 -共享 至 ld 在构建共享时
图书馆。 当 GCC 被显式或隐式配置时,它是默认的
GNU 链接器。 此选项不影响哪个 ld 叫做; 它只会改变什么
参数传递给那个 ld。 该 ld 被调用的是由
--with-ld configure 选项,GCC 的程序搜索路径,最后由用户的 PATH.
GCC 使用的链接器可以使用打印 这 `海合会 -打印程序名称=ld`。 这
选项仅在 64 位 HP-UX GCC 上可用,即配置为
hppa*64*-*-hpux*.
-mhp-ld
使用特定于 HP 的选项 ld. 这通过 -b 至 ld 构建共享库时
并通过 +接受 类型不匹配 至 ld 在所有链接上。 当 GCC 为默认值时
使用 HP 链接器显式或隐式配置。 此选项不影响
这 ld 叫做; 它只会改变传递给它的参数 ld。 该 ld
被调用的是由 --with-ld 配置选项,GCC的程序搜索
路径,最后由用户的 PATH. GCC 使用的链接器可以使用打印
这 `海合会 -打印程序名称=ld`. 此选项仅在 64 位 HP-UX 上可用
GCC,即配置 hppa*64*-*-hpux*.
-mlong 通话
生成使用长调用序列的代码。 这可确保呼叫始终能够
到达链接器生成的存根。 默认是仅当
从调用点到函数或翻译单元开头的距离,为
在这种情况下,可能会超出由正在使用的分支类型设置的预定义限制。 这
PA 7,600,000 的正常调用限制分别为 240,000 和 2.0 字节
和 PA 1.X 架构。 Sibcalls 总是限制在 240,000 字节。
距离是从函数的开始测量的,当使用
-f函数部分 选项,或当使用 -甲烷气体 和 -mno-便携式运行时 选项
在 HP-UX 下与 SOM 链接器一起使用。
通常不希望使用此选项,因为它会降低性能。 然而,
它在大型应用程序中可能很有用,特别是当部分链接用于
构建应用程序。
使用的长调用类型取决于汇编器和链接器的功能,
以及生成的代码类型。 对支持长期的系统的影响
绝对调用,长 pic 符号差异或 pc 相对调用应该是
比较小。 但是,在 pic 代码中的 32 位 ELF 系统上使用了间接调用
它很长。
-munix=Unix标准
生成编译器预定义并为指定的 UNIX 标准选择一个启动文件。
的选择 Unix标准 旨在 93, 95 和 98. 93 所有 HP-UX 版本都支持。
95 在 HP-UX 10.10 及更高版本上可用。 98 在 HP-UX 11.11 及更高版本上可用。
默认值为 93 对于 HP-UX 10.00, 95 对于 HP-UX 10.10 到 11.00,以及 98
适用于 HP-UX 11.11 及更高版本。
-munix=93 提供与 GCC 3.3 和 3.4 相同的预定义。 -munix=95 提供
“XOPEN_UNIX”和“_XOPEN_SOURCE_EXTENDED”的附加预定义,以及启动文件
unix95.o. -munix=98 为“_XOPEN_UNIX”提供额外的预定义,
“_XOPEN_SOURCE_EXTENDED”、“_INCLUDE__STDC_A1_SOURCE”和“_INCLUDE_XOPEN_SOURCE_500”、
和启动文件 unix98.o.
这是 重要 注意这个选项改变了各种库的接口
例行公事。 它还影响 C 库的操作行为。 因此, 极端
使用此选项时需要小心。
打算使用一种以上 UNIX 标准运行的库代码必须经过测试,
设置和恢复变量 __xpg4_扩展_掩码 作为适当的。 大多数 GNU 软件
不提供此功能。
-nolibdld
禁止生成链接选项来搜索 libdld.sl -静态的 选项是
在 HP-UX 10 及更高版本上指定。
-静态的
libc 中 setlocale 的 HP-UX 实现依赖于 libdld.sl。 那里
不是 libdld.sl 的存档版本。 因此,当 -静态的 选项被指定,
需要特殊的链接选项来解决这种依赖性。
在 HP-UX 10 及更高版本上,GCC 驱动程序添加了必要的选项以链接到
libdld.sl 当 -静态的 选项被指定。 这导致生成的二进制文件
是动态的。 在 64 位端口上,链接器默认生成动态二进制文件
任何情况。 这 -nolibdld 选项可用于阻止 GCC 驱动程序添加
这些链接选项。
-线程
添加对多线程的支持 DCE 绪 HP-UX 下的库。 这个选项
为预处理器和链接器设置标志。
英特尔 386 和 AMD公司 x86 64 附加选项
这些 -m 为 i386 和 x86-64 系列计算机定义了选项:
-三月=cpu类型
生成机器类型的说明 cpu类型。 与之相反 -mtune=cpu类型,
它只是为指定的对象调整生成的代码 cpu类型, -三月=cpu类型
允许 GCC 生成可能根本无法在处理器以外的处理器上运行的代码
表明的。 指定 -三月=cpu类型 暗示 -mtune=cpu类型.
的选择 cpu类型 是:
本地人
这通过确定在编译时生成代码的 CPU
编译机的处理器类型。 使用 -march=本地 使所有
本地机器支持的指令子集(因此结果可能不会运行
在不同的机器上)。 使用 -mtune=本地 生成针对本地优化的代码
机器在所选指令集的约束下。
i386
原装英特尔 i386 CPU。
i486
英特尔 i486 处理器。 (该芯片没有实现调度。)
i586
奔腾
不支持 MMX 的 Intel Pentium CPU。
奔腾-mmx
Intel Pentium MMX CPU,基于具有 MMX 指令集支持的 Pentium 内核。
奔腾
英特尔奔腾 Pro CPU。
i686
当与 -行进,使用的是Pentium Pro指令集,所以代码运行
在所有 i686 系列芯片上。 当与 -mtune,它的含义与
通用.
奔腾2
Intel Pentium II CPU,基于具有 MMX 指令集支持的 Pentium Pro 内核。
奔腾3
奔腾3m
Intel Pentium III CPU,基于具有 MMX 和 SSE 指令集的 Pentium Pro 内核
支持。
奔腾-m
英特尔奔腾 M; 具有 MMX、SSE 和 SSE2 的 Intel Pentium III CPU 的低功耗版本
指令集支持。 由迅驰笔记本使用。
奔腾4
奔腾4m
支持 MMX、SSE 和 SSE4 指令集的 Intel Pentium 2 CPU。
普雷斯科特
带有 MMX、SSE、SSE4 和 SSE2 指令的 Intel Pentium 3 CPU 的改进版本
设置支持。
诺科纳
Intel Pentium 4 CPU 的改进版本,具有 64 位扩展、MMX、SSE、SSE2 和
SSE3 指令集支持。
core2
具有 2 位扩展的 Intel Core 64 CPU、MMX、SSE、SSE2、SSE3 和 SSSE3
指令集支持。
核心7
具有 7 位扩展的 Intel Core i64 CPU、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1 和
SSE4.2 指令集支持。
酷睿i7-avx
具有 7 位扩展的 Intel Core i64 CPU、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、
SSE4.2、AVX、AES 和 PCLMUL 指令集支持。
核心-avx-i
具有 64 位扩展的 Intel Core CPU、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、
SSE4.2、AVX、AES、PCLMUL、FSGSBASE、RDRND 和 F16C 指令集支持。
核心-avx2
具有 64 位扩展的 Intel Core CPU、MOVBE、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、
SSE4.2、AVX、AVX2、AES、PCLMUL、FSGSBASE、RDRND、FMA、BMI、BMI2 和 F16C
指令集支持。
原子
具有 64 位扩展的 Intel Atom CPU、MOVBE、MMX、SSE、SSE2、SSE3 和 SSSE3
指令集支持。
k6 支持 MMX 指令集的 AMD K6 CPU。
k6-2
k6-3
AMD K6 CPU 的改进版本,带有 MMX 和 3DNow! 指令集支持。
速龙
速腾鸟
AMD Athlon CPU 与 MMX、3dNOW!、增强的 3DNow! 和 SSE 预取指令
支持。
Athlon-4
速龙-xp
速龙-mp
改进的 AMD Athlon CPU 与 MMX、3DNow!、增强的 3DNow! 和完整的SSE指令
设置支持。
k8
皓龙
Athlon64
速龙-FX
基于具有 x8-86 指令集支持的 AMD K64 内核的处理器,包括
AMD Opteron、Athlon 64 和 Athlon 64 FX 处理器。 (这超集了 MMX,
SSE、SSE2、3DNow!、增强的 3DNow! 和 64 位指令集扩展。)
k8-sse3
选择器-sse3
速龙64-sse3
改进的 AMD K8 内核版本,支持 SSE3 指令集。
amdfam10
巴塞罗那
基于 AMD 系列 10h 内核的 CPU,支持 x86-64 指令集。 (这个
超集 MMX、SSE、SSE2、SSE3、SSE4A、3DNow!、增强的 3DNow!、ABM 和 64 位
指令集扩展。)
BDVER1
基于 AMD 系列 15h 内核的 CPU,支持 x86-64 指令集。 (这个
超集 FMA4、AVX、XOP、LWP、AES、PCL_MUL、CX16、MMX、SSE、SSE2、SSE3、SSE4A、
SSSE3、SSE4.1、SSE4.2、ABM 和 64 位指令集扩展。)
BDVER2
支持 x15-86 指令集的基于 AMD 家族 64h 内核的 CPU。 (这个
超集 BMI、TBM、F16C、FMA、AVX、XOP、LWP、AES、PCL_MUL、CX16、MMX、SSE、SSE2、
SSE3、SSE4A、SSSE3、SSE4.1、SSE4.2、ABM 和 64 位指令集扩展。)
BDVER3
支持 x15-86 指令集的基于 AMD 家族 64h 内核的 CPU。 (这个
超集 BMI、TBM、F16C、FMA、AVX、XOP、LWP、AES、PCL_MUL、CX16、MMX、SSE、SSE2、
SSE3、SSE4A、SSSE3、SSE4.1、SSE4.2、ABM 和 64 位指令集扩展。
版本1
基于 AMD 系列 14h 内核的 CPU,支持 x86-64 指令集。 (这个
超集 MMX、SSE、SSE2、SSE3、SSSE3、SSE4A、CX16、ABM 和 64 位指令集
扩展名。)
版本2
CPU 基于 AMD 系列 16h 内核,支持 x86-64 指令集。 这个
包括 MOVBE、F16C、BMI、AVX、PCL_MUL、AES、SSE4.2、SSE4.1、CX16、ABM、SSE4A、
SSSE3、SSE3、SSE2、SSE、MMX 和 64 位指令集扩展。
winchip-c6
IDT WinChip C6 CPU,处理方式与 i486 相同,附加 MMX 指令集
支持。
温芯2
IDT WinChip 2 CPU,处理方式与 i486 相同,但增加了 MMX 和 3DNow!
指令集支持。
c3 威盛 C3 CPU 与 MMX 和 3DNow! 指令集支持。 (没有调度是
为该芯片实现。)
c3-2
威盛 C3-2 (Nehemiah/C5XL) CPU,支持 MMX 和 SSE 指令集。 (不
该芯片实现了调度。)
晶洞
带有 MMX 和 3DNow! 的 AMD Geode 嵌入式处理器指令集支持。
-mtune=cpu类型
调到 cpu类型 所有适用于生成的代码,除了 ABI
以及可用的指令集。 在挑选特定的 cpu类型 时间表
适合该特定芯片的事情,编译器不会生成任何代码
不能在默认机器类型上运行,除非您使用 -三月=cpu类型 选项。
例如,如果为 i686-pc-linux-gnu 配置了 GCC,则 -mtune=奔腾4 产生
针对 Pentium 4 但仍可在 i686 机器上运行的代码。
的选择 cpu类型 与相同 -行进。 此外, -mtune 支持一个
额外的选择 cpu类型:
通用
生成针对最常见的 IA32/AMD64/EM64T 处理器优化的代码。 如果你
知道您的代码将在哪个 CPU 上运行,那么您应该使用相应的
-mtune or -行进 选项而不是 -mtune=通用. 但是,如果你不知道
正是您的应用程序的 CPU 用户将拥有的,那么您应该使用它
选项。
随着市场上部署新处理器,此选项的行为
将改变。 因此,如果升级到更新版本的 GCC,代码生成
由该选项控制的将改变以反映最
在 GCC 版本发布时很常见。
没有 -march=通用 选项因为 -行进 表示指令集
编译器可以使用,并且没有通用的指令集适用于所有
处理器。 相比之下, -mtune 表示处理器(或者,在这种情况下,
处理器的集合)优化了代码。
-单片机=cpu类型
已弃用的同义词 -mtune.
-mfpmath=单元
为选定的单元生成浮点运算 单元. 的选择 单元 是:
387 使用大多数芯片上的标准 387 浮点协处理器
并以其他方式模拟。 使用此选项编译的代码几乎可以在任何地方运行。
临时结果以 80 位精度计算,而不是精度
由类型指定,导致与大多数的结果略有不同
其他芯片。 看 -float-存储 更详细的描述。
这是 i386 编译器的默认选择。
上证 使用 SSE 指令集中存在的标量浮点指令。 这个
Pentium III 和更新的芯片支持指令集,并且在 AMD 系列中
由 Athlon-4、Athlon XP 和 Athlon MP 芯片组成。 上证所早期版本
指令集仅支持单精度算术,因此 double 和
扩展精度算术仍然使用 387 完成。更高版本,目前
仅在 Pentium 4 和 AMD x86-64 芯片中,也支持双精度运算。
对于 i386 编译器,您必须使用 -三月=cpu类型, -MSSE or -msse2 切换到
启用 SSE 扩展并使此选项生效。 对于 x86-64 编译器,
默认情况下启用这些扩展。
在大多数情况下,生成的代码应该快得多,并且
避免387码的数值不稳定问题,但可能会破坏一些现有的
期望临时变量为 80 位的代码。
这是 x86-64 编译器的默认选择。
上证,387
上证+387
都
尝试同时使用两个指令集。 这有效地加倍
可用寄存器的数量,以及在具有 387 个独立执行单元的芯片上
和 SSE 执行资源。 谨慎使用此选项,因为它仍然是
实验性的,因为 GCC 寄存器分配器没有单独建模
功能单元不好,导致性能不稳定。
-masm=方言
使用选定的输出汇编指令 方言. 支持的选择是 英特尔 or
至 (默认)。 达尔文不支持 英特尔.
-mieee-fp
-mno-IEEE-fp
控制编译器是否使用 IEEE 浮点比较。 这些
正确处理比较结果无序的情况。
-msoft-浮动
生成包含浮点库调用的输出。
警告: 必需的库不是 GCC 的一部分。 通常,酒店的设施
使用机器通常的 C 编译器,但这不能直接在跨
汇编。 您必须自行安排提供合适的图书馆
交叉编译功能。
在函数在 80387 寄存器中返回浮点结果的机器上
堆栈中,一些浮点操作码可能会被发出,即使 -msoft-浮动 用来。
-mno-fp-ret-in-387
不要将 FPU 寄存器用于函数的返回值。
通常的调用约定有函数返回“float”和“double”类型的值
在 FPU 寄存器中,即使没有 FPU。 这个想法是操作系统
应该模拟一个 FPU。
选项 -mno-fp-ret-in-387 导致这些值在普通 CPU 中返回
代替注册。
-mno-花式数学-387
一些 387 模拟器不支持“sin”、“cos”和“sqrt”指令
387. 指定此选项以避免生成那些指令。 这个选项是
FreeBSD、OpenBSD 和 NetBSD 上的默认设置。 此选项在以下情况下被覆盖 -行进
表示目标 CPU 总是有一个 FPU,所以指令不需要
仿真。 除非您还使用
-funsafe-数学优化 开关。
-malign-双
-mno-对齐双精度
控制 GCC 是否在 a 上对齐“double”、“long double”和“long long”变量
二字边界或一字边界。 在两个字上对齐“双”变量
边界生成的代码在 Pentium 上运行速度稍快,但代价是更多
记忆。
在 x86-64 上, -malign-双 默认情况下启用。
警告: 如果您使用 -malign-双 switch,包含上述类型的结构
与已发布的应用程序二进制接口规范的对齐方式不同
对于 386 并且与没有编译的代码中的结构二进制兼容
那个开关。
-m96位长双精度
-m128位长双精度
这些开关控制“long double”类型的大小。 i386 应用程序二进制文件
接口指定大小为 96 位,所以 -m96位长双精度 是默认值
32 位模式。
现代架构(Pentium 和更新的)更喜欢“long double”来对齐 8-
或 16 字节边界。 在符合 ABI 的数组或结构中,这不是
可能的。 所以指定 -m128位长双精度 将“long double”对齐到 16 字节
通过用额外的 32 位零填充“long double”来边界。
在 x86-64 编译器中, -m128位长双精度 是作为其 ABI 的默认选择
指定“long double”在 16 字节边界上对齐。
请注意,这些选项均不支持 x87 标准的任何额外精度
80 位的“长双精度”。
警告: 如果您覆盖目标 ABI 的默认值,则会更改大小
包含“long double”变量的结构和数组,以及修改
采用“long double”的函数的函数调用约定。 因此他们不是
与没有该开关编译的代码二进制兼容。
-mlong-double-64
-mlong-double-80
这些开关控制“long double”类型的大小。 64 位的大小使
“long double”类型等同于“double”类型。 这是 Bionic C 的默认设置
图书馆。
警告: 如果您覆盖目标 ABI 的默认值,则会更改大小
包含“long double”变量的结构和数组,以及修改
采用“long double”的函数的函数调用约定。 因此他们不是
与没有该开关编译的代码二进制兼容。
-mlarge-数据阈值=门槛
什么时候 -mcmodel=中等 被指定,数据对象大于 门槛 放在
大数据部分。 此值在链接到的所有对象中必须相同
二进制文件,默认为 65535。
-mrtd.
使用不同的函数调用约定,其中采用固定的函数
以“ret”返回的参数数量 数” 指令,弹出他们的论点
回来的时候。 这在调用者中节省了一条指令,因为不需要
弹出那里的论点。
您可以指定使用此调用序列调用单个函数
函数属性 STDCALL. 您还可以覆盖 -mrtd. 选项通过使用
功能属性 CDECL.
警告: 此调用约定与 Unix 上通常使用的约定不兼容,
因此,如果您需要调用使用 Unix 编译器编译的库,则不能使用它。
此外,您必须为所有采用变量的函数提供函数原型
参数的数量(包括“printf”); 否则会生成不正确的代码
调用这些函数。
此外,如果调用一个函数太多,会导致严重错误的代码
论据。 (通常,额外的参数会被无害地忽略。)
-mregparm=NUM
控制用于传递整数参数的寄存器数量。 默认情况下,没有
寄存器用于传递参数,最多可以使用3个寄存器。 你可以
使用 function 属性控制特定函数的此行为 注册表.
警告: 如果你使用这个开关,并且 NUM 非零,则必须构建所有模块
具有相同的值,包括任何库。 这包括系统库和
启动模块。
-msseregparm
对浮点和双参数以及返回值使用 SSE 寄存器传递约定。
您可以使用 function 属性控制特定函数的此行为
塞雷格帕姆.
警告: 如果使用此开关,则必须构建具有相同值的所有模块,
包括任何图书馆。 这包括系统库和启动模块。
-mvect8-ret-内存
返回内存中的 8 字节向量而不是 MMX 寄存器。 这是默认设置
Solaris@tie{}8 和 9 以及 VxWorks 以匹配 Sun Studio 编译器的 ABI,直到
版本 12。随后的编译器版本(从 Studio 12 Update@tie{}1 开始)
其他 x86 目标使用的 ABI,这是 Solaris@tie{}10 及更高版本的默认设置。
只有 如果您需要保持与现有代码的兼容,请使用此选项
那些以前的编译器版本或旧版本的 GCC。
-mpc32
-mpc64
-mpc80
将 80387 浮点精度设置为 32、64 或 80 位。 什么时候 -mpc32 被指定,
浮点运算结果的有效数四舍五入为 24 位
(单精度); -mpc64 舍入浮点结果的有效数
操作到 53 位(双精度)和 -mpc80 舍入结果的有效数
浮点运算到 64 位(扩展双精度),这是
默认。 使用此选项时,更高精度的浮点运算是
如果没有明确设置 FPU 控制字,则程序员无法使用。
将浮点运算的舍入设置为小于默认的 80 位可以
将某些程序的速度提高 2% 或更多。 请注意,一些数学库假设
默认情况下启用扩展精度(80 位)浮点运算; 例行公事
在这样的图书馆中可能会遭受严重的准确性损失,通常是通过这样 -
称为“灾难性取消”,当此选项用于将精度设置为
小于扩展精度。
-mstack重新对齐
在入口处重新对齐堆栈。 在 Intel x86 上, -mstack重新对齐 选项生成一个
必要时重新调整运行时堆栈的备用序言和尾声。 这个
支持将保持 4 字节堆栈对齐的遗留代码与现代代码混合
保持 16 字节堆栈对齐以实现 SSE 兼容性。 另见属性
“force_align_arg_pointer”,适用于单个函数。
-mpreferred-堆栈边界=NUM
尝试使堆栈边界与 2 对齐 NUM 字节边界。 如果
-首选堆栈边界 未指定,默认为 4(16 字节或 128 位)。
警告: 使用 SSE 扩展为 x86-64 架构生成代码时
残疾人, -mpreferred-堆栈边界=3 可用于保持堆栈边界对齐
到 8 字节边界。 由于 x86-64 ABI 需要 16 字节堆栈对齐,这是 ABI
不兼容,旨在用于堆栈空间有限的受控环境
重要的限制。 这个选项会在函数编译时导致错误的代码
调用 16 字节堆栈对齐(例如标准库中的函数)
堆栈未对齐。 在这种情况下,SSE 指令可能会导致内存未对齐
访问陷阱。 此外,对于 16 字节的变量参数将被错误地处理
对齐的对象(包括 x87 long double 和 __int128),导致错误结果。
您必须构建所有模块 -mpreferred-堆栈边界=3,包括任何库。
这包括系统库和启动模块。
-mincoming-堆栈边界=NUM
假设传入堆栈与 2 对齐 NUM 字节边界。 如果
-mincoming-堆栈边界 未指定,指定的一个
-首选堆栈边界 用来。
在 Pentium 和 Pentium Pro 上,“double”和“long double”值应该与
8 字节边界(见 -malign-双) 或遭受显着的运行时性能
处罚。 在 Pentium III 上,Streaming SIMD Extension (SSE) 数据类型“__m128”可能
如果不是 16 字节对齐,则无法正常工作。
为了确保堆栈上这些值的正确对齐,堆栈边界必须为
根据存储在堆栈中的任何值的要求对齐。 此外,每个函数
必须生成以保持堆栈对齐。 因此调用一个函数
使用较低优先级编译的函数编译时使用较高优先级堆栈边界
首选堆栈边界很可能使堆栈未对齐。 建议
使用回调的库总是使用默认设置。
这种额外的对齐确实会消耗额外的堆栈空间,并且通常会增加代码
尺寸。 对堆栈空间使用敏感的代码,例如嵌入式系统和
操作系统内核,可能希望将首选对齐方式减少到
-mpreferred-堆栈边界=2.
-mmx
-mno-mmx
-MSSE
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-mssse3
-mno-ssse3
-msse4.1
-mno-sse4.1
-msse4.2
-mno-sse4.2
-msse4
-mno-sse4
-mavx
-mno-avx
-mavx2
-mno-avx2
-梅斯
-mno-aes
-mpclmul
-mno-pclmul
-mfsgsbase
-mno-fsgsbase
-mrdrnd
-mno-rdrnd
-mf16c
-mno-f16c
-mfma
-mno-fma
-msse4a
-mno-sse4a
-mfma4
-mno-fma4
-mxop
-mno-xop
-mlwp
-mno-lwp
-m3dnow
-mno-3dnow
-mpopcnt
-mno-popcnt
-mabm
-mno-反导导弹
-mbmi
-mbmi2
-mno-BMI
-mno-BMI2
-mlzcnt
-mno-lzcnt
-mrtm
-MTBM
-mno-tbm
这些开关启用或禁用 MMX、SSE、SSE2、SSE3、
SSSE3、SSE4.1、AVX、AVX2、AES、PCLMUL、FSGSBASE、RDRND、F16C、FMA、SSE4A、FMA4、XOP、
LWP、ABM、BMI、BMI2、LZCNT、RTM 或 3DNow! 扩展指令集。 这些
扩展也可用作内置函数:请参阅 X86 内建的 功能,为
这些开关启用和禁用的功能的详细信息。
从浮点代码自动生成 SSE/SSE2 指令(而不是
到 387 指令),见 -mfpmath=sse.
GCC 在以下情况下会抑制 SSEx 指令 -mavx 用来。 相反,它会生成新的 AVX
需要时所有 SSEx 指令的指令或 AVX 等效。
这些选项使 GCC 能够在生成的代码中使用这些扩展指令,甚至
也完全不需要 -mfpmath=sse. 执行运行时 CPU 检测的应用程序必须编译
使用适当的标志为每个支持的体系结构单独的文件。 在
特别是,包含 CPU 检测代码的文件应在编译时不
这些选项。
-mcld
此选项指示 GCC 在函数的序言中发出“cld”指令
使用字符串指令。 字符串指令依赖于 DF 标志来选择
在自动递增或自动递减模式之间。 虽然 ABI 将 DF 标志指定为
在函数入口被清除,一些操作系统通过不违反此规范
清除异常调度程序中的 DF 标志。 异常处理程序可以是
在设置 DF 标志的情况下调用,这会导致字符串错误的方向模式
使用说明。 默认情况下,可以通过以下方式在 32 位 x86 目标上启用此选项
使用以下命令配置 GCC --启用-cld 配置选项。 “cld”的产生
指令可以被抑制 -mno-cld 在这种情况下,编译器选项。
-mvzeroupper
此选项指示 GCC 在传输之前发出“vzeroupper”指令
控制流出函数以最小化 AVX 到 SSE 的转换惩罚
删除不必要的“zeroupper”内在函数。
-mprefer-avx128
此选项指示 GCC 使用 128 位 AVX 指令而不是 256 位 AVX
自动矢量器中的说明。
-mcx16
该选项使 GCC 能够生成“CMPXCHG16B”指令。 “CMPXCHG16B”允许
用于 128 位双四字(或 oword)数据类型的原子操作。 这是
对于可以由多个处理器更新的高分辨率计数器很有用(或
核)。 此指令是作为原子内置函数的一部分生成的:请参阅
__同步 内置函数 or __原子 内置函数 了解详情。
-msahf
此选项启用以 64 位代码生成“SAHF”指令。 早期的英特尔
Pentium 4 CPU 支持 Intel 64,在 Pentium 4 G1 step 引入之前
2005 年 XNUMX 月,缺少“LAHF”和“SAHF”指令支持
AMD64。 这些分别是某些状态标志的加载和存储指令。
在 64 位模式下,“SAHF”指令用于优化“fmod”、“drem”和
“剩余”内置函数; 看 其他 内置函数 了解详情。
-mmmovbe
此选项允许使用“movbe”指令来实现“__builtin_bswap32”
和“__builtin_bswap64”。
-mcrc32
此选项启用内置函数“__builtin_ia32_crc32qi”,
“__builtin_ia32_crc32hi”、“__builtin_ia32_crc32si”和“__builtin_ia32_crc32di”到
生成“crc32”机器指令。
-mrecip
此选项允许使用“RCPSS”和“RSQRTSS”指令(及其矢量化
变体“RCPPS”和“RSQRTPS”),带有额外的 Newton-Raphson 步骤以增加
精度而不是“DIVSS”和“SQRTSS”(及其矢量化变体)用于单
精度浮点参数。 这些指令仅在以下情况下生成
-funsafe-数学优化 与 - 仅限数学 和
-fno-捕获数学. 请注意,虽然序列的吞吐量高于
非互易指令的吞吐量,序列的精度可以是
最多减少 2 ulp(即 1.0 的倒数等于 0.99999994)。
注意 GCC 实现了 "1.0f/sqrtf(X)” 在“RSQRTSS”(或“RSQRTPS”)方面已经
- -ffast-数学 (或上述选项组合),并且不需要 -mrecip.
另请注意,GCC 发出上述序列以及额外的 Newton-Raphson 步骤
矢量化单浮点除法和矢量化“sqrtf(X)” 已经有了 -ffast-数学
(或上述选项组合),并且不需要 -mrecip.
-mrecip=选择
此选项控制可以使用哪些相互估计指令。 选择 是一个
逗号分隔的选项列表,前面可能有一个 ! 反转选项:
所有 启用所有估算说明。
默认
启用默认指令,相当于 -mrecip.
没有
禁用所有估计指令,相当于 -mno-食谱.
DIV 启用标量除法的近似值。
向量除法
启用矢量化除法的近似值。
开方
启用标量平方根的近似值。
向量平方根
启用矢量化平方根的近似值。
因此,例如 -mrecip=全部,!sqrt 启用所有倒数近似值,
除了平方根。
-mveclibabi=类型
指定用于使用外部库矢量化内部函数的 ABI 类型。
支持的值 类型 旨在 虚拟机 对于英特尔短向量数学库和 ACML
对于 AMD 数学核心库。 要使用此选项, -ftree-矢量化 和
-funsafe-数学优化 必须启用,并且与 SVML 或 ACML ABI 兼容
必须在链接时指定库。
GCC 当前发出对“vmldExp2”、“vmldLn2”、“vmldLog102”、“vmldLog102”的调用,
"vmldPow2", "vmldTanh2", "vmldTan2", "vmldAtan2", "vmldAtanh2", "vmldCbrt2",
"vmldSinh2", "vmldSin2", "vmldAsinh2", "vmldAsin2", "vmldCosh2", "vmldCos2",
"vmldAcosh2", "vmldAcos2", "vmlsExp4", "vmlsLn4", "vmlsLog104", "vmlsLog104",
“vmlsPow4”、“vmlsTanh4”、“vmlsTan4”、“vmlsAtan4”、“vmlsAtanh4”、“vmlsCbrt4”、
"vmlsSinh4", "vmlsSin4", "vmlsAsinh4", "vmlsAsin4", "vmlsCosh4", "vmlsCos4",
对应函数类型的“vmlsAcosh4”和“vmlsAcos4” -mveclibabi=svml is
使用,和“__vrd2_sin”,“__vrd2_cos”,“__vrd2_exp”,“__vrd2_log”,“__vrd2_log2”,
"__vrd2_log10", "__vrs4_sinf", "__vrs4_cosf", "__vrs4_expf", "__vrs4_logf",
对应函数类型的“__vrs4_log2f”、“__vrs4_log10f”和“__vrs4_powf”
,尤其是 -mveclibabi=acml 用来。
-马比=姓名
为指定的调用约定生成代码。 允许的值为 系统
在 GNU/Linux 和其他系统上使用的 ABI,以及 ms 对于 Microsoft ABI。 这
默认是在面向 Microsoft Windows 和 SysV ABI 时使用 Microsoft ABI
在所有其他系统上。 您可以通过使用控制特定功能的此行为
函数属性 女士_abi/sysv_abi.
-mtls-方言=类型
使用以下命令生成代码以访问线程本地存储 GNU or GNU2 约定。 GNU
是保守的默认值; GNU2 效率更高,但它可能会添加编译和运行
无法在所有系统上满足的时间要求。
-mpush-args
-mno-push-args
使用 PUSH 操作存储传出参数。 这种方法较短,通常
与使用 SUB/MOV 操作的方法一样快,默认情况下启用。 在一些
禁用它的情况可能会提高性能,因为改进的调度和减少
依赖性。
-maccumulate-传出参数
如果启用,传出参数所需的最大空间量计算在
函数序言。 这在大多数现代 CPU 上更快,因为减少了
依赖,改进了调度并减少了首选堆栈时的堆栈使用
边界不等于 2。缺点是代码大小显着增加。 这个
开关暗示 -mno-push-args.
-多线程
支持 MinGW 上的线程安全异常处理。 依赖线程安全的程序
异常处理必须编译和链接所有代码 -多线程 选项。 什么时候
编译, -多线程 定义“-D_MT”; 链接时,它链接到一个特殊的线程
辅助库 -lmingwtrd 它清理每个线程的异常处理数据。
-mno-align-stringops
不要对齐内联字符串操作的目标。 这个开关减少了代码
如果目标已经对齐,则大小并提高性能,但 GCC
不知道。
-minline-all-stringops
默认情况下,GCC 仅在已知目的地时内联字符串操作
对齐到至少 4 字节的边界。 这可以实现更多内联并增加代码
大小,但可能会提高依赖于快速“memcpy”、“strlen”和
“memset”用于短长度。
-minline-stringops-动态
对于未知大小的字符串操作,使用带有内联代码的运行时检查
块和大块的库调用。
-mstringop-策略=ALG
覆盖特定算法的内部决策启发式以用于
内联字符串操作。 允许的值 ALG 是:
代表字节
代表_4字节
代表_8字节
使用指定大小的 i386 "rep" 前缀展开。
字节循环
循环
展开_循环
扩展为内联循环。
库调用
始终使用库调用。
-momit 叶帧指针
不要将帧指针保存在叶函数的寄存器中。 这避免了
保存、设置和恢复帧指针的指令,并制作一个额外的寄存器
在叶函数中可用。 选项 -fomit 叶帧指针 删除框架
叶函数的指针,这可能会使调试更加困难。
-mtls-直接段参考
-mno-tls-direct-seg-refs
控制是否可以使用来自 TLS 段的偏移量访问 TLS 变量
注册(32 位的 %gs,64 位的 %fs),或者线程基指针是否必须是
添加。 这是否有效取决于操作系统,以及它是否有效
映射段以覆盖整个 TLS 区域。
对于使用 GNU C 库的系统,默认值为开启。
-msse2avx
-mno-sse2avx
指定汇编程序应使用 VEX 前缀对 SSE 指令进行编码。 选项
-mavx 默认情况下启用此功能。
-mfentry
-mno-fentry
如果分析处于活动状态 (-PG.),将分析计数器调用放在序言之前。
注意:在 x86 架构上,属性“ms_hook_prologue”在
时刻为 -mfentry 和 -PG..
-m8bit-idiv
-mno-8bit-idiv
在某些处理器上,例如 Intel Atom,8 位无符号整数除法比
32 位/64 位整数除法。 此选项生成运行时检查。 如果两者
被除数和除数在 0 到 255 的范围内,8 位无符号整数除法是
用于代替 32 位/64 位整数除法。
-mavx256-拆分未对齐负载
-mavx256-分割未对齐存储
拆分 32 字节 AVX 未对齐加载和存储。
这些 -m 86 位 x64-64 处理器上除上述之外还支持开关
环境。
-立方米
-立方米
-mx32
为 32 位或 64 位环境生成代码。 这 -立方米 选项设置“int”,“long”,
和指针类型为 32 位,并生成可在任何 i386 系统上运行的代码。
这款 -立方米 选项将“int”设置为 32 位,将“long”和指针类型设置为 64 位,并且
为 x86-64 架构生成代码。 仅对达尔文而言 -立方米 选项也
关闭 -fno-pic 和 -mdynamic-无图片 选项。
这款 -mx32 选项将“int”、“long”和指针类型设置为 32 位,并生成代码
对于 x86-64 架构。
-mno-红区
不要为 x86-64 代码使用所谓的“红区”。 红色区域是由
x86-64 ABI; 它是超出堆栈指针位置的 128 字节区域
由信号或中断处理程序修改,因此可用于临时数据
无需调整堆栈指针。 旗帜 -mno-红区 禁用此红色区域。
-mcmodel=小
为小代码模型生成代码:程序及其符号必须链接在
地址空间的低 2 GB。 指针是 64 位的。 程序可以
静态或动态链接。 这是默认的代码模型。
-mcmodel=内核
为内核代码模型生成代码。 内核在负 2 GB 的
地址空间。 该模型必须用于 Linux 内核代码。
-mcmodel=中等
为中型模型生成代码:程序链接在较低的 2 GB 中
地址空间。 小符号也放在那里。 尺寸大于的符号
-mlarge-data-阈值 被放入大数据或 BSS 部分,并且可以定位
2GB以上。 程序可以静态或动态链接。
-mcmodel=大
为大型模型生成代码。 该模型不对地址做任何假设
和截面的大小。
-地址模式=长
为长地址模式生成代码。 这仅支持 64 位和 x32
环境。 它是 64 位环境的默认地址模式。
-maddress-mode=短
为短地址模式生成代码。 仅支持 32 位和 x32
环境。 它是 32 位和 x32 环境的默认地址模式。
i386 和 x86 64 Windows 附加选项
这些附加选项可用于 Microsoft Windows 目标:
-控制台
此选项指定要生成控制台应用程序,通过指示
用于设置控制台应用程序所需的 PE 标头子系统类型的链接器。
此选项可用于 Cygwin 和 MinGW 目标,并在默认情况下启用
那些目标。
-mdll
此选项可用于 Cygwin 和 MinGW 目标。 它指定一个 DLL---a
动态链接库---要生成,可以选择需要的
运行时启动对象和入口点。
-mnop-fun-dll 导入
此选项可用于 Cygwin 和 MinGW 目标。 它指定了
“dllimport”属性应该被忽略。
-线程
此选项可用于 MinGW 目标。 它指定了 MinGW 特定的线程
将使用支持。
- 穆尼码
此选项可用于 MinGW-w64 目标。 它导致“UNICODE”预处理器
要预定义的宏,并选择支持 Unicode 的运行时启动代码。
-mwin32
此选项可用于 Cygwin 和 MinGW 目标。 它指定了典型的
Microsoft Windows 预定义宏将在预处理器中设置,但不会
影响运行时库/启动代码的选择。
-mwindows
此选项可用于 Cygwin 和 MinGW 目标。 它指定一个 GUI
应用程序将通过指示链接器设置 PE 标头来生成
子系统类型适当。
-fno-设置堆栈可执行文件
此选项可用于 MinGW 目标。 它指定可执行标志为
嵌套函数使用的堆栈未设置。 这对于运行的二进制文件是必需的
在 Microsoft Windows 的内核模式中,因为有 User32 API,用于设置
可执行权限,不可用。
-fwritable-重定位-rdata
此选项可用于 MinGW 和 Cygwin 目标。 它指定搬迁-
只读部分中的数据放入 .data 部分。 这是老年人的必需品
运行时不支持修改 .rdata 部分以进行伪重定位。
-mpe-对齐-公共
此选项可用于 Cygwin 和 MinGW 目标。 它指定 GNU
PE 文件格式的扩展,允许正确对齐 COMMON 变量
应在生成代码时使用。 如果 GCC 检测到
配置期间发现的目标汇编程序支持该功能。
另请参阅 i386 和 x86 64 附加选项 对于标准选项。
IA-64 附加选项
这些都是 -m 为 Intel IA-64 架构定义的选项。
-mbig-endian
为大端目标生成代码。 这是 HP-UX 的默认设置。
-小端
为小端目标生成代码。 这是 AIX5 和 GNU/Linux 的默认设置。
-mgnu-as
-mno-gnu-as
为 GNU 汇编器生成(或不生成)代码。 这是默认设置。
-mgnu-ld
-mno-gnu-ld
为 GNU 链接器生成(或不生成)代码。 这是默认设置。
-mno-pic
生成不使用全局指针寄存器的代码。 结果不是位置
独立代码,并违反 IA-64 ABI。
-mvolatile-asm-停止
-mno-volatile-asm-停止
在 volatile asm 语句之前和之后立即生成(或不)停止位。
-mregister 名称
-mno 注册名称
生成(或不生成) in, 禄及 输出 堆叠寄存器的寄存器名称。 这个
可能使汇编输出更具可读性。
-mno-sdata
-msdata
禁用(或启用)使用小数据部分的优化。 这可能有用
用于解决优化器错误。
-mconstant-gp
生成使用单个常量全局指针值的代码。 这在以下情况下很有用
编译内核代码。
-自动图片
生成可自重定位的代码。 这意味着 -mconstant-gp. 这很有用
编译固件代码时。
-minline-float-divide-min-latency
使用最小延迟为浮点值的内联除法生成代码
算法。
-minline-float-divide-max-吞吐量
使用最大吞吐量为浮点值的内联除法生成代码
算法。
-mno-内联浮点除法
不要为浮点值的除法生成内联代码。
-minline-int-divide-min-latency
使用最小延迟为整数值的内联除法生成代码
算法。
-minline-int-divide-max-吞吐量
使用最大吞吐量为整数值的内联除法生成代码
算法。
-mno-内联-int-除法
不要为整数值的除法生成内联代码。
-minline-sqrt-min-延迟
使用最小延迟算法为内联平方根生成代码。
-minline-sqrt-max-吞吐量
使用最大吞吐量算法生成内联平方根的代码。
-mno-内联-sqrt
不要为“sqrt”生成内联代码。
-mfused-madd
-mno-融合-madd
做(不)生成使用融合乘法/加法或乘法/减法的代码
指示。 默认是使用这些指令。
-mno-dwarf2-asm
-mdwarf2-asm
不要(或确实)为 DWARF 2 行号调试信息生成汇编代码。
这在不使用 GNU 汇编器时可能很有用。
-几乎停止位
-mno-早期停止位
允许停止位比紧接指令之前放置
触发停止位。 这可以改进指令调度,但并不总是
这样做。
-mfixed-范围=寄存器范围
生成将给定寄存器范围视为固定寄存器的代码。 固定寄存器
是寄存器分配器不能使用的。 这在编译内核时很有用
代码。 寄存器范围指定为由破折号分隔的两个寄存器。 多种的
可以用逗号分隔指定寄存器范围。
-mtls-大小=tls-大小
指定立即 TLS 偏移量的位大小。 有效值为 14、22 和 64。
-mtune=cpu类型
调整特定 CPU 的指令调度,有效值为 钛,
安腾1, 慈悲的, 安腾2及 麦金利.
-milp32
-mlp64
为 32 位或 64 位环境生成代码。 32 位环境设置 int,
long 和指向 32 位的指针。 64 位环境将 int 设置为 32 位,并将 long 和
指向 64 位的指针。 这些是 HP-UX 特定标志。
-mno-sched-br-数据规范
-msched-br-数据规范
(Dis/En)able 重新加载前的数据推测性调度。 这导致产生
“ld.a”指令和相应的检查指令(“ld.c”/“chk.a”)。 这
默认为“禁用”。
-msched-ar-数据规范
-mno-sched-ar-数据规范
(启用/禁用)重新加载后的数据推测性调度。 这导致产生
“ld.a”指令和相应的检查指令(“ld.c”/“chk.a”)。 这
默认为“启用”。
-mno-调度控制规范
-msched-控制规范
(Dis/En)able 控制推测性调度。 此功能仅在
区域调度(即重新加载之前)。 这导致生成“ld.s”
指令和相应的检查指令“chk.s”。 默认是
'禁用'。
-msched-br-in-数据规范
-mno-sched-br-in-数据规范
(En/Dis) 依赖于数据的指令的可推测性调度
重新加载前的推测加载。 这仅适用于 -msched-br-数据规范
启用。 默认值为“启用”。
-msched-ar-in-数据规范
-mno-sched-ar-in-数据规范
(En/Dis) 依赖于数据的指令的可推测性调度
重新加载后的推测加载。 这仅适用于 -msched-ar-数据规范
启用。 默认值为“启用”。
-msched-in-control-spec
-mno-sched-in-control-spec
(En/Dis) 依赖于指令的可推测性调度
控制投机负荷。 这仅适用于 -msched-控制规范 启用。
默认值为“启用”。
-mno-sched-prefer-非数据规范-insns
-msched-prefer-非数据规范-insns
如果启用,只有在没有
目前的其他选择。 这使得数据推测的使用更多
保守的。 默认值为“禁用”。
-mno-sched-prefer-non-control-spec-insns
-msched-首选非控制规范-insns
如果启用,则仅在存在以下情况时才为调度选择控制推测指令
目前没有其他选择。 这使得控件推测的使用很多
比较保守。 默认值为“禁用”。
-mno-sched-count-spec-in-关键路径
-msched-count-spec-in-关键路径
如果启用,则在计算
指令优先级。 这使得推测的使用更多一点
保守的。 默认值为“禁用”。
-msched-规范-ldc
使用简单的数据推测检查。 该选项默认开启。
-msched-控制规范-ldc
使用简单的检查进行控制推测。 该选项默认开启。
-每个周期后的 msched 停止位
调度时在每个周期后放置一个停止位。 该选项默认开启。
-msched-fp-mem-deps-零成本
假设浮点存储和加载在以下情况下不太可能引起冲突
放在同一个指令组。 默认情况下禁用此选项。
-msel-sched-不检查控制规范
在选择性调度中生成控制推测的检查。 这个标志是
默认禁用。
-msched-max-内存-insns=最大insns
限制每个指令组的内存insn数量,给予较低的优先级
随后的内存 insns 尝试在同一指令组中进行调度。
通常用于防止缓存组冲突。 默认值为 1。
-msched-max-内存-insns-硬限制
使由指定的限制 msched-最大内存-insns 硬限制,不允许更多
比指令组中的那个数字。 否则,限制是“软”,意思是
达到限制时首选非内存操作,但内存
操作可能仍会被安排。
LM32 附加选项
这些 -m 为 LatticeMico32 架构定义了选项:
-mbarrel-shift-启用
启用桶形移位指令。
-mdivide 启用
启用除法和取模指令。
-mmultiply 启用
启用乘法指令。
-msign-extend 启用
启用符号扩展指令。
-muser 启用
启用用户定义的指令。
M32C 附加选项
-单片机=姓名
选择为其生成代码的 CPU。 姓名 可能是其中之一 r8c 对于 R8C/Tiny
系列, m16c 对于 M16C(最多 /60)系列, m32厘米 对于 M16C/80 系列,或 m32c
适用于 M32C/80 系列。
-msim
指定程序将在模拟器上运行。 这会导致替代
要链接的运行时库,例如支持文件 I/O。 你不能
在生成将在真实硬件上运行的程序时使用此选项; 你必须
为需要的任何 I/O 函数提供您自己的运行时库。
-memregs=数
指定 GCC 在代码生成期间使用的基于内存的伪寄存器的数量。
这些伪寄存器像真实寄存器一样使用,因此需要权衡
GCC 将代码装入可用寄存器的能力,以及
使用内存代替寄存器。 请注意,程序中的所有模块都必须
使用此选项的相同值编译。 因此,你不能使用这个
选项与 GCC 的默认运行时库。
M32R/D 附加选项
这些 -m 为瑞萨 M32R/D 架构定义的选项:
-m32r2
为 M32R/2 生成代码。
-m32rx
为 M32R/X 生成代码。
-m32r
为 M32R 生成代码。 这是默认设置。
-mmodel=小
假设所有对象都位于内存的低 16MB(以便它们的地址可以
加载了“ld24”指令),并假设所有子程序都可以通过
“bl”指令。 这是默认设置。
可以使用“模型”属性设置特定对象的可寻址性。
-mmodel=中等
假设对象可能位于 32 位地址空间中的任何位置(编译器生成
“seth/add3”指令加载它们的地址),并假设所有子程序都是
可以通过“bl”指令访问。
-mmodel=大
假设对象可能位于 32 位地址空间中的任何位置(编译器生成
“seth/add3”指令加载它们的地址),并假设子程序可能不是
可通过“bl”指令访问(编译器生成速度慢得多的指令)
“seth/add3/jl”指令序列)。
-msdata=无
禁止使用小数据区。 变量被放入其中之一 。数据, .bss或
.rodata (除非已指定“section”属性)。 这是默认设置。
小数据区由部分组成 .sdata 和 .sbss. 对象可能是明确的
使用这些部分之一放入具有“部分”属性的小数据区。
-msdata=sdata
将小的全局和静态数据放在小数据区,但不生成特殊
代码来引用它们。
-msdata=使用
将小的全局和静态数据放在小数据区,并生成特殊的
参考它们的说明。
-G NUM
放置全局和静态对象小于或等于 NUM 字节到小数据或
BSS 部分而不是普通数据或 BSS 部分。 默认值为 NUM is
8. -msdata 选项必须设置为以下之一 数据 or 使用 对于这个选项有任何
效果。
所有模块都应该使用相同的 -G NUM 价值。 编译不同
的值 NUM 可能有效,也可能无效; 如果不是,链接器会给出错误
消息---不生成不正确的代码。
-调试
使编译器中特定于 M32R 的代码显示一些可能有帮助的统计信息
在调试程序中。
-恶性循环
将所有循环对齐到 32 字节的边界。
-mno-对齐循环
不要强制循环使用 32 字节对齐。 这是默认设置。
-错发率=数
问题 数 每个周期的指令。 数 只能是 1 或 2。
-mbranch-成本=数
数 只能是 1 或 2。如果是 1,则分支优先于条件
代码,如果是 2,则相反。
-mflush-trap=数
指定用于刷新缓存的陷阱编号。 默认为 12。有效
数字介于 0 和 15 之间(包括 XNUMX 和 XNUMX)。
-mno-冲洗陷阱
指定不能使用陷阱刷新缓存。
-mflush-函数=姓名
指定要调用以刷新缓存的操作系统函数的名称。 这
默认是 _刷新缓存,但只有在陷阱不可用时才使用函数调用。
-mno-flush-func
表示没有用于刷新缓存的操作系统功能。
M680x0 附加选项
这些都是 -m 为 M680x0 和 ColdFire 处理器定义的选项。 默认设置
取决于配置编译器时选择的架构; 默认值
下面给出了最常见的选择。
-三月=拱
为特定的 M680x0 或 ColdFire 指令集架构生成代码。
允许值 拱 对于 M680x0 架构是: 68000, 68010, 68020, 68030,
68040, 68060 和 cpu32. ColdFire 架构是根据飞思卡尔的
ISA 分类和允许值是: ISAA, 艾萨加, 伊萨 和 ISAC.
GCC 定义了一个宏 __mcf拱__ 每当它为 ColdFire 目标生成代码时。
这款 拱 在这个宏中是其中之一 -行进 上面给出的论据。
一起使用时, -行进 和 -mtune 选择在类似系列上运行的代码
处理器,但它针对特定的微体系结构进行了优化。
-单片机=CPU
为特定的 M680x0 或 ColdFire 处理器生成代码。 M680x0 CPUs 是:
68000, 68010, 68020, 68030, 68040, 68060, 68302, 68332 和 cpu32. 冷火 CPUs
由下表给出,该表还将 CPU 分为系列:
家庭 : -微处理器 参数
51 : 51 51ac 51ag 51cn 51em 51je 51jf 51jg 51jm 51mm 51qe 51qm
5206 : 5202 5204 5206
5206e : 5206e
5208 : 5207 5208
5211a : 5210a 5211a
5213 : 5211 5212 5213
5216 : 5214 5216
52235 : 52230 52231 52232 52233 52234 52235
5225 : 5224 5225
52259 : 52252 52254 52255 52256 52258 52259
5235 : 5232 5233 5234 5235 523x
5249 : 5249
5250 : 5250
5271 : 5270 5271
5272 : 5272
5275 : 5274 5275
5282 : 5280 5281 5282 528x
53017 : 53011 53012 53013 53014 53015 53016 53017
5307 : 5307
5329 : 5327 5328 5329 532x
5373 : 5372 5373 537x
5407 : 5407
5475 : 5470 5471 5472 5473 5474 5475 547x 5480 5481 5482 5483 5484 5485
-单片机=CPU 覆盖 -三月=拱 if 拱 与...兼容 CPU. 的其他组合
-微处理器 和 -行进 被拒绝。
GCC 定义了宏 __mcf_cpu_CPU 当冷火目标 CPU 被选中。 它也是
定义 __mcf_family_家庭,其中的值 家庭 由上表给出。
-mtune=调
在由以下设置的约束内调整特定微体系结构的代码 -行进
和 -微处理器. M680x0 微架构是: 68000, 68010, 68020, 68030, 68040,
68060 和 cpu32. ColdFire 微架构是: CFV1, CFV2, CFV3, CFV4 和
cfv4e.
您还可以使用 -mtune=68020-40 对于需要在68020上运行相对较好的代码,
68030 和 68040 目标。 -mtune=68020-60 类似,但包括 68060 个目标
好。 这两个选项选择与 -m68020-40 和 -m68020-60
。
GCC 定义了宏 __mc拱 和 __mc拱__ 调整 680x0 架构时
拱. 它还定义了 mc拱 除非 -ansi 或非 GNU -标准 选项被使用。
如果 GCC 正在针对一系列架构进行调整,如由 -mtune=68020-40 or
-mtune=68020-60,它定义了该范围内每个架构的宏。
GCC 还定义了宏 __米酋长__ 调整 ColdFire 微架构时
酋长,其中 酋长 是上面给出的论点之一。
-立方米
-MC68000
为 68000 生成输出。这是编译器配置为的默认值
基于 68000 的系统。 它相当于 -三月=68000.
将此选项用于具有 68000 或 EC000 内核的微控制器,包括 68008、
68302,68306,68307,68322,68328和68356。
-立方米
为 68010 生成输出。这是编译器配置为的默认值
基于 68010 的系统。 它相当于 -三月=68010.
-立方米
-MC68020
为 68020 生成输出。这是编译器配置为的默认值
基于 68020 的系统。 它相当于 -三月=68020.
-立方米
为 68030 生成输出。这是编译器配置为的默认值
基于 68030 的系统。 它相当于 -三月=68030.
-立方米
为 68040 生成输出。这是编译器配置为的默认值
基于 68040 的系统。 它相当于 -三月=68040.
此选项禁止使用 68881/68882 指令,这些指令必须由
68040 上的软件。如果您的 68040 没有要模拟的代码,请使用此选项
那些指令。
-立方米
为 68060 生成输出。这是编译器配置为的默认值
基于 68060 的系统。 它相当于 -三月=68060.
此选项禁止使用 68020 和 68881/68882 指令,这些指令必须
由 68060 上的软件模拟。如果您的 68060 没有代码,请使用此选项
模仿这些指令。
-单片机32
为 CPU32 生成输出。 这是编译器配置为的默认值
基于 CPU32 的系统。 它相当于 -行军=cpu32.
将此选项用于具有 CPU32 或 CPU32+ 内核的微控制器,包括 68330、
68331、68332、68333、68334、68336、68340、68341、68349和68360。
-立方米
为 520X ColdFire CPU 生成输出。 这是编译器时的默认设置
为基于 520X 的系统配置。 它相当于 -单片机=5206,现在
不赞成使用该选项。
将此选项用于具有 5200 内核的微控制器,包括 MCF5202、MCF5203、
MCF5204 和 MCF5206。
-m5206e
为 5206e ColdFire CPU 生成输出。 该选项现在已弃用,取而代之的是
等价的 -单片机=5206e.
-m528x
为 ColdFire 528X 系列的成员生成输出。 选项是现在
不赞成使用等价物 -单片机=528x.
-立方米
为 ColdFire 5307 CPU 生成输出。 该选项现已弃用,取而代之的是
当量 -单片机=5307.
-立方米
为 ColdFire 5407 CPU 生成输出。 该选项现已弃用,取而代之的是
当量 -单片机=5407.
-mcfv4e
为 ColdFire V4e 系列 CPU(例如 547x/548x)生成输出。 这包括使用
硬件浮点指令。 该选项相当于 -单片机=547x和IS
现在不赞成使用该选项。
-m68020-40
为 68040 生成输出,不使用任何新指令。 这结果
在可以在 68020/68881 或 68030 或
68040. 生成的代码确实使用了在 68881 上模拟的指令
68040.
该选项相当于 -三月=68020 -mtune=68020-40.
-m68020-60
为 68060 生成输出,不使用任何新指令。 这结果
在可以在 68020/68881 或 68030 或
68040. 生成的代码确实使用了在 68881 上模拟的指令
68060.
该选项相当于 -三月=68020 -mtune=68020-60.
-mhard-浮动
-立方米
生成浮点指令。 这是 68020 及更高版本的默认值,并且
适用于具有 FPU 的 ColdFire 设备。 它定义了宏 __有_68881__ 在 M680x0 上
目标和 __mcffpu__ 在 ColdFire 目标上。
-msoft-浮动
不生成浮点指令; 改用库调用。 这是
68000、68010 和 68832 目标的默认值。 它也是 ColdFire 的默认设置
没有 FPU 的设备。
-mdiv
-mno-div
生成(不生成)ColdFire 硬件除法和余数指令。 如果
-行进 不使用 -微处理器,ColdFire 架构的默认值为“on”,“off”
用于 M680x0 架构。 否则,默认值取自目标 CPU(或者
默认 CPU,或指定的 CPU -微处理器)。 例如,默认为“关闭”
-单片机=5206 和“开”为 -单片机=5206e.
GCC 定义了宏 __mcfhwdiv__ 启用此选项时。
-mshort
将类型“int”视为 16 位宽,例如“short int”。 此外,参数
即使在 API
强制升级到 32 位。
-mno-短
不要将类型“int”视为 16 位宽。 这是默认设置。
-mnobitfield
-mno-位域
不要使用位域指令。 这 -立方米, -单片机32 和 -立方米 选项意味着
-mnobitfield.
-mbitfield
一定要使用位域指令。 这 -立方米 选项暗示 -mbitfield。 这是
如果您使用专为 68020 设计的配置,则为默认设置。
-mrtd.
使用不同的函数调用约定,其中采用固定的函数
使用“rtd”指令返回的参数数量,该指令弹出它们的参数
回来的时候。 这在调用者中节省了一条指令,因为不需要
弹出那里的论点。
这种调用约定与 Unix 上通常使用的约定不兼容,因此您
如果您需要调用使用 Unix 编译器编译的库,则不能使用它。
此外,您必须为所有采用变量的函数提供函数原型
参数的数量(包括“printf”); 否则会生成不正确的代码
调用这些函数。
此外,如果调用一个函数太多,会导致严重错误的代码
论据。 (通常,额外的参数会被无害地忽略。)
68010、68020、68030、68040、68060和CPU32支持“rtd”指令
处理器,但不是 68000 或 5200。
-mno-rtd
不要使用由 -mrtd.. 这是默认设置。
-恶意-int
-mno-对齐-int
控制 GCC 是否对齐“int”、“long”、“long long”、“float”、“double”和“long”
double" 32 位边界上的变量 (-恶意-int) 或 16 位边界
(-mno-对齐-int)。 在 32 位边界上对齐变量会生成可运行的代码
在具有 32 位总线的处理器上速度稍快,但会占用更多内存。
警告: 如果您使用 -恶意-int 开关,GCC 对齐包含上述内容的结构
类型不同于大多数已发布的应用程序二进制接口规范
m68k。
-mpcrel
直接使用68000的pc-relative寻址方式,而不是使用全局
偏移表。 目前,这个选项意味着 -fpic, 最多允许 16 位偏移
用于 pc 相对寻址。 -fPIC 目前不支持 -mpcrel虽然
这可以支持 68020 和更高的处理器。
-mno-严格对齐
-严格对齐
不要(做)假设未对齐的内存引用由系统处理。
-msep-数据
生成允许数据段位于不同内存区域的代码
从文本段。 这允许在不需要的环境中就地执行
虚拟内存管理。 这个选项意味着 -fPIC.
-mno-sep-数据
生成假定数据段跟在文本段之后的代码。 这是
默认值。
-mid-共享库
通过库 ID 方法生成支持共享库的代码。 这允许
用于在没有虚拟内存的环境中就地执行和共享库
管理。 这个选项意味着 -fPIC.
-mno-id-共享库
生成不假定正在使用基于 ID 的共享库的代码。 这是
默认值。
-mshared-library-id=n
指定正在编译的基于 ID 的共享库的标识号。
指定值 0 会生成更紧凑的代码; 指定其他值 force
该数字分配给当前图书馆,但不再是空间-或时间-
比省略此选项更有效。
-mxgot
-mno-xgot
为 ColdFire 生成与位置无关的代码时,生成的代码在以下情况下有效
GOT 有超过 8192 个条目。 这段代码比代码更大更慢
没有这个选项生成。 在 M680x0 处理器上,不需要此选项; -fPIC
就够了。
GCC 通常使用单个指令从 GOT 加载值。 虽然这是
相对高效,只有在 GOT 小于 64k 时才有效。 任何事物
较大导致链接器报告错误,例如:
重新定位被截断以适合:R_68K_GOT16O foobar
如果发生这种情况,您应该使用以下命令重新编译代码 -mxgot. 然后它应该与
非常大的 GOT。 但是,生成的代码 -mxgot 效率较低,因为它
需要 4 条指令来获取全局符号的值。
请注意,某些链接器,包括较新版本的 GNU 链接器,可以创建
多个 GOT 并对 GOT 条目进行排序。 如果你有这样的链接器,你应该只需要
使用 -mxgot 编译访问超过 8192 个 GOT 的单个目标文件时
条目。 很少有人这样做。
除非 GCC 生成与位置无关的代码,否则这些选项无效。
微芯 附加选项
这些都是 -m 为摩托罗拉 M*Core 处理器定义的选项。
-mhardlit
-mno-强光
如果可以在两条或更少的指令中完成,则将常量内联到代码流中。
-mdiv
-mno-div
使用除法指令。 (默认启用)。
-mrelax-立即
-mno-放松-立即
在位操作中允许任意大小的立即数。
-mwide 位域
-mno 宽位域
始终将位字段视为“int”大小。
-m4byte 函数
-mno-4byte 函数
强制所有函数对齐到 4 字节边界。
-mcallgraph-数据
-mno-callgraph-数据
发出调用图信息。
-mslow-字节
-mno-慢字节
读取字节数量时优先使用字访问。
-小端
-mbig-endian
为小端目标生成代码。
-立方米
-立方米
为 210 处理器生成代码。
-mno-lsim
假设已经提供了运行时支持,因此省略模拟器库
(libsim.a) 从链接器命令行。
-mstack-增量=尺寸
设置单个堆栈增量操作的最大数量。 大值可以
提高包含需要大量函数的程序的速度
堆栈空间,但如果堆栈扩展,它们也会触发分段错误
太多了。 默认值为 0x1000。
环境保护部 附加选项
-mabs差异
启用“abs”指令,这是两个寄存器之间的绝对差异。
-商城选择
启用所有可选指令---求平均值、乘法、除法、位运算,
前导零、绝对差、最小值/最大值、剪辑和饱和度。
-平均
启用“ave”指令,该指令计算两个寄存器的平均值。
-m基础=n
大小变量 n 默认情况下,字节或更小的字节放置在“.based”部分中。
基变量使用$tp寄存器作为基址寄存器,有128字节的限制
到“.based”部分。
-mbitops
启用位操作指令---位测试(“btstm”)、设置(“bsetm”)、清除
("bclrm")、反转 ("bnotm") 和测试和设置 ("tas")。
-MC=姓名
选择放置哪个部分常量数据。 姓名 可能是“微小”、“接近”或
“远的”。
-mclip
启用“剪辑”指令。 请注意,“-mclip”没有用,除非您也
提供“-mminmax”。
-mconfig=姓名
选择一种内置核心配置。 每个 MeP 芯片都有一个或多个
其中的模块; 每个模块都有一个核心CPU和多种协处理器,可选
指令和外围设备。 “MeP-Integrator”工具,不是 GCC 的一部分,提供
这些配置通过这个选项; 使用此选项与使用 all 相同
相应的命令行选项。 默认配置为“默认”。
-mcop
启用协处理器指令。 默认情况下,这是一个 32 位协处理器。 笔记
协处理器通常通过“-mconfig=”选项启用。
-MCOP32
启用 32 位协处理器的指令。
-MCOP64
启用 64 位协处理器的指令。
-mivc2
启用 IVC2 调度。 IVC2 是一个 64 位 VLIW 协处理器。
-MDC
导致常量变量被放置在“.near”部分。
-mdiv
启用“div”和“divu”指令。
-meb
生成大端代码。
-梅尔
生成小端代码。
-mio-易失性
告诉编译器任何标有“io”属性的变量都将被
被认为是易变的。
-毫升 默认情况下将变量分配给“.far”部分。
-mleadz
启用“leadz”(前导零)指令。
-毫米 默认情况下将变量分配给“.near”部分。
-最小最大
启用“min”和“max”指令。
-mult
启用乘法和乘法累加指令。
-mno-选项
禁用“-mall-opts”启用的所有可选指令。
-重复
启用“repeat”和“erepeat”指令,用于低开销循环。
-多发性硬化症 导致所有变量默认为“.tiny”部分。 请注意,有一个
本节限制为 65536 字节。 访问这些变量使用 %gp 基数
注册。
-饱和
启用饱和指令。 请注意,编译器当前没有
自己生成这些,但包含此选项是为了与其他工具兼容,
像“作为”。
-msdram
链接基于 SDRAM 的运行时而不是默认的基于 ROM 的运行时。
-msim
链接模拟器运行时库。
-msimnovec
链接模拟器运行时库,不包括对重置和
异常向量和表。
-mtf
使所有函数默认为“.far”部分。 没有这个选项,函数
默认为“.near”部分。
-mtiny=n
变量是 n 字节或更小的字节分配给“.tiny”部分。 这些
变量使用 $gp 基址寄存器。 此选项的默认值为 4,但请注意
“.tiny”部分有 65536 字节的限制。
微风 附加选项
-msoft-浮动
对浮点使用软件仿真(默认)。
-mhard-浮动
使用硬件浮点指令。
-mmemcpy
不要优化块移动,使用“memcpy”。
-mno-clearbss
此选项已弃用。 用 -fno-零初始化-in-bss 代替。
-单片机=cpu类型
使用给定 CPU 的特性和调度代码。 支持的值在
格式 vX.YY.Z,其中 X 是一个主要版本, YY 是次要版本,并且 Z is
兼容性代码。 示例值为 v3.00.a, v4.00.b, v5.00.a, v5.00.b, v5.00.b,
v6.00.a.
-mxl-软-mul
使用软件乘法仿真(默认)。
-mxl-软div
使用软件模拟进行除法(默认)。
-mxl-桶移位
使用硬件桶形移位器。
-mxl 模式比较
使用模式比较指令。
-msmall-分界线
对小的有符号整数除法使用表查找优化。
-mxl-堆栈检查
此选项已弃用。 用 -fstack-检查 代替。
-mxl-gp-opt
使用 GP 相关的“.sdata”/“.sbss”部分。
-mxl-乘高
对 32x32 乘法的高部分使用乘法高指令。
-mxl-浮动转换
使用硬件浮点转换指令。
-mxl-浮点-sqrt
使用硬件浮点平方根指令。
-mbig-endian
为大端目标生成代码。
-小端
为小端目标生成代码。
-mxl-重新排序
使用重新排序指令(交换和字节反转加载/存储)。
-mxl-模式-应用模型
选择应用模型 应用模型. 有效的模型是
可执行
普通可执行文件(默认),使用启动代码 crt0.o.
存根
用于基于 Xilinx 微处理器调试器 (XMD) 的软件侵入式调试
代理称为 xmdstub。 这使用启动文件 crt1.o 并设置起始地址
程序为 0x800。
引导
对于使用引导加载程序加载的应用程序。 此模型使用启动文件
crt2.o 它不包含处理器复位向量处理程序。 这个适合
用于将处理器复位控制转移到引导加载程序,而不是
应用程序。
无向量
适用于不需要任何 MicroBlaze 载体的应用。 这个选项
可能对在监控应用程序中运行的应用程序很有用。 这个型号
使用 crt3.o 作为启动文件。
附加选项 -xl-模式-应用模型 是不推荐使用的别名 -mxl-模式-应用模型.
MIPS 附加选项
-EB 生成大端代码。
-这 生成小端代码。 这是默认设置 mips*el-*-* 配置。
-三月=拱
生成运行的代码 拱,可以是通用 MIPS ISA 的名称,也可以是
特定处理器的名称。 ISA 名称是: 米普1, 米普2, 米普3, 米普4,
米普32, 米普斯32r2, 米普64 和 米普斯64r2. 处理器名称是: 4kc, 4km, 4公里, 4ksc,
4kec, 4公里, 4保持, 4ksd, 5kc, 5kf, 20kc, 24kc, 24kf2_1, 24kf1_1, 24kec, 24kef2_1,
24kef1_1, 34kc, 34kf2_1, 34kf1_1, 34kn, 74kc, 74kf2_1, 74kf1_1, 74kf3_2, 1004kc,
1004kf2_1, 1004kf1_1, 龙芯2e, 龙芯2f, 龙芯3a, m4k, 八元, 八字+,
奥克特昂2, 猎户座, r2000, r3000, r3900, r4000, r4400, r4600, r4650, r4700, r6000, r8000,
rm7000, rm9000, r10000, r12000, r14000, r16000, sb1, sr71000, vr4100, vr4111, vr4120,
vr4130, vr4300, vr5000, vr5400, vr5500, xlr 和 连载. 特殊价值 来自阿比
为选定的 ABI 选择最兼容的架构(即, 米普1
32 位 ABI 和 米普3 对于 64 位 ABI)。
原生 Linux/GNU 工具链也支持值 本地人, 选择最好的
主机处理器的架构选项。 -march=本地 如果 GCC 没有影响
无法识别处理器。
在处理器名称中,最后一个 000 可以缩写为 k (例如, -三月=r2k).
前缀是可选的,并且 vr 可以写 r.
表格名称 nf2_1 指的是 FPU 时钟频率为
核心,形式的名称 nf1_1 指具有相同频率的 FPU 的处理器
作为核心,以及形式的名称 nf3_2 指具有按比例时钟的 FPU 的处理器
3:2 的核心。 出于兼容性原因, nf 被接受为
的同义词 nf2_1 而 nx 和 bfx 被接受为同义词 nf1_1.
GCC 根据这个选项的值定义了两个宏。 第一个是 _MIPS_ARCH,
以字符串形式给出目标架构的名称。 第二个有形式
_MIPS_ARCH_FOO,其中 FOO 是资本化价值 _MIPS_ARCH。 例如,
-三月=r2000 套 _MIPS_ARCH 至 “r2000” 并定义宏 _MIPS_ARCH_R2000.
请注意 _MIPS_ARCH 宏使用上面给出的处理器名称。 换句话说,
它有完整的前缀并且没有缩写 000 as k。 如果是 来自阿比是,
宏命名解析的架构(或者 “mips1” or “mips3”)。 它命名
没有时的默认架构 -行进 给出了选项。
-mtune=拱
优化 拱. 除其他外,此选项控制指令的方式
计划,以及算术运算的感知成本。 名单 拱 价值观
是一样的 -行进.
不使用该选项时,GCC 会针对指定的处理器进行优化 -行进。 通过
运用 -行进 和 -mtune 在一起,可以生成运行在
处理器家族,但针对该家族的一个特定成员优化代码。
-mtune 定义宏 _MIPS_TUNE 和 _MIPS_TUNE_FOO,其工作方式与
此 -行进 上面描述的那些。
-mips1
相当于 -行军=mips1.
-mips2
相当于 -行军=mips2.
-mips3
相当于 -行军=mips3.
-mips4
相当于 -行军=mips4.
-mips32
相当于 -行军=mips32.
-mips32r2
相当于 -行军=mips32r2.
-mips64
相当于 -行军=mips64.
-mips64r2
相当于 -行军=mips64r2.
-mips16
-mno-mips16
生成(不生成)MIPS16 代码。 如果 GCC 的目标是 MIPS32 或 MIPS64
架构,它使用 MIPS16e ASE。
MIPS16 代码生成也可以通过以下方式在每个功能的基础上进行控制
“mips16”和“nomips16”属性。
-mflip-mips16
在交替函数上生成 MIPS16 代码。 此选项是为回归提供的
混合 MIPS16/非 MIPS16 代码生成的测试,不适用于普通
用于编译用户代码。
-minterlink-mips16
-mno-interlink-mips16
要求(不要求)非 MIPS16 代码与 MIPS16 代码链接兼容。
比如非MIPS16代码不能直接跳转到MIPS16代码; 它必须要么使用
调用或间接跳转。 -minterlink-mips16 因此禁用直接跳转,除非
GCC 知道跳转的目标不是 MIPS16。
-mabi = 32
-马比=o64
-马比=n32
-mabi = 64
-mabi=eabi
为给定的 ABI 生成代码。
请注意,EABI 有 32 位和 64 位变体。 GCC 通常生成 64 位
选择 64 位架构时的代码,但您可以使用 -mgp32 获取 32 位代码
代替。
有关 O64 ABI 的信息,请参阅http://gcc.gnu.org/projects/mipso64-abi.html>.
GCC 支持 o32 ABI 的变体,其中浮点寄存器为 64,而不是
超过 32 位宽。 您可以选择此组合 -mabi = 32 -mfp64. 这个 ABI
依赖于“mthc1”和“mfhc1”指令,因此仅支持
MIPS32R2 处理器。
参数和返回值的寄存器分配保持不变,但每个
标量值在单个 64 位寄存器中传递,而不是一对 32 位寄存器
注册。 例如,标量浮点值在 $f0 只是,不是
$f0/$f1 一对。 调用保存的寄存器集也保持不变,但所有 64 位
被保存。
-mabicalls
-mno-abicalls.
生成(不生成)适用于 SVR4 样式动态对象的代码。
-mabicalls 是基于 SVR4 的系统的默认设置。
-mshared
-mno-共享
生成(不生成)完全与位置无关的代码,并且可以
因此被链接到共享库中。 此选项仅影响 -mabicalls.
All / 全部 -mabicalls 代码传统上与位置无关,与选项无关
喜欢 -fPIC 和 -fpic. 但是,作为扩展,GNU 工具链允许可执行文件
对本地绑定符号使用绝对访问。 它也可以使用较短的GP
初始化序列并生成对本地定义函数的直接调用。 这个
模式由 -mno-共享.
-mno-共享 依赖于 binutils 2.16 或更高版本并生成只能被
由 GNU 链接器链接。 但是,该选项不影响最终的 ABI
可执行; 它只影响可重定位对象的 ABI。 使用 -mno-共享
通常使可执行文件更小、更快。
-mshared 是默认值。
-mplt
-mno-plt
假设(不假设)静态和动态链接器支持 PLT 并复制
搬迁。 此选项仅影响 -mno-共享 -mabicalls. 对于 n64 ABI,这
选项没有效果没有 -msym32.
可以使 -mplt 默认情况下通过配置 GCC --with-mips-plt。 默认值
is -mno-plt 除此以外。
-mxgot
-mno-xgot
解除(不解除)对全局偏移表大小的通常限制。
GCC 通常使用单个指令从 GOT 加载值。 虽然这是
相对高效,只有在 GOT 小于 64k 时才有效。 任何事物
较大导致链接器报告错误,例如:
重新定位被截断以适合:R_MIPS_GOT16 foobar
如果发生这种情况,您应该使用以下命令重新编译代码 -mxgot. 这非常适用
大型 GOT,虽然代码效率也较低,因为它需要三个
获取全局符号值的指令。
请注意,某些链接器可以创建多个 GOT。 如果你有这样的链接器,你
应该只需要使用 -mxgot 当单个目标文件访问超过 64k 的
值得的 GOT 条目。 很少有人这样做。
除非 GCC 生成位置无关代码,否则这些选项无效。
-mgp32
假设通用寄存器是 32 位宽。
-mgp64
假设通用寄存器是 64 位宽。
-mfp32
假设浮点寄存器是 32 位宽。
-mfp64
假设浮点寄存器是 64 位宽。
-mhard-浮动
使用浮点协处理器指令。
-msoft-浮动
不要使用浮点协处理器指令。 实现浮点
使用库调用进行计算。
-mno-浮动
相当于 -msoft-浮动, 但另外断言正在编译的程序
不执行任何浮点运算。 目前支持此选项
仅通过一些裸机 MIPS 配置,它可能会选择一组特殊的
缺乏所有浮点支持的库(包括,例如,浮点
点“printf”格式)。 如果使用“-mno-float”编译的代码意外包含
浮点运算,很可能会遇到链接时或运行时故障。
-单浮点数
假设浮点协处理器只支持单精度运算。
-mdouble-浮点数
假设浮点协处理器支持双精度运算。 这个
是默认值。
-mlsc
-mno-llsc
使用(不使用) ll, sc及 同步 实现内置原子内存的指令
职能。 当两个选项都没有指定时,GCC 使用指令,如果目标
架构支持它们。
-mlsc 如果运行时环境可以模拟指令和 -mno-llsc
在编译非标准 ISA 时很有用。 您可以将任一选项设置为
默认通过配置 GCC --with-llsc 和 --没有-llsc 。
--with-llsc 是某些配置的默认值; 查看安装文档
了解详情。
-mdsp
-mno-dsp
使用(不要使用)MIPS DSP ASE 的第 1 版。
此选项定义预处理器宏 __mips_dsp. 它还定义了
__mips_dsp_rev 到1。
-MDSPR2
-mno-dspr2
使用(不要使用)MIPS DSP ASE 的第 2 版。
此选项定义预处理器宏 __mips_dsp 和 __mips_dspr2。 这也
定义 __mips_dsp_rev 到2。
-msmartmips
-mno-smartmips
使用(不要使用)MIPS SmartMIPS ASE。
- 单人
-mno-配对-单
使用(不要使用)成对单浮点指令。
此选项需要启用硬件浮点支持。
-mdmx
-mno-mdmx
使用(不要使用)MIPS 数字媒体扩展指令。 这个选项只能
生成 64 位代码时使用,需要硬件浮点支持
启用。
-mips3d
-mno-mips3d
使用(不使用)MIPS-3D ASE。 选项 -mips3d 暗示 - 单人.
-MMT
-mno-mt
使用(不要使用)MT 多线程指令。
-mmcu
-mno单片机
使用(不要使用)MIPS MCU ASE 指令。
-mlong64
强制“长”类型为 64 位宽。 看 -mlong32 对默认值的解释
以及确定指针大小的方式。
-mlong32
强制“long”、“int”和指针类型为 32 位宽。
“int”、“long”和指针的默认大小取决于 ABI。 一切
支持的 ABI 使用 32 位“int”。 n64 ABI 使用 64 位“长”,64 位也是如此
EABI; 其他人使用 32 位“长”。 指针与“long”的大小相同,或者
与整数寄存器的大小相同,以较小者为准。
-msym32
-mno-sym32
假设(不假设)所有符号都具有 32 位值,而不管所选的
ABI。 此选项与 -mabi = 64 和 -mno-abicalls. 因为它
允许 GCC 生成对符号地址的更短和更快的引用。
-G NUM
如果该数据不是,则将外部可见数据的定义放在一个小数据部分中
大于 NUM 字节。 然后 GCC 可以生成更有效的数据访问; 看
-mgpopt 了解详情。
默认值 -G 选项取决于配置。
-mlocal-sdata
-mno-本地-sdata
延长(不延长) -G 本地数据的行为,例如静态变量
在 C。 -mlocal-sdata 是所有配置的默认值。
如果链接器抱怨应用程序使用了太多小数据,您可能
想尝试重建性能不那么重要的部分 -mno-本地-sdata。 您
可能还想用 -mno-本地-sdata, 这样库
为主程序留出更多空间。
-mextern-sdata
-mno-外部-sdata
假设(不假设)外部定义的数据在一个小数据段中,如果
该数据的大小在 -G 限制。 -mextern-sdata 是所有人的默认设置
配置。
如果你编译一个模块 办法 - -mextern-sdata -G NUM -mgpopt及 办法 参考文献
变量 瓦尔 不大于 NUM 字节,你必须确保 瓦尔 被放置
在一个小数据部分。 如果 瓦尔 由另一个模块定义,您必须要么编译
那个模块够高 -G 设置或附加“部分”属性 瓦尔's
定义。 如果 瓦尔 很常见,您必须将应用程序链接到足够高的 -G
设置。
满足这些限制的最简单方法是编译和链接每个模块
具有相同的 -G 选项。 但是,您可能希望构建一个支持
几个不同的小数据限制。 您可以通过编译库来做到这一点
最高支持 -G 设置和另外使用 -mno-外部-sdata 停止
库对外部定义的数据进行假设。
-mgpopt
-mno-gpopt
对已知在小数据中的符号使用(不使用)GP 相对访问
部分; 看 -G, -mlocal-sdata 和 -mextern-sdata. -mgpopt 是所有人的默认设置
配置。
-mno-gpopt 对于 $gp 寄存器可能不保存值的情况很有用
“_gp”。 例如,如果代码是可能在引导程序中使用的库的一部分
监视器,调用引导监视器例程的程序在 $gp 中传递一个未知值。 (在
在这种情况下,引导监视器本身通常编译为 -G0.)
-mno-gpopt 暗示 -mno-本地-sdata 和 -mno-外部-sdata.
- 嵌入数据
-mno-嵌入式数据
如果可能,首先将变量分配到只读数据部分,然后在
如果可能,小数据部分,否则在数据中。 这给出了稍微慢一点的代码
比默认值,但减少了执行时所需的 RAM 量,因此可能
某些嵌入式系统的首选。
-muninit-const-in-rodata
-mno-uninit-const-in-rodata
将未初始化的“const”变量放在只读数据部分。 这个选项是
只有结合在一起才有意义 - 嵌入数据.
-mcode-可读=设置
指定 GCC 是否可以生成从可执行部分读取的代码。 有
三种可能的设置:
-mcode-可读=是
指令可以自由访问可执行部分。 这是默认设置。
-mcode-可读=pcrel
MIPS16 相对于 PC 的加载指令可以访问可执行部分,但其他
指令不得这样做。 此选项在 4KSc 和 4KSd 处理器上很有用
当代码 TLB 设置了读取禁止位时。 它对处理器也很有用
可以配置为具有双指令/数据 SRAM 接口,并且,
像 M4K 一样,自动将 PC 相关的负载重定向到指令 RAM。
-mcode-可读=否
指令不得访问可执行部分。 此选项可用于
配置为具有双指令/数据 SRAM 接口但
(与 M4K 不同)不会自动将 PC 相关负载重定向到
指令 RAM。
-msplit-地址
-mno-拆分地址
启用(禁用)“%hi()”和“%lo()”汇编器重定位运算符的使用。 这个
选项已被取代 -meexplicit-relocs 但保留为向后
兼容性。
-meexplicit-relocs
-mno-显式重新定位
在处理符号地址时使用(不要使用)汇编器重定位运算符。
备选方案,由 -mno-显式重新定位, 是使用汇编宏来代替。
-meexplicit-relocs 如果 GCC 被配置为使用一个汇编器
支持搬迁运营商。
-mcheck-零除法
-mno-check-零除法
在整数除以零时捕获(不捕获)。
默认是 -mcheck-零除法.
-mdivide-trap
-m分界线
MIPS 系统通过生成条件陷阱或
中断指令。 使用陷阱会产生更小的代码,但仅在 MIPS 上受支持
II 及以后。 此外,某些版本的 Linux 内核有一个错误,可以防止陷阱
从生成正确的信号(“SIGFPE”)。 用 -mdivide-trap 允许有条件的
支持它们的架构上的陷阱和 -m分界线 强制使用
休息。
默认通常是 -mdivide-trap,但这可以在配置时覆盖
运用 --with-divide=中断. 可以使用完全禁用除以零检查
-mno-check-零除法.
-mmemcpy
-mno-memcpy
强制(不强制)使用“memcpy()”进行非平凡的块移动。 默认的
is -mno-memcpy,它允许 GCC 内联大多数恒定大小的副本。
-mlong 通话
-mno-长通话
禁用(不要禁用)“jal”指令的使用。 使用“jal”调用函数
效率更高,但要求调用者和被调用者在相同的 256 兆字节中
分割。
此选项对 abicalls 代码没有影响。 默认是 -mno-长通话.
-疯了
-mno-疯狂
启用(禁用)使用“mad”、“madu”和“mul”指令,由
R4650 ISA。
-mfused-madd
-mno-融合-madd
启用(禁用)浮点乘法累加指令的使用,当它们
可用。 默认是 -mfused-madd.
在 R8000 CPU 上使用乘法累加指令时,中间
产品计算到无限精度,不受 FCSR Flush to
零位。 这在某些情况下可能是不可取的。 在其他处理器上
结果在数值上与使用单独乘法的等效计算相同,
加、减和否定指令。
-nocpp
告诉 MIPS 汇编器不要在用户汇编器文件上运行它的预处理器(带有
.s 后缀)组装时。
-mfix-24k
-mno-修复-24k
解决 24K E48(重新填充期间丢失的商店数据)勘误表。 解决方法
由汇编程序而不是 GCC 实现。
-mfix-R4000
-mno-修复-r4000
解决某些 R4000 CPU 勘误表:
- 如果执行双字或变量移位可能会产生不正确的结果
在开始整数除法之后立即。
- 如果同时执行,双字或变量移位可能会给出不正确的结果
正在进行整数乘法。
- 如果在一个延迟槽中开始,整数除法可能会给出不正确的结果
采取分支或跳跃。
-mfix-R4400
-mno-修复-r4400
解决某些 R4400 CPU 勘误表:
- 如果执行双字或变量移位可能会产生不正确的结果
在开始整数除法之后立即。
-mfix-R10000
-mno-修复-r10000
解决某些 R10000 勘误表:
- "ll"/"sc" 序列在 3.0 之前的修订版中可能不会以原子方式运行。 他们可能会
2.6 及更早版本的死锁。
仅当目标架构支持可能分支时才能使用此选项
指示。 -mfix-R10000 是默认值,当 -三月=r10000 用来; -mno-修复-r10000
否则为默认值。
-mfix-vr4120
-mno-修复-vr4120
解决某些 VR4120 勘误表:
- "dmultu" 并不总是产生正确的结果。
- 如果操作数之一,“div”和“ddiv”并不总是产生正确的结果
是负面的。
除法勘误的解决方法依赖于特殊功能 libgcc.a。 在
目前,这些功能仅由“mips64vr*-elf”配置提供。
其他 VR4120 勘误表需要在某些对之间插入 NOP
指示。 这些勘误由汇编程序处理,而不是由 GCC 本身处理。
-mfix-vr4130
解决 VR4130“mflo”/“mfhi”勘误表。 解决方法由
汇编器而不是 GCC,尽管 GCC 避免使用“mflo”和“mfhi”,如果
VR4130“macc”、“macchi”、“dmcc”和“dmacchi”指令可用。
-mfix-sb1
-mno-修复-sb1
解决某些 SB-1 CPU 内核勘误表。 (此标志目前适用于 SB-1
修订版 2“F1”和“F2”浮点勘误表。)
-mr10k-缓存屏障=设置
指定 GCC 是否应该插入缓存屏障以避免副作用
对 R10K 处理器的猜测。
与许多处理器一样,R10K 尝试预测条件
分支并推测性地执行来自“采取”分支的指令。 后来
如果预测结果错误,则中止这些指令。 然而,在 R10K 上,
即使中止的指令也会产生副作用。
此问题仅影响内核存储,并根据系统影响内核加载。
例如,推测执行的存储可能会将目标内存加载到缓存中
并将缓存行标记为脏,即使存储本身后来被中止。 如果一个 DMA
操作在刷新“脏”行之前写入相同的内存区域,
缓存数据会覆盖 DMA 数据。 有关完整的信息,请参阅 R10K 处理器手册
描述,包括其他潜在问题。
一种解决方法是在每次访问内存之前插入缓存屏障指令
可能会被推测执行,即使中止也可能产生副作用。
-mr10k-缓存屏障=设置 控制 GCC 对此变通方法的实施。 它
假设对以下区域中任何字节的中止访问没有边
效果:
1.当前函数的栈帧占用的内存;
2. 传入堆栈参数占用的内存;
3. 具有链接时间常数地址的对象所占用的内存。
内核有责任确保对这些区域的推测访问
确实是安全的。
如果输入程序包含一个函数声明,例如:
无效富(无效);
那么“foo”的实现必须允许“j foo”和“jal foo”被执行
推测地。 GCC 对它自己编译的函数遵守此限制。 它
期望非 GCC 函数(例如手写汇编代码)也能这样做。
该选项有三种形式:
-mr10k-cache-barrier=加载存储
在可能被推测执行的加载或存储之前插入缓存屏障
即使中止,这也可能产生副作用。
-mr10k-cache-barrier=存储
在可能被推测执行的存储之前插入缓存屏障
即使中止也可能有副作用。
-mr10k-缓存屏障=无
禁用缓存屏障的插入。 这是默认设置。
-mflush-函数=FUNC
-mno-flush-func
指定要调用的函数以刷新 I 和 D 缓存,或不调用任何此类
功能。 如果被调用,该函数必须采用与公共函数相同的参数
“_flush_func()”,即缓存所在内存范围的地址
刷新、内存范围的大小和数字 3(刷新两个缓存)。 这
默认取决于配置的目标 GCC,但通常是
_flush_func or __cpu_flush.
分店成本=NUM
将分支的成本设置为大致 NUM “简单”指令。 这个成本只是一个
启发式,不能保证在不同版本之间产生一致的结果。 一个零
成本冗余地选择默认值,这是基于 -mtune 设置。
-分支可能
-mno 分支可能
启用或禁用可能分支指令的使用,无论
选定的架构。 默认情况下,可能会生成分支可能指令,如果
它们受所选架构的支持。 MIPS32 和
MIPS64 架构和实现这些架构的处理器; 对于那些,
默认情况下不生成可能分支指令,因为 MIPS32 和
MIPS64 架构特别反对使用它们。
-mfp-异常
-mno-fp-异常
指定是否启用 FP 异常。 这会影响 FP 指令的方式
为某些处理器安排。 默认是启用 FP 例外。
例如,在 SB-1 上,如果禁用 FP 异常,并且我们发出 64 位
代码,那么我们可以同时使用两个 FP 管道。 否则,我们只能使用一个 FP 管道。
-mvr4130-对齐
-mno-vr4130-对齐
VR4130流水线是双向超标量,但只能发出两条指令
如果第一个是 8 字节对齐的,则放在一起。 启用此选项时,GCC 对齐
它认为应该并行执行的指令对。
此选项仅在针对 VR4130 进行优化时有效。 它通常使代码
更快,但代价是让它变得更大。 它在默认情况下启用
优化级别 -氧气.
-msynci
-mno同步
在支持它的架构上启用(禁用)生成“synci”指令。
“synci”指令(如果启用)在“__builtin___clear_cache()”时生成
被编译。
此选项默认为“-mno-synci”,但可以通过配置覆盖默认值
使用“--with-synci”。
在为单处理器系统编译代码时,使用“synci”通常是安全的。
但是,在许多多核 (SMP) 系统上,它不会使指令无效
缓存在所有内核上,并可能导致未定义的行为。
-mrelax-pic-电话
-mno-relax-pic 通话
尝试将通常通过寄存器 $25 分派的 PIC 调用转换为直接调用。
只有当链接器可以在链接时解析目标并且如果
目的地在直接呼叫的范围内。
-mrelax-pic-电话 如果 GCC 被配置为使用汇编器和一个
支持“.reloc”汇编指令和“-mexplicit-relocs”的链接器在
影响。 使用“-mno-explicit-relocs”,这个优化可以由
在没有编译器帮助的情况下单独使用汇编器和链接器。
-mmcount-ra-地址
-mno-mcount-ra-地址
发出(不发出)允许“_mcount”修改调用函数返回值的代码
地址。 启用后,此选项使用新的扩展了通常的“_mcount”接口
地址 参数,其类型为“intptr_t *”并在寄存器 $12 中传递。
“_mcount”然后可以通过执行以下两个操作来修改返回地址:
· 返回寄存器 $31 中的新地址。
· 将新地址存储在“*”中ra地址”如果 地址 是非空的。
默认是 -mno-mcount-ra-地址.
多媒体混音 附加选项
这些选项是为 MMIX 定义的:
-mlib函数
-mno-libfuncs
指定正在编译内部库函数,将所有值传入
寄存器,无论大小。
-mepsilon
-mno-ε
生成相对于“rE”进行比较的浮点比较指令
epsilon 寄存器。
-mabi=mmixware
-mabi = gnu.
生成传递函数参数和返回值的代码(在被调用的
函数)被视为寄存器 $0 及以上,而不是使用全局的 GNU ABI
注册 231 美元及以上。
-mzero-扩展
-mno-零扩展
从内存中读取小于 64 位的数据时,使用(不要使用)零-
默认情况下扩展加载指令,而不是符号扩展指令。
-mknuthdiv
-mno-knuthdiv
使产生余数的除法结果与除数具有相同的符号。
默认情况下, -mno-knuthdiv,余数的符号遵循
股利。 这两种方法在算术上都是有效的,后者几乎是唯一的
用过的。
-mtoplevel-符号
-mno-顶级符号
前置(不前置)a : 到所有全局符号,因此可以使用汇编代码
使用“PREFIX”汇编指令。
-梅尔夫
生成 ELF 格式的可执行文件,而不是默认格式 MMO 所使用的格式
此 混音 模拟器。
-mbranch-预测
-mno-分支-预测
在静态分支预测时使用(不使用)probable-branch 指令
表示可能的分支。
-mbase 地址
-mno-基地址
生成(不生成)使用的代码 基地 地址. 使用基地址
自动生成一个请求(由汇编器和链接器处理)
要在全局寄存器中设置的常量。 该寄存器用于一个或多个基数
地址请求范围为 0 到 255 从寄存器中保存的值。 这
通常会导致短而快速的代码,但不同数据项的数量
能解决的问题是有限的。 这意味着使用大量静态数据的程序
可能需要 -mno-基地址.
-单出口
-mno-单出口
强制(不强制)生成的代码在每个函数中有一个单一的退出点。
MN10300 附加选项
这些 -m 为松下 MN10300 架构定义的选项:
-多错误
生成代码以避免 MN10300 处理器的乘法指令中的错误。
这是默认设置。
-mno-multi-bug
不要生成代码以避免 MN10300 乘法指令中的错误
处理器。
-妈妈33
使用特定于 AM33 处理器的功能生成代码。
-mno-am33
不要使用特定于 AM33 处理器的功能生成代码。 这是
默认。
-mam33-2
使用特定于 AM33/2.0 处理器的功能生成代码。
-妈妈34
使用特定于 AM34 处理器的功能生成代码。
-mtune=cpu类型
在调度指令时使用指示的 CPU 类型的时序特性。
这不会更改目标处理器类型。 CPU 类型必须是以下之一
mn10300, am33, am33-2 or am34.
-m返回 d0 上的指针
生成返回指针的函数时,在“a0”和“aXNUMX”中都返回指针
“d0”。 否则,指针仅在“a0”中返回,并尝试调用此类
没有原型的函数会导致错误。 请注意,此选项由
默认; 用 -mno-返回指针-d0 禁用它。
-mno-crt0
不要在 C 运行时初始化对象文件中链接。
-放松
向链接器指示它应该执行松弛优化传递到
缩短分支、调用和绝对内存地址。 这个选项只有一个效果
在命令行上用于最后的链接步骤时。
此选项使符号调试变得不可能。
-mliw
允许编译器生成 长 操作说明 Word 如果目标是
AM33 或以后。 这是默认设置。 此选项定义预处理器宏
__LIW__.
-姆诺利夫
不允许编译器生成 长 操作说明 Word 指示。 这个选项
定义预处理器宏 __NO_LIW__.
-msetlb
允许编译器生成 SETLB 和 液晶显示 如果目标是
AM33 或以后。 这是默认设置。 此选项定义预处理器宏
__设置LB__.
-mnosetlb
不允许编译器生成 SETLB or 液晶显示 指示。 此选项定义
预处理器宏 __NO_SETLB__.
莫邪 附加选项
-meb
生成大端代码。 这是默认设置 莫西-*-* 配置。
-梅尔
生成小端代码。
-mno-crt0
不要在 C 运行时初始化对象文件中链接。
PDP-11 附加选项
这些选项是为 PDP-11 定义的:
-mfpu
使用硬件 FPP 浮点数。 这是默认设置。 (FIS 上的浮点数
不支持 PDP-11/40。)
-msoft-浮动
不要使用硬件浮点。
-mac0
在 ac0 中返回浮点结果(Unix 汇编语法中的 fr0)。
-mno-ac0
返回内存中的浮点结果。 这是默认设置。
-立方米
为 PDP-11/40 生成代码。
-立方米
为 PDP-11/45 生成代码。 这是默认设置。
-立方米
为 PDP-11/10 生成代码。
-mbcopy 内置
使用内联“movmemhi”模式复制内存。 这是默认设置。
-mbcopy
不要使用内联“movmemhi”模式来复制内存。
-mint16
-mno-int32
使用 16 位“int”。 这是默认设置。
-mint32
-mno-int16
使用 32 位“int”。
-mfloat64
-mno-float32
使用 64 位“浮动”。 这是默认设置。
-mfloat32
-mno-float64
使用 32 位“浮点数”。
-马布希
使用“abshi2”模式。 这是默认设置。
-mno-abshi
不要使用“abshi2”模式。
-mbranch-昂贵
假设分支很贵。 这是用于试验代码生成
只。
-mbranch-便宜
不要假装分支很贵。 这是默认设置。
-munix-asm
使用 Unix 汇编程序语法。 这是配置时的默认设置 pdp11-*-bsd.
-mdec-asm
使用 DEC 汇编程序语法。 这是为任何 PDP-11 目标配置时的默认设置
以外 pdp11-*-bsd.
微芯片 附加选项
这些 -m 为 picoChip 实现定义了选项:
-美=ae_类型
设置数组的指令集、寄存器集和指令调度参数
元素类型 ae_类型. 支持的值 ae_类型 旨在 任何, MUL及 苹果电脑.
-mae=任何 选择完全通用的 AE 类型。 使用此选项生成的代码运行
在任何其他 AE 类型上。 代码不如编译时效率高
对于特定的 AE 类型,某些类型的运算(例如乘法)不起作用
正确处理所有类型的 AE。
-mae=MUL 选择 MUL AE 类型。 这是编译代码最有用的AE类型,
并且是默认值。
-mae=MAC 选择 DSP 风格的 MAC AE。 使用此选项编译的代码可能会受到影响
字节(字符)操作性能不佳,因为 DSP AE 不提供
字节加载/存储的硬件支持。
-msymbol 作为地址
使编译器可以直接使用符号名称作为加载/存储中的地址
指令,而无需先将其加载到寄存器中。 通常,使用这个
选项生成更大的程序,运行速度比不使用选项时更快。
然而,结果因程序而异,所以它留给用户选择,
而不是永久启用。
-mno-低效警告
禁用有关生成低效代码的警告。 这些警告可以是
例如,在编译执行字节级内存操作的代码时生成
在 MAC AE 类型上。 MAC AE 没有对字节级内存的硬件支持
操作,因此所有字节加载/存储必须从字加载/存储合成
操作。 这是低效的,并且会生成警告以指示您
应该重写代码以避免字节操作,或针对具有
必要的硬件支持。 此选项禁用这些警告。
PowerPC的 附加选项
这些列在
RL78 附加选项
-msim
附加目标库中的链接以支持模拟器内的操作。
-mmul=无
-mmul=g13
-mmul=rl78
指定要使用的硬件乘法支持的类型。 默认是
“无”,它使用软件乘法功能。 “g13”选项用于
硬件乘法/除法外设仅在 RL78/G13 目标上。 “rl78”选项
用于 RL78 软件手册中定义的标准硬件乘法。
IBM RS/6000 和 PowerPC的 附加选项
这些 -m 为 IBM RS/6000 和 PowerPC 定义了选项:
-mpowerpc-gpopt
-mno-powerpc-gpopt
-mpowerpc-gfxopt
-mno-powerpc-gfxopt
-mpowerpc64
-mno-powerpc64
-mmfcrf
-mno-mfcrf
-mpopcntb
-mno-popcntb
-mpopcntd
-mno-popcntd
-制造商
-mno-fprnd
-mcmpb
-mno-cmpb
-mmfpgpr
-mno-mfpgpr
-mhard-dfp
-mno-硬-dfp
您可以使用这些选项来指定处理器上可用的指令
正在使用。 这些选项的默认值是在配置 GCC 时确定的。
指定 -单片机=处理器类型 覆盖这些选项的规范。 我们
建议您使用 -单片机=处理器类型 选项而不是上面列出的选项。
指定 -mpowerpc-gpopt 允许 GCC 使用可选的 PowerPC 架构
通用组中的指令,包括浮点平方根。
指定 -mpowerpc-gfxopt 允许 GCC 使用可选的 PowerPC 架构
图形组中的指令,包括浮点选择。
这款 -mmfcrf 选项允许 GCC 从条件寄存器字段生成移动
在 POWER4 处理器和其他支持
PowerPC V2.01 架构。 这 -mpopcntb 选项允许 GCC 生成 popcount
POWER5上实现的双精度FP倒数估计指令
处理器和其他支持 PowerPC V2.02 架构的处理器。 这
-mpopcntd 选项允许 GCC 生成在
POWER7 处理器和其他支持 PowerPC V2.06 架构的处理器。
这款 -制造商 选项允许 GCC 生成 FP 舍入到整数指令
在 POWER5+ 处理器和其他支持 PowerPC 的处理器上实现
V2.03架构。 这 -mcmpb 选项允许 GCC 生成比较字节
在 POWER6 处理器和其他支持
PowerPC V2.05 架构。 这 -mmfpgpr 选项允许 GCC 生成 FP 移动
到/来自 POWER6X 处理器上实现的通用寄存器指令和
其他支持扩展 PowerPC V2.05 架构的处理器。 这 -mhard-dfp
选项允许 GCC 生成十进制浮点指令
一些 POWER 处理器。
这款 -mpowerpc64 选项允许 GCC 生成额外的 64 位指令
可在完整的 PowerPC64 架构中找到,并将 GPR 视为 64 位双字
数量。 GCC 默认为 -mno-powerpc64.
-单片机=处理器类型
设置架构类型、寄存器使用和指令调度参数
机型 处理器类型. 支持的值 处理器类型 旨在 401, 403, 405, 405fp, 440,
440fp, 464, 464fp, 476, 476fp, 505, 601, 602, 603, 603e, 604, 604e, 620, 630, 740,
7400, 7450, 750, 801, 821, 823, 860, 970, 8540, a2, e300c2, e300c3, 电子500MC, e500mc64,
e5500, e6500, EC603E, G3, G4, G5, 泰坦, power3, power4, power5, 电源5+, power6,
功率6x, power7, power8, 功率计, 电源PC64, 电源pc64le及 rs64.
-mcpu=powerpc, -mcpu=powerpc64及 -mcpu=powerpc64le 指定纯 32 位 PowerPC
(任一端)、64 位大端 PowerPC 和 64 位小端 PowerPC
架构机器类型,假设有一个适当的通用处理器模型
调度目的。
其他选项指定特定的处理器。 在这些选项下生成的代码
在该处理器上运行最佳,在其他处理器上可能根本无法运行。
这款 -微处理器 options 自动启用或禁用以下选项:
-马尔代夫 -制造商 -mhard-浮动 -mmfcrf -m倍数 -mpopcntb -mpopcntd -mpowerpc64
-mpowerpc-gpopt -mpowerpc-gfxopt -单浮点数 -mdouble-浮点数 -msimple-fpu -m字符串
-mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mdirect-移动 -mpower8-融合
-mpower8-矢量 -mquad-内存 -mquad-内存-原子
为任何特定 CPU 设置的特定选项因编译器版本而异,
取决于似乎为该 CPU 生成最佳代码的设置; 它没有
必然反映实际硬件的能力。 如果您想设置一个
特定值的单个选项,您可以在 -微处理器 选项,
喜欢 -单片机=970 -mno-altivec.
在 AIX 上, -马尔代夫 和 -mpowerpc64 选项未被启用或禁用 -微处理器
选项,因为 AIX 不完全支持这些选项。 你可以
如果您确定它可以在您的
环境。
-mtune=处理器类型
设置机器类型的指令调度参数 处理器类型,但不要设置
架构类型或寄存器用法,如 -单片机=处理器类型 做。 相同的值
处理器类型 用于 -mtune 至于 -微处理器. 如果两者都指定,则生成的代码
使用架构和寄存器设置 -微处理器,但调度参数由
-mtune.
-mcmodel=小
为小模型生成 PowerPC64 代码:TOC 限制为 64k。
-mcmodel=中等
为中型模型生成PowerPC64代码:TOC等静态数据可能up
总共4G大小。
-mcmodel=大
为大模型生成PowerPC64代码:TOC最大可达4G。 其他
数据和代码仅受 64 位地址空间的限制。
-马尔代夫
-mno-altivec
生成使用(不使用)AltiVec 指令的代码,并启用使用
内置函数允许更直接地访问 AltiVec 指令集。
您可能还需要设置 -mabi=altivec 使用 AltiVec ABI 调整当前 ABI
增强功能。
什么时候 -马尔代夫 被使用,而不是 -maltivec=le or -maltivec=是, 元素顺序
对于 Altivec 内在函数,例如“vec_splat”、“vec_extract”和“vec_insert”将匹配
对应于目标字节序的数组元素顺序。 也就是说,元素
以大端为目标时,零标识向量寄存器中最左边的元素
平台,并在定位目标时识别向量寄存器中最右边的元素
小端平台。
-maltivec=是
使用 big-endian 元素顺序生成 Altivec 指令,无论是否
目标是大端或小端。 这是定位 big-endian 时的默认设置
平台。
元素顺序用于解释 Altivec 内在函数中的元素编号,例如
“vec_splat”、“vec_extract”和“vec_insert”。 默认情况下,这些将匹配数组
对应于目标字节序的元素顺序。
-maltivec=le
使用 little-endian 元素顺序生成 Altivec 指令,无论是否
目标是大端或小端。 这是针对一点点时的默认设置 -
端平台。 当前在定位 big-endian 时忽略此选项
平台。
元素顺序用于解释 Altivec 内在函数中的元素编号,例如
“vec_splat”、“vec_extract”和“vec_insert”。 默认情况下,这些将匹配数组
对应于目标字节序的元素顺序。
-mvsave
-mno-vrsave
生成 AltiVec 代码时生成 VRSAVE 指令。
-mgen-cell-微码
生成 Cell 微码指令。
-mwarn-cell-微码
发出 Cell 微码指令时发出警告。 Cell 微码示例
指令是可变移位。
-msecure-plt
生成允许的代码 ld 和 搜搜 构建可执行文件和共享库
不可执行的“.plt”和“.got”部分。 这是一个 PowerPC 32 位 SYSV ABI 选项。
-mbss-plt
生成使用 BSS“.plt”部分的代码 搜搜 填写,并需要“.plt”
和“.got”部分既可写又可执行。 这是一个 PowerPC 32 位
SYSV ABI 选项。
-米塞尔
-mno-isel
此开关启用或禁用 ISEL 指令的生成。
-错误=是/否
此开关已被弃用。 用 -米塞尔 和 -mno-isel 代替。
-MSPE
-mno-spe
此开关启用或禁用 SPE simd 指令的生成。
- 受损
-mno配对
此开关启用或禁用 PAIRED simd 指令的生成。
-mspe=是/否
此选项已被弃用。 用 -MSPE 和 -mno-spe 代替。
-mvsx
-mno-vsx
生成使用(不使用)向量/标量 (VSX) 指令的代码,以及
允许使用允许更直接访问 VSX 的内置函数
指令系统。
-mcrypto
-mno-加密
启用(禁用)允许直接访问的内置函数
PowerPC ISA 2.07 版中添加的加密指令。
-mdirect-移动
-mno-直接移动
生成使用(不使用)指令在
通用寄存器和添加的向量/标量 (VSX) 寄存器
PowerPC ISA 2.07 版。
-mpower8-融合
-mno-power8-融合
生成保持(不保持)某些整数运算相邻的代码,以便
指令可以在 power8 和更高版本的处理器上融合在一起。
-mpower8-矢量
-mno-power8-向量
生成使用(不使用)向量和标量指令的代码
在 PowerPC ISA 2.07 版中添加。 还可以使用内置函数
允许更直接地访问向量指令。
-mquad-内存
-mno-quad-内存
生成使用(不使用)非原子四字内存指令的代码。
这款 -mquad-内存 选项需要使用 64 位模式。
-mquad-内存-原子
-mno-四元内存原子
生成使用(不使用)原子四字内存指令的代码。 这
-mquad-内存-原子 选项需要使用 64 位模式。
-mfloat-gprs=是/单人/双人/否
-mfloat-gprs
此开关启用或禁用浮点运算的生成
支持它的架构的通用寄存器。
论据 含 or 单 允许使用单精度浮点数
操作。
论据 翻番 允许使用单精度和双精度浮点数
操作。
论据 没有 禁用通用寄存器上的浮点运算。
该选项目前仅在 MPC854x 上可用。
-立方米
-立方米
为 Darwin 和 SVR32 目标的 64 位或 4 位环境生成代码(包括
GNU/Linux)。 32 位环境将 int、long 和指针设置为 32 位和
生成在任何 PowerPC 变体上运行的代码。 64 位环境将 int 设置为
32 位和 long 和指向 64 位的指针,并为 PowerPC64 生成代码,如
-mpowerpc64.
-mfull目录
-mno-fp-目录中
-mno-目录总和
-minimal-toc
修改为每个目录创建的 TOC(目录)的生成
可执行文件。 这 -mfull目录 默认选择选项。 在这种情况下,海湾合作委员会
为每个唯一的非自动变量引用分配至少一个 TOC 条目
你的程序。 GCC 还在 TOC 中放置了浮点常量。 然而,只有
TOC 中有 16,384 个条目。
如果您收到链接器错误消息,指出您已溢出可用的
TOC 空间,您可以减少使用的 TOC 空间量 -mno-fp-目录中 和
-mno-目录总和 选项。 -mno-fp-目录中 防止 GCC 放置浮点数
TOC 中的常数和 -mno-目录总和 强制 GCC 生成代码来计算
运行时地址和常量的总和,而不是将该总和放入 TOC。
您可以指定其中一个或两个选项。 每个导致 GCC 产生非常
以节省 TOC 空间为代价,稍微慢一些和较大的代码。
如果即使指定了这两个选项,TOC 中的空间仍然不足,
指定 -minimal-toc 反而。 这个选项会导致 GCC 只做一个 TOC 条目
每个文件。 当您指定此选项时,GCC 会生成更慢、更大的代码
但它使用极少的 TOC 空间。 您可能希望仅在以下情况下使用此选项
包含较少执行代码的文件。
-maix64
-maix32
启用 64 位 AIX ABI 和调用约定:64 位指针、64 位“长”类型和
支持他们所需的基础设施。 指定 -maix64 暗示 -mpowerpc64,
而 -maix32 禁用 64 位 ABI 并暗示 -mno-powerpc64. GCC 默认为
-maix32.
-mxl-兼容
-mno-xl-兼容
在使用 AIX 时生成更符合 IBM XL 编译器语义的代码-
兼容的 ABI。 将浮点参数传递给原型函数之外的函数
除了参数 FPR 之外,还在堆栈上注册保存区 (RSA)。 不要假设
128 位长双精度值中的最重要双精度值在以下情况下正确舍入
比较值并转换为双精度值。 对长双精度使用 XL 符号名称
支持例程。
AIX 调用约定已扩展,但最初并未记录以处理
模糊的 K&R C 调用函数的情况,该函数采用其参数的地址
比声明的参数少。 IBM XL 编译器访问浮点参数
当子例程被编译时,不适合从堆栈中的 RSA
优化。 因为总是在堆栈上存储浮点参数是
低效且很少需要,默认情况下不启用此选项,只有
在调用由 IBM XL 编译器编译的子例程时需要,无需优化。
-mpe
客户支持 IBM RS/6000 SP 并行 环境 (PE)。 链接编写使用的应用程序
带有特殊启动代码的消息传递以使应用程序能够运行。 这
系统必须在标准位置安装 PE (/usr/lpp/ppe.poe/), 或者
眼镜 文件必须被覆盖 -规格= 选项来指定适当的
目录位置。 并行环境不支持线程,所以 -mpe
选项和 -p线程 选项不兼容。
-恶性自然
-恶性权力
在 AIX、32 位 Darwin 和 64 位 PowerPC GNU/Linux 上,选项 -恶性自然
覆盖 ABI 定义的较大类型的对齐方式,例如浮点双精度,
在它们基于自然大小的边界上。 选项 -恶性权力 指示 GCC
遵循 ABI 指定的对齐规则。 GCC 默认为标准对齐方式
在 ABI 中定义。
在 64 位 Darwin 上,自然对齐是默认设置,并且 -恶性权力 是不是
支持的。
-msoft-浮动
-mhard-浮动
生成不使用(使用)浮点寄存器集的代码。 软件
如果您使用 -msoft-浮动 选项,并通过
链接时选择 GCC。
-单浮点数
-mdouble-浮点数
为单精度或双精度浮点运算生成代码。
-mdouble-浮点数 暗示 -单浮点数.
-msimple-fpu
不要为硬件浮点单元生成“sqrt”和“div”指令。
-mfpu=姓名
指定浮点单元的类型。 有效值 姓名 旨在 sp_lite (相当于
-单浮点数 -msimple-fpu), dp_lite (相当于 -mdouble-浮点数 -msimple-fpu),
sp_full (相当于 -单浮点数), dp_full (相当于 -mdouble-浮点数).
-mxilinx-fpu
对 Xilinx PPC 405/440 上的浮点单元执行优化。
-m倍数
-mno-倍数
生成使用(不使用)加载多字指令和
存储多个字指令。 这些指令在默认情况下生成
POWER 系统,而不是在 PowerPC 系统上生成。 不使用 -m倍数 在小-
endian PowerPC 系统,因为这些指令在处理器处于
小端模式。 例外是 PPC740 和 PPC750,它们允许这些
小端模式下的指令。
-m字符串
-mno-字符串
生成使用(不使用)加载字符串指令和存储的代码
字符串字指令来保存多个寄存器并进行小块移动。 这些
指令在 POWER 系统上默认生成,而不是在 PowerPC 上生成
系统。 不使用 -m字符串 在小端 PowerPC 系统上,因为那些
当处理器处于小端模式时,指令不起作用。 例外情况
是 PPC740 和 PPC750,它们允许在 little-endian 模式下使用这些指令。
-m更新
-mno-更新
生成使用(不使用)加载或存储指令的代码
基址寄存器到计算出的内存位置的地址。 这些说明
是默认生成的。 如果你使用 -mno-更新, 之间有一个小窗口
更新堆栈指针和前一帧地址的时间
存储,这意味着跨中断或信号遍历堆栈帧的代码可能
获取损坏的数据。
-mavoid 索引地址
-mno-避免-索引地址
生成试图避免(不是避免)使用索引加载或存储的代码
指示。 这些指令可能会对 Power6 处理器造成性能损失
在某些情况下,例如跨过跨越 16M 的大型阵列时
边界。 此选项在针对 Power6 时默认启用并禁用
除此以外。
-mfused-madd
-mno-融合-madd
生成使用(不使用)浮点乘法和累加的代码
指示。 如果硬件浮点数默认生成这些指令
用来。 依赖机器 -mfused-madd 选项现在映射到机器 -
独立 -ffp-合同=快 选项,以及 -mno-融合-madd 映射到
-ffp-合同=关闭.
-mmulhw
-mno-mulhw
生成使用(不使用)半字乘法和乘法累加的代码
IBM 405、440、464 和 476 处理器上的说明。 这些说明是
以这些处理器为目标时默认生成。
-mdlmzb
-mno-dlmzb
生成使用(不使用)字符串搜索的代码 天涯海角 IBM 上的说明
405、440、464 和 476 处理器。 这条指令在默认情况下生成
针对这些处理器。
-mno 位对齐
-mbit对齐
在 System V.4 和嵌入式 PowerPC 系统上不(做)强制结构和联合
包含要与位字段的基本类型对齐的位字段。
例如,默认情况下,一个结构只包含 8 个“无符号”位域
长度 1 与 4 字节边界对齐,大小为 4 字节。 通过使用
-mno 位对齐,结构对齐到 1 字节边界,大小为 1 字节。
-mno-严格对齐
-严格对齐
在 System V.4 和嵌入式 PowerPC 系统上不(做)假定未对齐的内存
引用由系统处理。
-可重定位
-mno-可重定位
生成允许(不允许)将静态可执行文件重定位到
运行时的不同地址。 一个简单的嵌入式 PowerPC 系统加载程序应该
重新定位“.got2”的全部内容和“.fixup”中列出的4字节位置
部分,此选项生成的 32 位地址表。 为了这个工作,所有
链接在一起的对象必须用 -可重定位 or -mrelocate-lib.
-可重定位 代码将堆栈与 8 字节边界对齐。
-mrelocate-lib
-mno-可重定位-lib
喜欢 -可重定位, -mrelocate-lib 生成“.fixup”部分以允许静态
要在运行时重新定位的可执行文件,但是 -mrelocate-lib 不使用
较小的堆栈对齐 -可重定位. 编译的对象 -mrelocate-lib 五月
与使用任意组合编译的对象链接 -可重定位 选项。
-mno-toc
-mtoc
在 System V.4 和嵌入式 PowerPC 系统上不(做)假设寄存器 2 包含
指向全局区域的指针,指向程序中使用的地址。
-小
-小端
在 System V.4 和嵌入式 PowerPC 系统上,只需很少的时间即可为处理器编译代码
端模式。 这 -小端 选项与 -小.
-mbig
-mbig-endian
在 System V.4 和嵌入式 PowerPC 系统上为处理器编译代码
端模式。 这 -mbig-endian 选项与 -mbig.
-mdynamic-无图片
在 Darwin 和 Mac OS X 系统上,编译代码使其不可重定位,但
它的外部引用是可重定位的。 生成的代码适用于
应用程序,但不是共享库。
-ms单图片库
将用于 PIC 寻址的寄存器视为只读,而不是将其加载到
每个功能的序言。 运行时系统负责初始化这个
在执行开始之前注册一个适当的值。
-优先级限制-insns=优先
此选项控制分配给 dispatch-slot 受限的优先级
第二次调度过程中的指令。 论据 优先 取值
0, 1或 2 为
调度槽受限指令。
- 镜头 - 昂贵 - dep =依赖类型
此选项控制目标在执行期间将哪些依赖项视为代价高昂
指令调度。 论据 依赖类型 采取以下其中一项
值:
没有 没有依赖是昂贵的。
所有 所有的依赖都是昂贵的。
true_store_to_load
从存储到加载的真正依赖是昂贵的。
存储到加载
从存储到加载的任何依赖都是代价高昂的。
数
延迟大于或等于的任何相关性 数 是昂贵的。
-minsert-sched-nops=方案
此选项控制在第二次调度期间使用哪种 NOP 插入方案
经过。 论据 方案 采用以下值之一:
没有 不要插入 NOP。
垫 用 NOP 填充任何有空位发布槽的调度组,根据
调度程序的分组。
重新组合_精确
插入 NOP 以强制昂贵的依赖 insn 进入不同的组。 准确插入
根据估计,需要尽可能多的 NOP 来强迫一个 insn 到一个新的组
处理器分组。
数
插入 NOP 以强制昂贵的依赖 insn 进入不同的组。 插入 数
NOP 强制将 insn 加入新组。
-mcall-sysv
在 System V.4 和嵌入式 PowerPC 系统上,使用调用约定编译代码
遵守 1995 年 XNUMX 月的 System V 应用程序二进制接口 PowerPC 草案
处理器补充。 这是默认设置,除非您使用以下命令配置 GCC
powerpc-*-eabiaix.
-mcall-sysv-eabi
-mcall-eabi
指定两者 -mcall-sysv 和 -米比 选项。
-mcall-sysv-noeabi
指定两者 -mcall-sysv 和 -mno-eabi 选项。
-mcall-aixdesc
在 System V.4 和嵌入式 PowerPC 系统上为 AIX 操作系统编译代码。
-mcall-linux
在 System V.4 和嵌入式 PowerPC 系统上为基于 Linux 的 GNU 编译代码
系统。
-mcall-freebsd
在 System V.4 和嵌入式 PowerPC 系统上为 FreeBSD 操作编译代码
系统。
-mcall-netbsd
在 System V.4 和嵌入式 PowerPC 系统上为 NetBSD 操作编译代码
系统。
-mcall-openbsd
在 System V.4 和嵌入式 PowerPC 系统上为 OpenBSD 操作编译代码
系统。
-maix-结构返回
返回内存中的所有结构(由 AIX ABI 指定)。
-msvr4-结构返回
返回寄存器中小于 8 字节的结构(由 SVR4 ABI 指定)。
-马比=阿比型
使用特定扩展名扩展当前 ABI,或删除此类扩展名。 有效的
价值观是 阿尔蒂克, 无altivec, 具体, 没有说明, ibmlongdouble, 长双, 精灵v1,
精灵v2.
-mabi=spe
使用 SPE ABI 扩展扩展当前的 ABI。 这不会改变默认的 ABI,
相反,它将 SPE ABI 扩展添加到当前 ABI。
-mabi=无-spe
禁用当前 ABI 的 Book-E SPE ABI 扩展。
-mabi=ibmlongdouble
更改当前 ABI 以使用 IBM 扩展精度 long double。 这是一台 PowerPC
32 位 SYSV ABI 选项。
-mabi=ieeelongdouble
更改当前 ABI 以使用 IEEE 扩展精度 long double。 这是一台 PowerPC
32 位 Linux ABI 选项。
-mabi=elfv1
更改当前 ABI 以使用 ELFv1 ABI。 这是 big-endian 的默认 ABI
PowerPC 64 位 Linux。 覆盖默认 ABI 需要特殊的系统支持和
很可能会以惊人的方式失败。
-mabi=elfv2
更改当前 ABI 以使用 ELFv2 ABI。 这是 little-的默认 ABI
字节序 PowerPC 64 位 Linux。 覆盖默认 ABI 需要特殊系统
支持并且很可能会以惊人的方式失败。
-原型
-mno-原型
在 System V.4 和嵌入式 PowerPC 系统上,假设所有对变量参数的调用
函数被正确地原型化。 否则编译器必须插入一条指令
在每次非原型调用之前设置或清除条件代码寄存器的第 6 位
(CR) 指示是否在浮点数中传递浮点数
寄存器以防函数采用可变参数。 和 -原型, 只调用
原型变量参数函数设置或清除该位。
-msim
在嵌入式 PowerPC 系统上,假设启动模块被调用 sim-crt0.o 和
标准 C 库是 libsim.a 和 库文件. 这是默认设置
powerpc-*-eabisim 配置。
-mmvme
在嵌入式 PowerPC 系统上,假设启动模块被调用 crt0.o 和
标准 C 库是 libmvme.a 和 库文件.
-疯子
在嵌入式 PowerPC 系统上,假设启动模块被调用 crt0.o 和
标准 C 库是 库文件 和 库文件.
-米黄刀
在嵌入式 PowerPC 系统上,假设启动模块被调用 crt0.o 和
标准 C 库是 库卡 和 库文件.
-mvxworks
在 System V.4 和嵌入式 PowerPC 系统上,指定您正在编译
VxWorks 系统。
-成员
在嵌入式 PowerPC 系统上,设置 PPC_EMB ELF 标志标头中的位来指示
这 艾比 使用扩展重定位。
-米比
-mno-eabi
在 System V.4 和嵌入式 PowerPC 系统上(不)遵守 Embedded
应用程序二进制接口 (EABI),这是对系统的一组修改
V.4 规范。 选择 -米比 意味着堆栈对齐到 8 字节
边界,从“main”调用函数“__eabi”来设置EABI环境,
和 -msdata 选项可以同时使用“r2”和“r13”来指向两个独立的小数据
领域。 选择 -mno-eabi 表示堆栈对齐到 16 字节边界,没有
EABI 初始化函数是从“main”调用的,并且 -msdata 选项仅使用
“r13”指向单个小数据区。 这 -米比 选项在默认情况下打开,如果您
使用以下之一配置 GCC 电源PC*-*-eabi* 选项。
-msdata=eabi
在 System V.4 和嵌入式 PowerPC 系统上,将小的初始化“const”全局和
静态数据在 .sdata2 部分,由寄存器“r2”指向。 放小
初始化非“const”全局和静态数据 .sdata 部分,这是指出
通过寄存器“r13”。 将小的未初始化的全局和静态数据放入 .sbss
部分,与 .sdata 部分。 这 -msdata=eabi 选项是
不兼容 -可重定位 选项。 该 -msdata=eabi 选项还设置
-成员 选项。
-msdata=sysv
在 System V.4 和嵌入式 PowerPC 系统上,将小的全局和静态数据放入
.sdata 部分,由寄存器“r13”指向。 把小的未初始化的全局
和静态数据 .sbss 部分,与 .sdata 部分。 这
-msdata=sysv 选项不兼容 -可重定位 选项。
-msdata=默认
-msdata
在 System V.4 和嵌入式 PowerPC 系统上,如果 -米比 使用,编译代码相同
as -msdata=eabi, 否则编译代码同 -msdata=sysv.
-msdata=数据
在 System V.4 和嵌入式 PowerPC 系统上,将小的全局数据放入 .sdata
部分。 将小的未初始化的全局数据放入 .sbss 部分。 不使用
然而,注册“r13”来处理小数据。 这是默认行为,除非
other -msdata 选项被使用。
-msdata=无
-mno-sdata
在嵌入式 PowerPC 系统上,将所有初始化的全局和静态数据放在 。数据
部分,以及所有未初始化的数据 .bss 部分。
-mblock-移动-内联-限制=NUM
内联所有块移动(例如调用“memcpy”或结构副本)小于或
等于 NUM 字节。 最小值为 NUM 是 32 位目标上的 32 字节和 64
64 位目标上的字节数。 默认值是特定于目标的。
-G NUM
在嵌入式 PowerPC 系统上,放置小于或等于的全局和静态项 NUM
字节放入小数据或 BSS 部分,而不是普通数据或 BSS 部分。
默认情况下, NUM 是8。 -G NUM 开关也传递给链接器。 所有模块
应该用相同的方式编译 -G NUM 计算值。
-mregnames
-mno-regnames
在 System V.4 和嵌入式 PowerPC 系统上(不)在
使用符号形式的汇编语言输出。
-长途电话
-mno-longcall
默认情况下假设所有呼叫都在很远的地方,因此更长更昂贵的
需要调用序列。 这对于超过 32 兆字节的呼叫是必需的
(33,554,432 字节)从当前位置。 如果
编译器知道调用不能那么远。 此设置可以被覆盖
“shortcall”函数属性,或通过“#pragma” 长途电话(0)”。
一些链接器能够检测超出范围的调用并在
苍蝇。 在这些系统上,长时间调用是不必要的,并且会生成较慢的代码。 作为
在撰写本文时,AIX 链接器可以执行此操作,PowerPC/64 的 GNU 链接器也可以执行此操作。 它
也计划将此功能添加到 32 位 PowerPC 系统的 GNU 链接器中。
在 Darwin/PPC 系统上,“#pragma longcall”生成“jbsr callee, L42”,加上一个 科
岛 (胶水代码)。 两个目标地址分别代表被调用者和分支
岛。 Darwin/PPC 链接器更喜欢第一个地址并生成“bl callee”
如果 PPC "bl" 指令直接到达被调用者; 否则,链接器
生成“bl L42”来调用分支岛。 分支岛附加到
调用函数的主体; 它计算被调用者的完整 32 位地址和
跳到它。
在 Mach-O (Darwin) 系统上,此选项指示编译器向胶水发出
每次直接调用,达尔文链接器决定是使用还是丢弃它。
将来,当链接器已知时,GCC 可能会忽略所有 longcall 规范
生成胶水。
-mtls-标记
-mno-tls-标记
使用指定函数的重定位标记(不标记)对“__tls_get_addr”的调用
争论。 重定位允许链接器可靠地将函数调用与
TLS 优化的参数设置说明,这反过来又允许 GCC 更好地
安排顺序。
-p线程
添加对多线程的支持 线程 图书馆。 此选项设置标志
预处理器和链接器。
-mrecip
-mno-食谱
此选项允许使用倒数估计和倒数平方根估计
带有额外 Newton-Raphson 步骤的指令以提高精度而不是
对浮点参数进行除法或平方根和除法。 你应该使用
此 -ffast-数学 使用时的选项 -mrecip (或者至少 -funsafe-数学优化,
- 仅限数学, -倒数数学 和 -fno-捕获数学)。 请注意,虽然
序列的吞吐量一般高于非序列的吞吐量
倒数指令,序列精度最多可降低2 ulp
(即 1.0 的倒数等于 0.99999994)用于平方根的倒数。
-mrecip=选择
此选项控制可以使用哪些相互估计指令。 选择 是一个
逗号分隔的选项列表,前面可能有一个“!” 反转选项:
“all”:启用所有估算指令,“default”:启用默认指令,
相当于 -mrecip, "none": 禁用所有估计指令,相当于
-mno-食谱; "div": 为两个单项启用倒数逼近指令
和双精度; “divf”:启用单精度倒数近似
指示; “divd”:启用双精度倒数近似
指示; "rsqrt": 启用倒数平方根逼近指令
对于单精度和双精度; "rsqrtf": 启用单精度倒数
平方根逼近指令; “rsqrtd”:启用双精度
倒数平方根逼近指令;
因此,例如 -mrecip=全部,!rsqrtd 启用所有倒数估计
指令,“FRSQRTE”、“XSRSQRTEDP”和“XVRSQRTEDP”指令除外
它处理双精度倒数平方根计算。
-mrecip-精度
-mno-recip-精度
假设(不假设)相互估计说明提供更高的-
比 PowerPC ABI 要求的精确估计。 选择 -mcpu=电源6,
-mcpu=电源7 or -mcpu=电源8 自动选择 -mrecip-精度. 双-
默认情况下不生成精度平方根估计指令低
精密机器,因为它们不提供在三个之后收敛的估计
脚步。
-mveclibabi=类型
指定用于使用外部库矢量化内部函数的 ABI 类型。
目前唯一支持的类型是“mass”,它指定使用IBM的
用于向量化内在函数的数学加速子系统 (MASS) 库
外部库。 GCC 当前发出对“acosd2”、“acosf4”、“acoshd2”的调用,
"acoshf4", "asind2", "asinf4", "asinhd2", "asinhf4", "atan2d2", "atan2f4", "atand2",
"atanf4", "atanhd2", "atanhf4", "cbrtd2", "cbrtf4", "cosd2", "cosf4", "coshd2",
"coshf4", "erfcd2", "erfcf4", "erfd2", "erff4", "exp2d2", "exp2f4", "expd2", "expf4",
"expm1d2", "expm1f4", "hypotd2", "hypotf4", "lgammad2", "lgammaf4", "log10d2",
“log10f4”、“log1pd2”、“log1pf4”、“log2d2”、“log2f4”、“logd2”、“logf4”、“powd2”、
"powf4", "sind2", "sinf4", "sinhd2", "sinhf4", "sqrtd2", "sqrtf4", "tand2", "tanf4",
为 power2 生成代码时的“tanhd4”和“tanhf7”。 两个都 -ftree-矢量化 和
-funsafe-数学优化 还必须启用。 MASS 库必须是
在链接时指定。
-mfriz
-mno-弗里兹
生成(不生成)“friz”指令,当 -funsafe-数学优化
选项用于将浮点值的舍入优化为 64 位整数和
回到浮点。 “friz”指令不会返回相同的值,如果
浮点数太大而无法放入整数。
-指向嵌套函数的指针
-mno-指向嵌套函数的指针
生成(不生成)代码来加载静态链寄存器(r11) 什么时候
在 AIX 和 64 位 Linux 系统上通过指针调用,其中函数指针
指向一个 3 字的描述符,给出函数地址,要加载的 TOC 值
寄存器 r2, 和要加载到寄存器中的静态链值 r11。 该
-指向嵌套函数的指针 默认开启。 你不能通过指针调用
嵌套函数或指向使用其他语言编译的函数的指针
静态链,如果你使用 -mno-指向嵌套函数的指针.
-msave-toc-间接
-mno-save-toc-间接
生成(不生成)代码以在保留的堆栈位置保存TOC值
在函数序言中,如果函数通过 AIX 和 64 位上的指针调用
Linux系统。 如果 TOC 值没有保存在序言中,则在之前保存
通过指针调用。 这 -mno-save-toc-间接 选项是默认值。
-mcompat-align-parm
-mno-compat-align-parm
生成(不生成)代码以最大对齐方式传递结构参数
64 位,用于与旧版本的 GCC 兼容。
旧版本的 GCC(4.9.0 之前)错误地未对齐结构参数
在 128 位边界上,当该结构包含需要 128 位的成员时
结盟。 这在更新的 GCC 版本中得到纠正。 可以使用这个选项
生成与使用旧版本编译的函数兼容的代码
GCC。
在这个版本的编译器中, -mcompat-align-parm 是默认值,除非
使用 Linux ELFv2 ABI。
RX 附加选项
这些命令行选项是为 RX 目标定义的:
-m64bit-双打
-m32bit-双打
使“double”数据类型为 64 位(-m64bit-双打) 或 32 位 (-m32bit-双打)
在尺寸方面。 默认是 -m32bit-双打. 备注 RX 浮点硬件仅适用
在 32 位值上,这就是为什么默认值是 -m32bit-双打.
-fpu
-诺夫普
启用 (-fpu) 或禁用 (-诺夫普) 使用 RX 浮点硬件。 这
默认为启用 RX600 系列和禁用 RX200 系列。
浮点指令仅针对 32 位浮点值生成,
但是,因此 FPU 硬件不用于双打,如果 -m64bit-双打 选项是
用过的。
备注 如果 -fpu 然后启用选项 -funsafe-数学优化 也已启用
自动地。 这是因为 RX FPU 指令本身是不安全的。
-单片机=姓名
选择目标 RX CPU 的类型。 目前支持三种类型,
通用 RX600 和 RX200 系列硬件和具体 RX610 中央处理器。 默认是
RX600.
唯一的区别 RX600 和 RX610 就是 RX610 不支持
“MVTIPL”指令。
这款 RX200 系列没有硬件浮点单元等 -诺夫普 已启用
默认情况下,选择此类型时。
-mbig-endian-数据
-小端数据
以大端格式存储数据(但不是代码)。 默认是
-小端数据, 即以小端格式存储数据。
-msmall-数据限制=N
指定可以放置的全局变量和静态变量的最大字节数
进入小数据区。 使用小数据区可以导致更小更快
代码,但区域的大小是有限的,由程序员来确保
该区域不会溢出。 此外,当使用小数据区时,RX 之一
寄存器(通常是“r13”)被保留用于指向这个区域,所以它不是
可供编译器使用的时间更长。 这可能会导致更慢和/或更大
如果变量被压入堆栈而不是保存在该寄存器中。
注意,公共变量(未初始化的变量)和常量是
未放入小数据区,因为它们已分配给
输出可执行文件。
默认值为零,即禁用此功能。 注意,这个功能不是
默认情况下启用更高的优化级别(-氧气 等)因为
保留寄存器的潜在不利影响。 这取决于程序员
试验并发现此功能是否对他们的程序有益。 看
的描述 -mpid 用于描述实际注册如何的选项
保持小数据区指针被选中。
-msim
-mno-sim
使用模拟器运行时。 默认是使用 libgloss 板特定的运行时。
-mas100-语法
-mno-as100-语法
生成汇编器输出时,请使用与 Renesas 的 AS100 兼容的语法
汇编程序。 这种语法也可以由 GAS 汇编器处理,但它有一些
限制,因此默认情况下不会生成。
-mmax-常量大小=N
指定可用作操作数的常量的最大大小(以字节为单位)
一条 RX 指令。 尽管 RX 指令集确实允许最多 4
指令中使用的字节长度,较长的值等同于较长的
操作说明。 因此,在某些情况下,限制
指令中使用的常量。 太大的常量改为
放入常量池并通过寄存器间接引用。
价值 N 可以介于 0 和 4 之间。值 0(默认值)或 4 表示
允许使用任何大小的常量。
-放松
启用链接器松弛。 链接器松弛是链接器尝试
通过寻找各种指令的较短版本来减小程序的大小。
默认情况下禁用。
-薄荷注册=N
指定为快速中断处理函数保留的寄存器数量。 这
折扣值 N 可以在 0 到 4 之间。值为 1 表示寄存器“r13”被保留
专供快速中断处理程序使用。 值为 2 保留“r13”和
“r12”。 值为 3 保留“r13”、“r12”和“r11”,值为 4 保留“r13”
通过“r10”。 默认值为 0,不保留任何寄存器。
-msave-acc-in-中断
指定中断处理程序函数应保留累加器寄存器。
这仅在正常代码可能使用累加器寄存器时才需要,例如
因为它执行 64 位乘法。 默认是忽略累加器
因为这使中断处理程序更快。
-mpid
-mno-pid
启用位置无关数据的生成。 启用任何访问权限后
常量数据是通过从寄存器中保存的基地址的偏移量完成的。 这个
允许在运行时确定恒定数据的位置,而无需
要重定位的可执行文件,这对嵌入式应用程序有好处
内存限制。 可以修改的数据不受此选项的影响。
请注意,使用此功能保留一个寄存器,通常为“r13”,用于常量数据
基地址。 这会导致更慢和/或更大的代码,尤其是在复杂的
功能。
选择用来保存常量数据库地址的实际寄存器取决于
此 -msmall-数据限制 和/或所述 -薄荷注册 命令行选项已启用。
从寄存器“r13”开始向下进行,首先分配寄存器
以满足要求 -薄荷注册, 然后 -mpid 最后
-msmall-数据限制. 因此小数据区寄存器有可能是“r8”
如果两者 -薄荷注册=4 和 -mpid 在命令行中指定。
默认情况下,此功能未启用。 可以通过以下方式恢复默认值 -mno-pid
命令行选项。
-mno-警告-多个快速中断
-mwarn-多重快速中断
防止 GCC 在发现多个快速中断时发出警告消息
编译文件时的处理程序。 默认是对每个额外的发出警告
找到快速中断处理程序,因为 RX 只支持一个这样的中断。
请注意: 通用 GCC 命令行选项 -固定-章 对RX有特殊意义
与“中断”功能属性一起使用时的端口。 该属性表示一个
用于处理快速中断的函数。 GCC 确保它只使用寄存器
“r10”、“r11”、“r12”和/或“r13”,并且仅在正常使用
相应的寄存器已通过 -固定-章 or -薄荷注册
命令行选项。
S / 390 和 z系列 附加选项
这些都是 -m 为 S/390 和 zSeries 体系结构定义的选项。
-mhard-浮动
-msoft-浮动
使用(不使用)硬件浮点指令和寄存器用于浮点运算
点操作。 什么时候 -msoft-浮动 被指定,函数在 libgcc.a 习惯了
执行浮点运算。 什么时候 -mhard-浮动 被指定,编译器
生成 IEEE 浮点指令。 这是默认设置。
-mhard-dfp
-mno-硬-dfp
使用(不要使用)硬件十进制浮点指令用于十进制
浮点运算。 什么时候 -mno-硬-dfp 被指定,函数在 libgcc.a 旨在
用于执行十进制浮点运算。 什么时候 -mhard-dfp 被指定,
编译器生成十进制浮点硬件指令。 这是默认的
-行军=z9-ec 或更高。
-mlong-double-64
-mlong-double-128
这些开关控制“long double”类型的大小。 64 位的大小使
“long double”类型等同于“double”类型。 这是默认设置。
-mbackchain
-mno-后链
将调用者帧的地址作为后链指针存储(不存储)到
被调用者的堆栈帧。 可能需要一个后链来允许使用以下工具进行调试
不了解 DWARF 2 调用帧信息。 什么时候 -mno-打包堆栈 在
效果,backchain 指针存储在栈帧的底部; 什么时候
-mpacked堆栈 实际上,后链被放置在最上面的词中
96/160 字节寄存器保存区。
通常,代码编译为 -mbackchain 与使用编译的代码调用兼容
-mmo-后链; 然而,为了调试目的而使用后链通常需要
整个二进制文件是用 -mbackchain. 注意组合
-mbackchain, -mpacked堆栈 和 -mhard-浮动 不支持。 为了建立一个
linux内核使用 -msoft-浮动.
默认是不维护后链。
-mpacked堆栈
-mno-打包堆栈
使用(不要使用)打包的堆栈布局。 什么时候 -mno-打包堆栈 被指定,
编译器仅将 96/160 字节寄存器保存区的所有字段用于它们的
默认目的; 未使用的字段仍然占用堆栈空间。 什么时候 -mpacked堆栈 is
指定,寄存器保存槽在寄存器保存的顶部密集
区域; 未使用的空间被重新用于其他目的,从而更有效地利用
可用的堆栈空间。 然而,当 -mbackchain 也有效,最顶层
保存区字总是用来存放backchain,返回地址
register 总是保存在 backchain 下面的两个字。
只要不使用堆栈帧backchain,生成的代码 -mpacked堆栈
与生成的代码调用兼容 -mno-打包堆栈. 请注意,一些非 FSF
用于 S/2.95 或 zSeries 生成的使用堆栈帧的代码的 GCC 390 版本
运行时回链,而不仅仅是为了调试目的。 这样的代码不是调用-
与编译的代码兼容 -mpacked堆栈. 另外,请注意组合
-mbackchain, -mpacked堆栈 和 -mhard-浮动 不支持。 为了建立一个
linux内核使用 -msoft-浮动.
默认是不使用打包堆栈布局。
-msmall-执行
-mno-小执行
使用“bras”指令生成(或不生成)代码来做子程序
调用。 只有当总可执行文件大小不超过 64k 时,这才能可靠地工作。
默认是使用“basr”指令代替,它没有这个
局限性。
-立方米
-立方米
什么时候 -立方米 指定,为 S/390 ABI 生成符合 GNU/Linux 的代码。 什么时候
-立方米 指定,为 zSeries ABI 生成符合 GNU/Linux 的代码。 这个
特别是允许 GCC 生成 64 位指令。 为了 s390 目标,
默认是 -立方米,而 s390x 目标默认为 -立方米.
-mzarch
-台面
什么时候 -mzarch 指定,使用上可用的指令生成代码
z/架构。 什么时候 -台面 指定,使用指令生成代码
在 ESA/390 上可用。 注意 -台面 是不可能的 -立方米. 生成时
代码符合 GNU/Linux for S/390 ABI,默认为 -台面. 生成时
代码符合 GNU/Linux for zSeries ABI,默认为 -mzarch.
-mmvcle
-mno-mvcle
使用“mvcle”指令生成(或不生成)代码来执行块
移动。 什么时候 -mno-mvcle 指定,请改用“mvc”循环。 这是默认的
除非优化大小。
-调试
-mno-调试
编译时打印(或不打印)附加调试信息。 默认是
不打印调试信息。
-三月=cpu类型
生成运行的代码 cpu类型,这是代表一个系统的名称
某种处理器类型。 可能的值 cpu类型 旨在 g5, g6, z900, z990, z9-109,
z9-ec, z10, z196及 zEC12. 使用上可用的说明生成代码时
z/Architecture,默认为 -三月=z900. 否则,默认为 -三月=g5.
-mtune=cpu类型
调到 cpu类型 所有适用于生成的代码,除了 ABI
以及可用的指令集。 名单 cpu类型 值与 for 相同
-行进. 默认值是用于 -行进.
-mtpf-跟踪
-mno-tpf-跟踪
生成在 TPF OS 特定分支中添加(不添加)以跟踪例程的代码
在操作系统中。 这个选项默认是关闭的,即使在编译时也是如此
TPF 操作系统。
-mfused-madd
-mno-融合-madd
生成使用(不使用)浮点乘法和累加的代码
指示。 如果硬件浮点数默认生成这些指令
用来。
-mwarn-帧大小=帧大小
如果当前函数超过给定的帧大小,则发出警告。 因为这是
编译时检查它不需要在程序运行时成为真正的问题。 它
旨在识别最有可能导致堆栈溢出的函数。 这是
适用于堆栈大小有限的环境,例如 linux 内核。
-mwarn-dynamicstack
如果函数调用“alloca”或使用动态大小的数组,则发出警告。 这个
在堆栈大小有限的情况下,这通常是一个坏主意。
-mstack-守卫=堆栈保护
-mstack 大小=堆栈大小
如果提供了这些选项,S/390 后端会在
如果堆栈大小为,则触发陷阱的函数序言 堆栈保护 字节以上
堆栈大小 (请记住,S/390 上的堆栈向下增长)。 如果 堆栈保护
选项被省略 大于编译帧大小的 2 的最小幂
功能被选中。 这些选项旨在帮助调试堆栈
溢出问题。 额外发出的代码只会导致很少的开销和
因此也可以在没有更高性能的情况下用于类似生产的系统
降解。 给定的值必须是 2 的精确幂,并且 堆栈大小 必须
比...更棒 堆栈保护 不超过 64k。 为了提高效率,额外的
代码假设堆栈从与值对齐的地址开始
由 堆栈大小。 该 堆栈保护 选项只能与
堆栈大小.
-mhotpatch=前半字,后半字
如果启用了热补丁选项,则会生成一个“热补丁”功能序言
编译单元中的所有函数。 函数标签前面加上了给定的
两字节 NOP 指令的数量(前半字, 最大 1000000)。 之后
标签,2 * 后半字 附加字节,使用最大的 NOP 之类的指令
架构允许(最多 1000000)。
如果两个参数都为零,则禁用热修补。
对于具有“hotpatch”属性的单个函数,可以覆盖此选项。
总分 附加选项
这些选项是为 Score 实现定义的:
-meb
为大端模式编译代码。 这是默认设置。
-梅尔
为小端模式编译代码。
-mnhwloop
禁用“bcnz”指令的生成。
-muls
启用未对齐的加载和存储指令的生成。
-mmac
启用乘法累加指令的使用。 默认禁用。
-mscore5
指定 SCORE5 作为目标架构。
-mscore5u
指定目标架构的 SCORE5U。
-mscore7
指定 SCORE7 作为目标架构。 这是默认设置。
-mscore7d
指定 SCORE7D 作为目标架构。
SH 附加选项
这些 -m 为 SH 实现定义了选项:
-立方米 为 SH1 生成代码。
-立方米 为 SH2 生成代码。
-m2e
为 SH2e 生成代码。
-m2a-nofpu
为没有 FPU 的 SH2a 或 SH2a-FPU 以这样的方式生成代码
不使用浮点单元。
-m2a-单只
为 SH2a-FPU 生成代码,这样就没有双精度浮点
操作被使用。
-m2a-单
假设浮点单元为单精度,为 SH2a-FPU 生成代码
默认模式。
-m2a
假设浮点单元为双精度,为 SH2a-FPU 生成代码
默认模式。
-立方米 为 SH3 生成代码。
-m3e
为 SH3e 生成代码。
-m4-nofpu
为没有浮点单元的 SH4 生成代码。
-m4-单人
使用仅支持单通道的浮点单元为 SH4 生成代码
精密算术。
-m4-单
假设浮点单元处于单精度模式,为 SH4 生成代码
默认情况下。
-立方米 为 SH4 生成代码。
-m4-100
为 SH4-100 生成代码。
-m4-100-nofpu
以不使用浮点单元的方式为 SH4-100 生成代码。
-m4-100-单
假设浮点单元处于单精度模式,为 SH4-100 生成代码
默认情况下。
-m4-100-单只
以没有双精度浮点的方式为 SH4-100 生成代码
操作被使用。
-m4-200
为 SH4-200 生成代码。
-m4-200-nofpu
生成 SH4-200 的代码,而无需浮点单元
用过的。
-m4-200-单
假设浮点单元处于单精度模式,为 SH4-200 生成代码
默认情况下。
-m4-200-单只
以没有双精度浮点的方式为 SH4-200 生成代码
操作被使用。
-m4-300
为 SH4-300 生成代码。
-m4-300-nofpu
生成 SH4-300 的代码,而无需浮点单元
用过的。
-m4-300-单
以没有双精度浮点的方式为 SH4-300 生成代码
操作被使用。
-m4-300-单只
以没有双精度浮点的方式为 SH4-300 生成代码
操作被使用。
-m4-340
为 SH4-340 生成代码(无 MMU,无 FPU)。
-m4-500
为 SH4-500(无 FPU)生成代码。 通行证 -isa=sh4-nofpu 到汇编程序。
-m4a-nofpu
为 SH4al-dsp 或 SH4a 生成代码,使浮点数
不使用单位。
-m4a-单只
为 SH4a 生成代码,这样就没有双精度浮点
操作被使用。
-m4a-单
假设浮点单元是单精度的,为 SH4a 生成代码
默认模式。
-m4a
为 SH4a 生成代码。
-m4al
与...一样 -m4a-nofpu, 除了它隐式通过 -DSP 到汇编程序。 海湾合作委员会
目前不生成任何 DSP 指令。
-m5-32媒体
为 SHmedia 生成 32 位代码。
-m5-32media-nofpu
为 SHmedia 生成 32 位代码,使得浮点单元不是
用过的。
-m5-64媒体
为 SHmedia 生成 64 位代码。
-m5-64media-nofpu
为 SHmedia 生成 64 位代码,使得浮点单元不是
用过的。
-m5-紧凑型
为 SHcompact 生成代码。
-m5-compact-nofpu
以不使用浮点单元的方式为 SHcompact 生成代码。
-mb 以大端模式为处理器编译代码。
-毫升 以小端模式为处理器编译代码。
-mdalign
在 64 位边界对齐双精度。 请注意,这会更改调用约定,
因此,除非您重新编译,否则标准 C 库中的某些函数不起作用
它首先与 -mdalign.
-放松
如果可能,在链接时缩短一些地址引用; 使用链接器选项
-放松.
-mbigtable
在“开关”表中使用 32 位偏移。 默认是使用 16 位偏移。
-mbitops
在 SH2A 上启用位操作指令的使用。
-mfmovd
启用指令“fmovd”的使用。 查看 -mdalign 用于对齐约束。
-姆雷萨斯
遵守瑞萨电子定义的调用约定。
-mno-瑞萨
在 Renesas 约定之前遵守为 GCC 定义的调用约定
可用。 此选项是 SH 工具链的所有目标的默认选项。
-mnomacsave
将“MAC”寄存器标记为 call-clobbered,即使 -姆雷萨斯 给出。
-miee
-mno-IEEE
控制浮点比较的 IEEE 合规性,这会影响处理
比较结果无序的情况。 默认情况下 -miee is
隐式启用。 如果 -finite-math-only 已启用 -mno-IEEE 被隐式设置,
这会导致更快的浮点数较大相等和较小相等的比较。 这
可以通过指定任何一个来覆盖隐式设置 -miee or -mno-IEEE.
-minline-ic_invalidate
设置嵌套函数后使指令缓存条目无效的内联代码
蹦床。 此选项在以下情况下无效 -用户模式 已生效且所选
代码生成选项(例如 -立方米) 不允许使用“icbi”指令。
如果选择的代码生成选项不允许使用“icbi”
指令,和 -用户模式 无效,内联代码操作
指令缓存地址数组直接与关联写入。 这不仅
在运行时需要特权模式,但如果缓存行已被
通过 TLB 映射并已成为未映射。
-大小
转储汇编代码中的指令大小和位置。
-mpadstruct
此选项已弃用。 它将结构填充到 4 字节的倍数,即
与 SH ABI 不兼容。
-原子模型=模型
将原子操作模型和附加参数设置为逗号分隔
列表。 有关原子内置函数的详细信息,请参阅 __原子 内置函数。 该
支持以下型号和参数:
没有
禁用编译器生成的原子序列并发出原子的库调用
操作。 如果目标不是“sh*-*-linux*”,这是默认设置。
软草
为原子内置生成 GNU/Linux 兼容的 gUSA 软件原子序列
在函数中。 生成的原子序列需要额外的支持
系统的中断/异常处理代码,仅适用于 SH3* 和
SH4* 单核系统。 当目标为
"sh*-*-linux*" 和 SH3* 或 SH4*。 当目标为 SH4A 时,此选项也将
部分利用硬件原子指令“movli.l”和“movco.l”来
创建更高效的代码,除非 严格 已指定。
软tcb
生成在线程控制中使用变量的软件原子序列
堵塞。 这是 gUSA 序列的变体,也可用于 SH1*
和 SH2* 目标。 生成的原子序列需要额外的支持
系统的中断/异常处理代码,仅适用于
单核系统。 使用该模型时, gbr-偏移= 参数必须是
也指定。
软imask
通过设置生成临时禁用中断的软件原子序列
“SR.IMASK = 1111”。 此模型仅在程序以特权模式运行时有效
并且只适用于单核系统。 额外的支持
不需要系统的中断/异常处理代码。 这个模型是
当目标是 "sh*-*-linux*" 和 SH1* 或 SH2* 时默认启用。
硬性
使用“movli.l”和“movco.l”指令生成硬件原子序列
只要。 这仅在 SH4A 上可用,适用于多核系统。
由于硬件指令仅支持 32 位原子变量访问 8
或 16 位变量用 32 位访问模拟。 用这个编译的代码
选项也将与其他软件原子模型兼容
中断/异常处理系统,如果在 SH4A 系统上执行。 额外的
不需要系统中断/异常处理代码的支持
对于此模型。
gbr-偏移=
此参数指定线程控制中变量的偏移量(以字节为单位)
生成的原子序列应该使用的块结构
软tcb 型号已选定。 对于其他型号,此参数将被忽略。
指定的值必须是 0 的整数倍,范围为 1020-XNUMX。
严格
此参数可防止多个原子模型的混合使用,即使它们
将是兼容的,并使编译器生成原子序列
仅指定型号。
-mtas
为“__atomic_test_and_set”生成“tas.b”操作码。 请注意,根据
特定的硬件和软件配置,这会降低整体性能
由于“tas.b”指令隐含的操作数缓存线刷新。 在
多核 SH4A 处理器“tas.b”指令必须谨慎使用,因为它
可能会导致某些缓存配置的数据损坏。
-mprefergot
生成与位置无关的代码时,使用全局偏移量发出函数调用
表而不是过程链接表。
-用户模式
-mno-用户模式
不允许(允许)编译器生成特权模式代码。 指定
-用户模式 也暗示 -mno-内联-ic_invalidate 如果内联代码不起作用
在用户模式下。 -用户模式 是目标为“sh*-*-linux*”时的默认值。 如果
目标是 SH1* 或 SH2* -用户模式 没有效果,因为没有用户模式。
-多成本=数
设置乘法 insn 的成本。
-mdiv=策略
设置用于整数除法运算的除法策略。 上海传媒
策略 可以是以下之一:
fp 执行浮点运算。 这具有非常高的延迟,但需要
只有几条指令,所以如果你的代码足够多,这可能是一个不错的选择
易于利用的 ILP 以允许编译器调度浮点
说明与其他说明一起。 除以零导致
浮点异常。
INV 使用整数运算来计算除数的倒数,然后
将红利乘以倒数。 该策略允许 CSE 和提升
的逆计算。 除以零计算未指定的结果,
但不陷阱。
输入:minlat
的变体 INV 如果没有发现 CSE 或提升机会,或者如果
整个操作都被吊到了同一个地方,最后的阶段
逆计算与最终乘法交织在一起,以减少整体
延迟,以使用更多指令为代价,从而提供更少的指令
使用其他代码安排机会。
呼叫
调用通常实现 输入:minlat 战略。 这个
为“m5-*media-nofpu”编译提供高代码密度。
call2
使用同一个库函数的不同入口点,它假定一个
指向查找表的指针已经建立,这暴露了指针负载
到 CSE 和代码提升优化。
调用:调用
调用:调用 2
输入:fp
使用 INV 初始代码生成算法,但如果代码保持不变
未优化,恢复到 呼叫, call2或 fp 策略,分别。 注意
除以零的潜在陷阱副作用由单独的
指令,所以有可能所有整数指令都被提升了,
但副作用的标记留在原处。 重组到
在这种情况下,不可能进行浮点运算或调用。
因v20u
病毒20l
的变体 输入:minlat 战略。 在逆计算的情况下
不与乘法分开,它们在红利适合的地方加速除法
通过插入一个测试来跳过一些
在这种情况下的操作; 这个测试减慢了较大红利的情况。
因v20u 假设不太可能出现如此小的股息,并且 病毒20l
认为很有可能。
对于 SHmedia 以外的目标 策略 可以是以下之一:
呼叫div1
调用使用单步除法指令“div1”的库函数
执行操作。 除以零计算未指定的结果并执行
不是陷阱。 这是默认设置,除了 SH4、SH2A 和 SHcompact。
呼叫 fp
调用以双精度浮点方式执行操作的库函数
观点。 除以零会导致浮点异常。 这是默认的
用于带 FPU 的 SHcompact。 为没有双精度的目标指定此项
精度 FPU 将默认为“call-div1”。
调用表
调用库函数,该函数使用查找表查找小除数和
“div1”指令对较大的除数区分大小写。 被零除
计算一个未指定的结果并且不捕获。 这是 SH4 的默认设置。
为没有动态移位指令的目标指定此项将
默认为“call-div1”。
当未指定除法策略时,将选择默认策略
基于当前目标。 对于 SH2A,默认策略是使用“divs”和
“divu”指令而不是库函数调用。
-maccumulate-传出参数
为函数序言中的传出参数保留一次空间,而不是周围
每次通话。 通常有利于性能和尺寸。 也需要解压
以避免更改条件代码周围的堆栈帧。
-mdivsi3_libfunc=姓名
将用于 32 位有符号除法的库函数名称设置为 姓名。 这
只影响在 呼叫 和 调用:调用 分工策略,以及
编译器仍然期望相同的输入/输出/破坏寄存器集,就好像这
选项不存在。
-mfixed-范围=寄存器范围
生成将给定寄存器范围视为固定寄存器的代码。 固定寄存器
是寄存器分配器不能使用的。 这在编译内核时很有用
代码。 寄存器范围指定为由破折号分隔的两个寄存器。 多种的
可以用逗号分隔指定寄存器范围。
-mindexed 寻址
为 SHmedia32/SHcompact 启用索引寻址模式。 这只是
如果硬件和/或操作系统为索引实现 32 位环绕语义,则安全
寻址模式。 该架构允许使用 64 位处理器实现
MMU,操作系统可以使用它来获得 32 位寻址,但由于当前没有硬件
实现支持这种或任何其他方式使索引寻址模式安全
要在 32 位 ABI 中使用,默认值为 -mno-索引寻址.
-mgettr成本=数
将“gettr”指令假定的成本设置为 数. 默认为 2 如果
-mpt-固定 有效,否则为 100。
-mpt-固定
假设“pt*”指令不会被捕获。 这通常会生成更好的调度代码,
但在当前硬件上是不安全的。 当前的架构定义说
当目标与 3 为 3 时,“ptabs”和“ptrel”陷阱。这有
使在执行之前安排这些说明变得不安全的无意影响
分支,或将它们从循环中提升出来。 例如,“__do_global_ctors”,一部分
库 在程序启动时运行构造函数,调用列表中的函数
由 -1 分隔。 随着 -mpt-固定 选项,“ptabs”在测试之前完成
反对-1。 这意味着所有的构造函数都运行得更快一点,但是当
循环到列表的末尾,程序崩溃,因为“ptabs”将 -1 加载到
目标寄存器。
由于此选项对于实现当前架构的任何硬件都是不安全的
规格,默认为 -mno-pt-固定. 除非明确指定
-mgettrcost, -mno-pt-固定 也暗示 -mgettrcost=100; 这阻止了注册
使用目标寄存器来存储普通整数的分配。
-minvalid-符号
假设符号可能无效。 编译器生成的普通函数符号
加载 "movi"/"shori"/"ptabs" 或 "movi"/"shori"/"ptrel" 总是有效的,但是
使用汇编器和/或链接器技巧,可以生成导致
“ptabs”或“ptrel”来捕获。 此选项仅在以下情况下有意义 -mno-pt-固定 在
影响。 它可以防止跨基本块 CSE、提升和大多数符号调度
负载。 默认是 -mno-无效符号.
-mbranch-成本=NUM
假设 NUM 成为分支指令的成本。 更高的数字使编译器
如果可能,尝试生成更多无分支代码。 如果未指定,则值为
选择取决于正在编译的处理器类型。
-mzdc 分支
-mno-zdc 分支
假设(不假设)零位移条件分支指令“bt”和
“bf”很快。 如果 -mzdc 分支 被指定,编译器将尝试更喜欢零
位移分支代码序列。 生成代码时默认启用
对于 SH4 和 SH4A。 可以通过指定显式禁用它 -mno-zdc 分支.
-麦克布兰奇迪
启用“cbranchdi4”指令模式。
-mcmpeqdi
发出“cmpeqdi_t”指令模式,即使 -麦克布兰奇迪 有效。
-mfused-madd
-mno-融合-madd
生成使用(不使用)浮点乘法和累加的代码
指示。 如果硬件浮点数默认生成这些指令
用来。 依赖机器 -mfused-madd 选项现在映射到机器 -
独立 -ffp-合同=快 选项,以及 -mno-融合-madd 映射到
-ffp-合同=关闭.
-mfsca
-mno-fsca
允许或禁止编译器为正弦和余弦发出“fsca”指令
近似值。 选项“-mfsca”必须与
“-funsafe-math-optimizations”。 它在生成代码时默认启用
SH4A。 使用“-mno-fsca”禁用正弦和余弦近似,即使
“-funsafe-math-optimizations”有效。
-mfsrra
-mno-fsrra
允许或禁止编译器为倒数平方发出“fsrra”指令
根近似值。 选项“-mfsrra”必须与
“-funsafe-math-optimizations”和“-ffinite-math-only”。 默认情况下启用时
为 SH4A 生成代码。 使用“-mno-fsrra”禁用倒数平方根
即使“-funsafe-math-optimizations”和“-ffinite-math-only”在
效果。
-pretend-cmove
优先使用零位移条件分支进行条件移动指令
模式。 这会导致 SH4 处理器上的代码更快。
的Solaris 2 附加选项
这些 -m Solaris 2 支持以下选项:
- 纯文本
- 纯文本,除了用于 -共享, 告诉编译器不要通过 -z 文本 至
链接共享对象时的链接器。 使用此选项,您可以链接位置-
依赖代码转换为共享对象。
- 纯文本 抑制“重定位仍然反对可分配但不可写
部分”链接器错误消息。但是,必要的重定位会触发复制
写,并且共享对象实际上并未跨进程共享。 代替
运用 - 纯文本, 你应该编译所有的源代码 -fpic or -fPIC.
除了 Solaris 2 上的上述开关之外,还支持这些开关:
-线程
使用 POSIX 线程库添加对多线程的支持。 此选项设置
预处理器和链接器的标志。 此选项不影响线程
编译器生成的目标代码或随它提供的库的安全。
-p线程
这是同义词 -线程.
SPARC 附加选项
这些 -m SPARC 支持以下选项:
-mno-应用程序-regs
-mapp-regs
指定 -mapp-regs 使用全局寄存器 2 到 4 生成输出,其中
SPARC SVR4 ABI 为应用程序保留。 像全局寄存器 1 一样,每个全局寄存器
然后寄存器 2 到 4 被视为一个可分配的寄存器,它被破坏了
函数调用。 这是默认设置。
要以牺牲一些性能为代价完全符合 SVR4 ABI,请指定
-mno-应用程序-regs. 您应该使用此选项编译库和系统软件。
-mflat
-mno-平
在 -mflat, 编译器不生成保存/恢复指令并使用
“平面”或单寄存器窗口模型。 此型号兼容常规
注册窗口模型。 本地寄存器和输入寄存器(0--5)仍然是
被视为“调用保存”寄存器,并根据需要保存在堆栈中。
在 -mno-平 (默认),编译器生成保存/恢复指令(除了
叶函数)。 这是正常的操作模式。
-mfpu
-mhard-浮动
生成包含浮点指令的输出。 这是默认设置。
-mno-fpu
-msoft-浮动
生成包含浮点库调用的输出。 警告: 必要的
库并非可用于所有 SPARC 目标。 通常,酒店的设施
使用机器通常的 C 编译器,但这不能直接在跨
汇编。 您必须自行安排提供合适的图书馆
交叉编译功能。 嵌入式目标 sparc-*-aout 和 晶石-*-*
提供软件浮点支持。
-msoft-浮动 更改输出文件中的调用约定; 因此,它只是
如果你编译很有用 所有 具有此选项的程序。 特别是,你需要
编 libgcc.a,GCC自带的库,有 -msoft-浮动 为了这个
工作。
-mhard-四浮点
生成包含四字(长双)浮点指令的输出。
-msoft-四浮点
生成包含四字(长双)浮点库调用的输出
指示。 调用的函数是 SPARC ABI 中指定的函数。 这是
默认。
在撰写本文时,没有硬件支持的 SPARC 实现
四字浮点指令。 他们都为其中之一调用陷阱处理程序
这些指令,然后陷阱处理程序模拟指令的效果。
由于陷阱处理程序开销,这比调用 ABI 库慢得多
例行公事。 就这样 -msoft-四浮点 选项是默认值。
-mno-未对齐双打
-munaligned-双打
假设双打有 8 字节对齐。 这是默认设置。
在 -munaligned-双打, GCC 假定双打只有在它们的情况下才具有 8 字节对齐
包含在另一种类型中,或者如果它们具有绝对地址。 否则,它
假设它们有 4 字节对齐。 指定此选项可避免一些罕见的
与其他编译器生成的代码的兼容性问题。 这不是默认值
因为它会导致性能损失,尤其是对于浮点代码。
-muser 模式
-mno-用户模式
不要生成只能在主管模式下运行的代码。 这仅适用于
为 LEON3 处理器发出的“casa”指令。 默认是
-mno-用户模式.
-mno-更快的结构
-mfaster 结构
在 -mfaster 结构, 编译器假定结构应该有 8 字节
结盟。 这允许使用成对的“ldd”和“std”指令进行复制
在结构赋值中,代替两倍多的“ld”和“st”对。 然而
使用这种改变的对齐方式直接违反了 SPARC ABI。 因此,它的目的是
仅用于开发人员承认其结果代码是
不直接符合ABI的规则。
-单片机=处理器类型
设置指令集、寄存器集和指令调度参数
机型 处理器类型. 支持的值 处理器类型 旨在 v7, 柏, v8, 超空间,
超空间, 莱昂, leon3, 莱昂3v7, 分晶石, f930, f934, sparclite86x, 小粒,
TSC701, v9, 超薄, 超sparc3, 尼亚加拉, 尼亚加拉2, 尼亚加拉3 和 尼亚加拉4.
本机 Solaris 和 GNU/Linux 工具链也支持价值 本地人, 选择
主机处理器的最佳架构选择。 -mcpu=本地 没有效果,如果
GCC 无法识别处理器。
默认指令调度参数用于选择一个
架构而不是实现。 这些是 v7, v8, 分晶石, 小粒, v9.
这是每个支持的架构及其支持的实现的列表。
v7 柏树,leon3v7
v8 supersparc, hypersparc, 莱昂, leon3
分晶石
f930、f934、sparclite86x
小粒
TSC701
v9 ultrasparc、ultrasparc3、niagara、niagara2、niagara3、niagara4
默认情况下(除非另外配置),GCC 为 V7 变体生成代码
SPARC 架构。 和 -mcpu=柏树, 编译器另外优化它
赛普拉斯 CY7C602 芯片,用于 SPARCStation/SPARCServer 3xx 系列。 这是
也适用于较旧的 SPARCStation 1、2、IPX 等。
在 -单片机=v8, GCC 为 SPARC 体系结构的 V8 变体生成代码。 这
与 V7 代码的唯一区别是编译器发出整数乘法和
SPARC-V8 中存在但 SPARC-V7 中不存在的整数除法指令。 和
-mcpu=supersparc,编译器还针对 SuperSPARC 芯片对其进行了优化,如
用于 SPARCStation 10、1000 和 2000 系列。
在 -mcpu=sparclite, GCC 为 SPARC 的 SPARClite 变体生成代码
建筑学。 这增加了整数乘法,整数除法步骤和扫描(“ffs”)
SPARClite 中存在但 SPARC-V7 中不存在的指令。 和 -单片机=f930是,
编译器另外针对富士通MB86930芯片进行了优化,为原装
SPARClite,没有 FPU。 和 -单片机=f934, 编译器另外优化它
富士通 MB86934 芯片,这是最新的带有 FPU 的 SPARClite。
在 -mcpu=sparclet, GCC 为 SPARC 的 SPARClet 变体生成代码
建筑学。 这增加了整数乘法,乘法/累加,整数除法
SPARClet 中存在但 SPARC-V7 中不存在的 step 和 scan(“ffs”)指令。 和
-mcpu=tsc701,编译器还针对TEMIC SPARClet 芯片对其进行了优化。
在 -单片机=v9, GCC 为 SPARC 体系结构的 V9 变体生成代码。 这个
添加了 64 位整数和浮点移动指令,3 个额外的浮点
条件代码寄存器和条件移动指令。 和 -mcpu=超空间,
编译器还针对 Sun UltraSPARC I/II/IIi 芯片对其进行了优化。 和
-mcpu=ultraparc3,编译器还针对 Sun UltraSPARC 对其进行了优化
III/III+/IIIi/IIIi+/IV/IV+芯片。 和 -mcpu=尼亚加拉, 编译器另外
针对 Sun UltraSPARC T1 芯片对其进行了优化。 和 -mcpu=niagara2,编译器
此外还针对 Sun UltraSPARC T2 芯片对其进行了优化。 和 -mcpu=niagara3是,
编译器还针对 Sun UltraSPARC T3 芯片对其进行了优化。 和 -mcpu=niagara4,
编译器还针对 Sun UltraSPARC T4 芯片对其进行了优化。
-mtune=处理器类型
设置机器类型的指令调度参数 处理器类型,但不要设置
指令集或寄存器集选项 -单片机=处理器类型 一样。
相同的值 -单片机=处理器类型 可用于 -mtune=处理器类型,但唯一
有用的值是那些选择特定 CPU 实现的值。 那些是
柏, 超空间, 超空间, 莱昂, leon3, 莱昂3v7, f930, f934, sparclite86x,
TSC701, 超薄, 超sparc3, 尼亚加拉, 尼亚加拉2, 尼亚加拉3 和 尼亚加拉4。 同
原生 Solaris 和 GNU/Linux 工具链, 本地人 也可以使用。
-mv8plus
-mno-v8plus
在 -mv8plus, GCC 为 SPARC-V8+ ABI 生成代码。 与V8的区别
ABI 是全局和输出寄存器被认为是 64 位宽。 这是启用的
默认情况下,所有 SPARC-V32 处理器在 Solaris 上以 9 位模式运行。
-mvis
-mno-vis
在 -mvis, GCC 生成利用 UltraSPARC Visual
指令集扩展。 默认是 -mno-vis.
-mvis2
-mno-vis2
在 -mvis2, GCC 生成利用 UltraSPARC 2.0 版的代码
视觉指令集扩展。 默认是 -mvis2 当目标 CPU 为
支持此类指令,例如 UltraSPARC-III 及更高版本。 环境 -mvis2 还
套 -mvis.
-mvis3
-mno-vis3
在 -mvis3, GCC 生成利用 UltraSPARC 3.0 版的代码
视觉指令集扩展。 默认是 -mvis3 当目标 CPU 为
支持此类指令,例如 niagara-3 及更高版本。 环境 -mvis3 还设置
-mvis2 和 -mvis.
-mcbcond
-mno-cbcond
在 -mcbcond, GCC 生成利用比较和分支的代码
指令,如 Sparc Architecture 2011 中所定义。默认为 -mcbcond ,尤其是
针对支持此类指令的 CPU,例如 niagara-4 及更高版本。
-mpopc
-mno-popc
在 -mpopc, GCC 生成利用 UltraSPARC 人口的代码
计数指令。 默认是 -mpopc 当针对支持此类的 CPU 时
说明,例如 Niagara-2 和更高版本。
-mfmaf
-mno-fmaf
在 -mfmaf, GCC 生成利用 UltraSPARC 融合乘法的代码
添加浮点扩展。 默认是 -mfmaf 当目标 CPU 为
支持此类指令,例如 Niagara-3 及更高版本。
-mfix-at697f
为 Atmel AT697F 处理器的单一错误启用记录的解决方法
(对应于 AT13E 处理器的勘误 #697)。
-mfix-ut699
为浮点勘误表和数据缓存启用记录的解决方法
取消UT699处理器的勘误表。
这些 -m 在 9 位 SPARC-V64 处理器上,除了上述选项之外,还支持其他选项
环境:
-立方米
-立方米
为 32 位或 64 位环境生成代码。 32 位环境设置 int,
long 和指向 32 位的指针。 64 位环境将 int 设置为 32 位,并将 long 和
指向 64 位的指针。
-mc模型=这
将代码模型设置为以下之一
梅洛
中/低码模型:64位地址,程序必须链接在低32位
一点点的记忆。 程序可以静态或动态链接。
中
中/中代码模型:64位地址,程序必须链接在低位
44 位内存,文本和数据段的大小必须小于 2GB 并且
数据段必须位于文本段的 2GB 以内。
迈达尼
Medium/Anywhere 代码模型:64 位地址,程序可以链接到任何地方
在内存中,文本和数据段的大小必须小于 2GB,并且数据
段必须位于文本段的 2GB 以内。
嵌入
嵌入式系统的 Medium/Anywhere 代码模型:64 位地址、文本
和数据段的大小必须小于 2GB,都从内存中的任何位置开始
(在链接时确定)。 全局寄存器 %g4 指向数据的基址
部分。 程序是静态链接的,不支持 PIC。
-内存模型=记忆模型
将处理器上有效的内存模型设置为以下之一
默认
处理器和操作系统的默认内存模型。
罗莫 宽松的记忆顺序
so 部分商店订单
TSO 总店订单
sc 顺序一致性
这些内存模型在 Sparc V9 架构的附录 D 中正式定义
手册,在处理器的“PSTATE.MM”字段中设置。
-mstack-偏差
-mno 堆栈偏差
在 -mstack-偏差, GCC 假定堆栈指针和帧指针(如果存在),
偏移 -2047,在进行堆栈帧引用时必须将其添加回来。 这个
是 64 位模式下的默认值。 否则,假设不存在此类偏移。
SPU 附加选项
这些 -m SPU 支持以下选项:
-mwarn-reloc
-merror-重新定位
SPU 的加载程序不处理动态重定位。 默认情况下,GCC 给出了一个
生成需要动态重定位的代码时出错。 -mno-错误重定位
禁用错误, -mwarn-reloc 而是生成警告。
-msafe-DMA
-munsafe-DMA
启动或测试 DMA 完成的指令不得与
关于正在访问的内存的加载和存储。 和 -munsafe-DMA
您必须使用“volatile”关键字来保护内存访问,但这可能会导致
在已知内存不会改变的地方的低效代码。 而不是标记
内存为易失性,您可以使用 -msafe-DMA 告诉编译器处理 DMA
指令可能影响所有内存。
-mbranch-提示
默认情况下,GCC 会生成一条分支提示指令来避免流水线停顿
总是采用或可能采用的分支。 小于 8 时不会生成提示
指令远离其分支。 几乎没有理由禁用它们,除了
调试目的,或者使对象变小一点。
-msmall-内存
-mlarge-内存
默认情况下,GCC 生成代码假设地址永远不会大于 18 位。
在 -mlarge-内存 生成的代码假定为完整的 32 位地址。
-mstdmain
默认情况下,GCC 链接到假定 SPU 风格的主函数的启动代码
接口(它有一个非常规的参数列表)。 和 -mstdmain, 海湾合作委员会链接
您的程序针对假定“main”的 C99 样式接口的启动代码,
包括“argv”字符串的本地副本。
-mfixed-范围=寄存器范围
生成将给定寄存器范围视为固定寄存器的代码。 固定寄存器
是寄存器分配器不能使用的。 这在编译内核时很有用
代码。 寄存器范围指定为由破折号分隔的两个寄存器。 多种的
可以用逗号分隔指定寄存器范围。
-mea32
-mea64
编译代码假设指向通过“__ea”访问的 PPU 地址空间的指针
命名地址空间限定符是 32 位或 64 位宽。 默认值为 32 位。
由于这是一个 ABI 更改选项,因此必须编译可执行文件中的所有目标代码
使用相同的设置。
-maddress 空间转换
-mno-地址空间转换
允许/禁止将“__ea”地址空间视为通用地址的超集
空间。 这使得“__ea”和泛型指针之间的显式类型转换以及
泛型指针到“__ea”指针的隐式转换。 默认是允许
地址空间指针转换。
-mcache-大小=缓存大小
此选项控制编译器链接到可执行文件的 libgcc 版本
并选择一个软件管理的缓存来访问“__ea”地址中的变量
具有特定缓存大小的空间。 可能的选项 缓存大小 旨在 8, 16, 32, 64
和 128. 默认缓存大小为 64KB。
-matomic-更新
-mno-atomic-更新
此选项控制编译器链接到可执行文件的 libgcc 版本
并选择是否对 PPU 端变量的软件管理缓存进行原子更新
被使用。 如果使用原子更新,则使用 SPU 代码更改 PPU 变量
“__ea”命名的地址空间限定符不会干扰对其他 PPU 的更改
来自 PPU 代码的变量驻留在同一缓存行中。 如果不使用原子
更新,可能会发生此类干扰; 然而,写回缓存行更多
高效的。 默认行为是使用原子更新。
-mdual-nop
-mdual-nops=n
默认情况下,GCC 会在预期增加时插入 nops 以增加双重问题
性能。 n 可以是 0 到 10 之间的值。 n 插入更少的 nops。 10 是
默认值,0 与 -mno-dual-nop. 禁用与 -你.
-mint-max-nops=n
为分支提示插入的最大 nops 数。 分支提示必须至少为 8
指令远离它所影响的分支。 GCC 最多插入 n nops 到
强制执行此操作,否则不会生成分支提示。
-mint-max-distance=n
分支提示指令的编码限制提示在256以内
它所影响的分支的指令。 默认情况下,GCC 确保它在
125.
-msafe-提示
解决导致 SPU 无限期停止的硬件错误。 默认情况下,GCC
插入“hbrp”指令以确保不会发生这种停顿。
附加选项 系统 V
这些附加选项在 System V Release 4 上可用,以便与其他
这些系统上的编译器:
-G 创建共享对象。 建议 -象征性的 or -共享 改为使用。
-Qy 在“.ident”汇编程序中识别编译器使用的每个工具的版本
输出中的指令。
-Qn 避免在输出文件中添加“.ident”指令(这是默认设置)。
-YP,迪尔斯
搜索目录 迪尔斯,没有其他,对于指定的库 -l.
-嗯,DIR
看目录 DIR 找到M4预处理器。 汇编程序使用这个
选项。
瓷砖-Gx 附加选项
这些 -m TILE-Gx 支持以下选项:
-mcmodel=小
为小模型生成代码。 直拨距离限制为500M
在任一方向。 PC 相对地址是 32 位。 绝对地址支持
完整的地址范围。
-mcmodel=大
为大型模型生成代码。 通话距离没有限制,pc-
相对地址,或绝对地址。
-单片机=姓名
选择要定位的 CPU 类型。 目前唯一支持的类型是 泰莱克斯.
-立方米
-立方米
为 32 位或 64 位环境生成代码。 32 位环境设置 int,
long 和指向 32 位的指针。 64 位环境将 int 设置为 32 位,并将 long 和
指向 64 位的指针。
瓷砖专业版 附加选项
这些 -m TILEPro 支持以下选项:
-单片机=姓名
选择要定位的 CPU 类型。 目前唯一支持的类型是 瓷砖.
-立方米
为 32 位环境生成代码,将 int、long 和指针设置为 32 位。
这是唯一受支持的行为,因此该标志基本上被忽略。
V850 附加选项
这些 -m 为 V850 实现定义了选项:
-mlong 通话
-mno-长通话
将所有呼叫视为远(近)。 如果假设呼叫距离很远,则
编译器总是将函数的地址加载到寄存器中,并间接调用
通过指针。
-mno-ep
-mep
不优化(do优化)使用相同索引指针4个或更多的基本块
将指针复制到“ep”寄存器的次数,并使用较短的“sld”和“sst”
指示。 这 -mep 如果您进行优化,则默认情况下该选项处于启用状态。
-mno-prolog-函数
-mprolog-函数
不要在序言中使用(do use)外部函数来保存和恢复寄存器
和函数的结尾。 外部函数速度较慢,但使用的代码较少
如果多个函数保存相同数量的寄存器,则需要空间。 这
-mprolog-函数 如果您进行优化,则默认情况下该选项处于启用状态。
-空间
尝试使代码尽可能小。 目前,这只是打开 -mep
和 -mprolog-函数 选项。
-mtda=n
放置大小为的静态或全局变量 n 字节或更少到微小的数据区域
那个寄存器“ep”指向。 微小的数据区总共最多可容纳 256 个字节
(128 个字节用于字节引用)。
-msda=n
放置大小为的静态或全局变量 n 字节或更少进入小数据区
那个寄存器“gp”指向。 小数据区最多可容纳 64 KB。
-mzda=n
放置大小为的静态或全局变量 n 前 32 个字节或更少
千字节内存。
-MV850
指定目标处理器为 V850。
-mv850e3v5
指定目标处理器为 V850E3V5。 预处理器常数
__v850e3v5__ 如果使用此选项,则定义。
-mv850e2v4
指定目标处理器为 V850E3V5。 这是一个别名
-mv850e3v5 选项。
-mv850e2v3
指定目标处理器为 V850E2V3。 预处理器常数
__v850e2v3__ 如果使用此选项,则定义。
-mv850e2
指定目标处理器为 V850E2。 预处理器常数 __v850e2__
如果使用此选项,则定义。
-mv850e1
指定目标处理器为 V850E1。 预处理器常量
__v850e1__ 和 __v850e__ 如果使用此选项,则定义。
-mv850es
指定目标处理器为 V850ES。 这是一个别名 -mv850e1
选项。
-mv850e
指定目标处理器为 V850E。 预处理器常数 __v850e__
如果使用此选项,则定义。
如果两者都不是 -MV850 也不 -mv850e 也不 -mv850e1 也不 -mv850e2 也不 -mv850e2v3 也不 -mv850e3v5
定义然后选择一个默认的目标处理器和相关的 __v850*__
定义了预处理器常量。
预处理器常量 __v850 和 __v851__ 总是被定义的,无论哪个
处理器变体是目标。
-m禁用调用
-mno-禁用呼叫
此选项禁止为 v850e、v850e1、
v850e2、v850e2v3 和 v850e3v5 版本的 v850 架构。
使用 RH850 ABI 时,此选项默认启用(请参阅 -mrh850-abi),
使用 GCC ABI 时默认禁用。 如果“CALLT”指令被
生成然后将定义 C 预处理器符号“__V850_CALLT__”。
-放松
-mno-放松
传递(或不传递) -放松 汇编程序的命令行选项。
-mlong 跳跃
-mno-长跳
禁用(或重新启用)PC 相关跳转指令的生成。
-msoft-浮动
-mhard-浮动
禁用(或重新启用)硬件浮点指令的生成。 这个
选项仅在目标架构是 V850E2V3 或更高。 如果
正在生成硬件浮点指令,然后是 C 预处理器
符号“__FPU_OK__”将被定义,否则符号“__NO_FPU__”将被定义
定义。
-mloop
启用 e3v5 LOOP 指令的使用。 本指令的使用不是
选择 e3v5 架构时默认启用,因为它的使用仍然
实验性的。
-mrh850-abi
-mghs
启用对 V850 ABI 的 RH850 版本的支持。 这是默认设置。 和
此版本的 ABI 适用以下规则:
· 整数大小的结构和联合是通过内存指针而不是返回
一个寄存器。
· 大型结构和联合(大小超过 8 个字节)按值传递。
· 函数与 16 位边界对齐。
· -m8byte 对齐 支持命令行选项。
· -m禁用调用 默认情况下启用命令行选项。 这
-mno-禁用呼叫 不支持命令行选项。
启用此版本的 ABI 时,C 预处理器符号“__V850_RH850_ABI__”
被定义。
-mgcc-abi
启用对 V850 ABI 的旧 GCC 版本的支持。 使用此版本的 ABI
适用以下规则:
· 整数大小的结构和联合在寄存器“r10”中返回。
· 大型结构和联合(大小超过 8 个字节)通过引用传递。
· 函数对齐到 32 位边界,除非优化大小。
· -m8byte 对齐 不支持命令行选项。
· -m禁用调用 支持命令行选项,但默认情况下不启用。
启用此版本的 ABI 时,C 预处理器符号“__V850_GCC_ABI__”
被定义。
-m8byte 对齐
-mno-8字节对齐
支持在 8 字节上对齐的“doubles”和“long long”类型
边界。 默认是将所有对象的对齐限制为最多
4字节。 什么时候 -m8byte 对齐 实际上是 C 预处理器符号
“__V850_8BYTE_ALIGN__”将被定义。
-mbig-开关
生成适合大开关表的代码。 仅在以下情况下使用此选项
汇编程序/链接程序抱怨切换表中的分支超出范围。
-mapp-regs
此选项会导致在编译器生成的代码中使用 r2 和 r5。 这个
设置为默认值。
-mno-应用程序-regs
此选项导致 r2 和 r5 被视为固定寄存器。
VAX 附加选项
这些 -m 为 VAX 定义了选项:
-munix
不要输出某些 Unix 汇编程序的跳转指令(“aobleq”等)
因为 VAX 无法处理远距离。
-mgnu
假设 GNU 汇编器正在运行,请输出这些跳转指令
用过的。
-毫克 G 格式浮点数而不是 D 格式的输出代码。
VMS 附加选项
这些 -m 为 VMS 实现定义了选项:
-mvms-返回码
从“main”返回 VMS 条件代码。 默认是返回 POSIX 风格的条件
(例如错误)代码。
-mdebug-main=字首
标记名称以开头的第一个例程 字首 作为主要的例程
调试器。
-mmalloc64
默认为 64 位内存分配例程。
-mpointer 大小=尺寸
设置指针的默认大小。 可能的选项 尺寸 旨在 32 or 短 对于 32 位
指针, 64 or 长 对于 64 位指针,和 没有 仅支持 32 位指针。
后面的选项禁用“pragma pointer_size”。
VxWorks的 附加选项
本节中的选项是为所有 VxWorks 目标定义的。 特定于
目标硬件与该目标的其他选项一起列出。
-mrtp
GCC 可以为 VxWorks 内核和实时进程 (RTP) 生成代码。 这个
选项从前者切换到后者。 它还定义了预处理器宏
“__RTP__”。
-非静态
将 RTP 可执行文件链接到共享库而不是静态库。 这
选项 -静态的 和 -共享 也可用于 RTP; -静态的 是默认值。
-静态
-B动态
这些选项被传递给链接器。 它们的定义是为了与
迪亚布。
-Xbind-懒惰
启用函数调用的延迟绑定。 这个选项相当于 -Wl,-z,现在 提供美容纤体,
定义为与 Diab 兼容。
-Xbind-现在
禁用函数调用的延迟绑定。 这个选项是默认的,定义为
与戴铂的兼容性。
x86 64 附加选项
这些列在
暴风雨16 附加选项
这些选项是为 Xstormy16 定义的:
-msim
选择适合模拟器的启动文件和链接描述文件。
克滕萨 附加选项
Xtensa 目标支持这些选项:
-mconst16
-mno-const16
启用或禁用用于加载常量值的“CONST16”指令。 这
“CONST16”指令目前不是 Tensilica 的标准选项。 什么时候
启用时,始终使用“CONST16”指令代替标准“L32R”
指示。 “CONST16”的使用仅在“L32R”
指令不可用。
-mfused-madd
-mno-融合-madd
启用或禁用融合乘法/加法和乘法/减法指令的使用
浮点选项。 如果浮点选项也不是
启用。 禁用融合乘法/加法和乘法/减法指令强制
编译器使用单独的指令进行乘法和加法/减法运算。
在某些情况下,如果严格符合 IEEE 754 标准,这可能是可取的
要求:融合乘加/减指令不舍入中间
结果,从而产生结果 更多 比指定的精度位
IEEE 标准。 禁用融合乘法加法/减法指令还可以确保
程序输出对编译器组合乘法和运算的能力不敏感
加减运算。
-mserialize-易失性
-mno-序列化-易失性
启用此选项后,GCC 在“易失性”内存之前插入“MEMW”指令
引用以保证顺序一致性。 默认是 -mserialize-易失性.
使用 -mno-序列化-易失性 省略“MEMW”指令。
-mforce-无图片
对于像 GNU/Linux 这样的目标,所有用户模式的 Xtensa 代码都必须位于
独立代码 (PIC),此选项禁用 PIC 编译内核代码。
-mtext-节文字
-mno-文本部分-文字
控制文字池的处理。 默认是 -mno-文本部分-文字,
它将文字放在输出文件的单独部分中。 这允许
文字池放置在数据 RAM/ROM 中,它还允许链接器结合
来自单独目标文件的文字池,以删除多余的文字并改进代码
尺寸。 和 -mtext-节文字, 文字散布在 text 部分
为了使它们尽可能接近它们的参考文献。 这可能是必要的
用于大型装配文件。
-mtarget-对齐
-mno-目标对齐
启用此选项时,GCC 指示汇编器自动对齐
以牺牲一些代码密度为代价来减少分支惩罚的指令。 这
汇编程序试图扩大密度指令以对齐分支目标和
指令遵循呼叫指令。 如果前面没有足够的安全
密度指令对齐目标,不执行加宽。 默认是
-mtarget-对齐. 这些选项不影响自动对齐的处理
像“LOOP”这样的指令,汇编器总是通过加宽来对齐
密度指令或通过插入 NOP 指令。
-长途电话
-mno-longcalls
启用此选项后,GCC 指示汇编器将直接调用转换为
间接调用,除非它可以确定直接调用的目标在
call 指令允许的范围。 这种转换通常发生在调用
其他源文件中的函数。 具体来说,汇编程序直接翻译
“CALL”指令变成“L32R”,然后是“CALLX”指令。 默认是
-mno-longcalls. 这个选项应该用在调用目标可以的程序中
可能超出范围。 此选项在汇编程序中实现,而不是在
编译器,所以GCC生成的汇编代码还是显示直接调用
指令---查看反汇编的目标代码以查看实际指令。
请注意,汇编程序对每个跨文件调用都使用间接调用,而不仅仅是
那些真正超出范围的。
z系列 附加选项
这些列在
附加选项 代码 代 公约
这些与机器无关的选项控制代码中使用的接口约定
一代。
它们中的大多数有正面和负面两种形式; 的否定形式 -ffoo is
-fno-foo. 在下表中,只列出了其中一种形式——不属于
默认。 您可以通过删除来找出另一种形式 NO- 或添加它。
-fbounds-检查
对于支持它的前端,生成额外的代码来检查索引用于
访问数组在声明的范围内。 目前仅支持
Java 和 Fortran 前端,此选项默认为 true 和 false
。
-fstack-重用=重用级
此选项控制用户声明的本地/自动变量的堆栈空间重用和
编译器生成的临时文件。 重用级别 可 所有, 命名变量或 没有. 所有
为所有局部变量和临时变量启用堆栈重用, 命名变量 启用
仅对用户定义的带有名称的局部变量重用,以及 没有 禁用堆栈重用
完全地。 默认值为 所有. 程序扩展时需要该选项
作用域局部变量的生命周期或编译器生成的临时超出
语言定义的终点。 当变量的生命周期结束时,如果
变量存在于内存中,优化编译器可以自由重用其堆栈
与其他临时变量或范围局部变量的空间,其生命范围不
与其重叠。 延长本地生命周期的遗留代码可能会与
堆栈重用优化。
例如,
int * p;
{
诠释本地1;
p = &local1;
本地1 = 10;
....
}
{
诠释本地2;
本地2 = 20;
...
}
if (*p == 10) // 超出范围使用 local1
{
}
另一个例子:
结构体A
{
A(int k) : i(k), j(k) { }
int i;
国际 j;
};
一个*ap;
void foo(const A& ar)
{
ap = &ar;
}
空栏()
{
富(A(10)); // 当 foo 返回时临时对象的生命周期结束
{
A a(20);
....
}
ap->i+= 10; // ap 引用超出范围 temp 其空间
// 与 a 重用。 ap->i 的值是多少?
}
C++ 标准很好地定义了编译器生成的临时文件的生命周期。
当短暂的一生结束,如果短暂的生活在记忆中,
优化编译器可以自由地将其堆栈空间与其他临时文件或
有效范围不与其重叠的范围局部变量。 然而一些
遗留代码依赖于旧编译器的行为,其中临时堆栈
空间未被重用,激进的堆栈重用会导致运行时错误。 这个
选项用于控制临时堆栈重用优化。
-Ftrapv.
此选项为加法、减法、
乘法运算。
-fwrapv
此选项指示编译器假设有符号算术溢出
加法、减法和乘法使用二进制补码环绕
表示。 此标志启用一些优化并禁用其他优化。 这个
根据 Java 语言的要求,默认情况下为 Java 前端启用选项
规格。
-f异常
启用异常处理。 生成传播异常所需的额外代码。 为了
一些目标,这意味着 GCC 为所有函数生成帧展开信息,
这会产生显着的数据大小开销,尽管它不会影响
执行。 如果不指定此选项,GCC 默认为语言启用它
像通常需要异常处理的 C++ 一样,并为像这样的语言禁用它
C 通常不需要它。 但是,您可能需要在以下情况下启用此选项
编译需要与编写的异常处理程序正确互操作的 C 代码
在 C++ 中。 如果您正在编译较旧的 C++,您可能还希望禁用此选项
不使用异常处理的程序。
-f 非调用异常
生成允许捕获指令抛出异常的代码。 请注意,这
需要并非无处不在的特定于平台的运行时支持。 而且,
它只允许 诱捕 抛出异常的指令,即内存引用或
浮点指令。 它不允许任意抛出异常
信号处理程序,例如“SIGALRM”。
-fdelete-死异常
考虑可能引发异常但不会以其他方式导致
程序的执行可以被优化掉。 默认情况下启用此选项
在 Ada 语言规范允许的范围内,用于 Ada 前端。 优化
导致死异常被删除的传递在不同的地方独立启用
优化级别。
-funwind 表
像 -f异常,除了它只是生成任何需要的静态数据,但是
不会以任何其他方式影响生成的代码。 你通常不需要
启用此选项; 相反,需要这种处理的语言处理器启用它
代表你。
-fasynchronous-展开表
如果目标机器支持,生成 DWARF 2 格式的展开表。 该表是
精确到每个指令边界,因此它可以用于堆栈展开
异步事件(例如调试器或垃圾收集器)。
-fno-gnu-唯一
在具有最新 GNU 汇编程序和 C 库的系统上,C++ 编译器使用
“STB_GNU_UNIQUE”绑定以确保模板静态数据成员的定义
内联函数中的静态局部变量即使存在
"RTLD_LOCAL"; 这是必要的,以避免两个不同的库使用的库出现问题
“RTLD_LOCAL”插件取决于其中之一的定义,因此
不同意另一个关于符号的绑定。 但这导致
受影响的 DSO 将忽略“dlclose”; 如果您的程序依赖于重新初始化
通过“dlclose”和“dlopen”的DSO,您可以使用 -fno-gnu-唯一.
-fpcc-结构返回
在内存中返回“short”、“struct”和“union”值,就像更长的值一样,而不是在内存中
注册。 这种约定效率较低,但它的优点是允许
GCC 编译的文件和其他编译器编译的文件之间的可互调用性,
特别是便携式 C 编译器 (pcc)。
在内存中返回结构的精确约定取决于目标
配置宏。
短结构和联合的大小和对齐方式与某些
整数类型。
警告: 使用编译的代码 -fpcc-结构返回 开关不是二进制兼容的
使用编译的代码 -freg-结构返回 转变。 用它来符合非
默认应用程序二进制接口。
-freg-结构返回
尽可能在寄存器中返回“struct”和“union”值。 这样效率更高
对于小结构比 -fpcc-结构返回.
如果您既不指定 -fpcc-结构返回 也不 -freg-结构返回, GCC 默认为
无论哪种约定都是目标的标准。 如果没有标准约定,
GCC 默认为 -fpcc-结构返回, 除了 GCC 是主体的目标
编译器。 在这些情况下,我们可以选择标准,我们选择效率更高的
注册返回替代。
警告: 使用编译的代码 -freg-结构返回 开关不是二进制兼容的
使用编译的代码 -fpcc-结构返回 转变。 用它来符合非
默认应用程序二进制接口。
-fshort-枚举
仅分配给“枚举”类型的声明范围所需的字节数
可能的值。 具体来说,“enum”类型相当于最小的整数
有足够空间的类型。
警告: 此 -fshort-枚举 switch 导致 GCC 生成非二进制代码
与没有该开关生成的代码兼容。 用它来符合非
默认应用程序二进制接口。
-fshort-双
对“double”使用与“float”相同的大小。
警告: 此 -fshort-双 switch 导致 GCC 生成非二进制代码
与没有该开关生成的代码兼容。 用它来符合非
默认应用程序二进制接口。
-fshort-wchar
覆盖基础类型 wchar_t 成为 短 无符号 INT 而不是
目标的默认值。 此选项对于构建要在其下运行的程序很有用
葡萄酒。
警告: 此 -fshort-wchar switch 导致 GCC 生成非二进制代码
与没有该开关生成的代码兼容。 用它来符合非
默认应用程序二进制接口。
-fno-普通
在 C 代码中,控制未初始化的全局变量的放置。 Unix C 编译器
传统上允许在不同的情况下对此类变量进行多次定义
通过将变量放在公共块中来编译单元。 这是行为
由 -fcommon, 并且是大多数目标上 GCC 的默认设置。 另一方面,
ISO C 不要求此行为,并且在某些目标上可能带有速度或代码
变量引用的大小惩罚。 这 -fno-普通 选项指定
编译器应该将未初始化的全局变量放在对象的数据部分
文件,而不是将它们生成为公共块。 这具有的效果是,如果
在两个不同的编译中声明了相同的变量(没有“extern”),你会得到一个
链接它们时出现多定义错误。 在这种情况下,您必须编译
-fcommon 反而。 编译 -fno-普通 对它所针对的目标很有用
提供更好的性能,或者如果您希望验证该程序是否可以运行
其他总是以这种方式处理未初始化变量声明的系统。
-fno-ident
忽略 #身份 指令。
-finhibit-size-指令
不要输出“.size”汇编指令,或其他任何会引起问题的指令
如果函数在中间分割,并且两半放置在较远的位置
在记忆中分开。 编译时使用此选项 crtstuff.c; 你不应该需要
将其用于其他任何用途。
-fverbose-asm
在生成的汇编代码中加入额外的注释信息,使其更加
可读。 这个选项通常只对那些真正需要阅读
生成的汇编代码(可能在调试编译器本身时)。
-fno-详细-asm,默认值,导致额外信息被省略,是
在比较两个汇编程序文件时很有用。
-frecord-gcc-开关
此开关导致用于调用编译器的命令行被记录到
正在创建的目标文件。 此开关仅在某些
目标和记录的确切格式是目标和二进制文件格式
依赖,但它通常采用包含 ASCII 文本的节的形式。 这个
开关与 -fverbose-asm 开关,但那个开关只记录
汇编器输出文件中的信息作为注释,因此它永远不会到达对象
文件。 也可以看看 -grecord-gcc-开关 将编译器选项存储到的另一种方式
目标文件。
-fpic
生成适用于共享库的位置无关代码 (PIC),如果
支持目标机器。 这样的代码通过一个访问所有常量地址
全局偏移表 (GOT)。 动态加载器在以下情况下解析 GOT 条目
程序启动(动态加载器不是 GCC 的一部分;它是操作的一部分
系统)。 如果链接的可执行文件的 GOT 大小超过机器特定的最大值
大小,您会从链接器收到一条错误消息,表明 -fpic 不起作用; 在
在这种情况下,重新编译 -fPIC 反而。 (这些最大值是 SPARC 上的 8k 和 32k
在 m68k 和 RS/6000 上。 386 没有这样的限制。)
与位置无关的代码需要特殊支持,因此仅适用于
某些机器。 对于 386,GCC 支持 System V 的 PIC,但不支持 Sun
386i。 为 IBM RS/6000 生成的代码始终与位置无关。
设置此标志后,宏“__pic__”和“__PIC__”定义为 1。
-fPIC
如果目标机器支持,则发出与位置无关的代码,适用于
动态链接并避免对全局偏移表的大小进行任何限制。 这个
选项在 m68k、PowerPC 和 SPARC 上有所不同。
与位置无关的代码需要特殊支持,因此仅适用于
某些机器。
设置此标志后,宏“__pic__”和“__PIC__”定义为 2。
-fpie
-fPIE
这些选项类似于 -fpic 和 -fPIC, 但生成的位置无关代码
只能链接到可执行文件中。 通常这些选项用于 -馅饼 GCC
选项在链接期间使用。
-fpie 和 -fPIE 两者都定义了宏“__pie__”和“__PIE__”。 宏有
值为 1 -fpie 和2 for -fPIE.
-fno-跳转表
即使在效率更高的地方,也不要将跳转表用于 switch 语句
与其他代码生成策略相比。 此选项与
-fpic or -fPIC 用于构建构成动态链接器的一部分并且不能的代码
引用跳转表的地址。 在某些目标上,跳转表不需要
GOT,不需要这个选项。
-固定-章
对待名为的寄存器 章 作为固定寄存器; 生成的代码永远不应该引用
它(可能作为堆栈指针、帧指针或其他固定角色除外)。
章 必须是寄存器的名称。 接受的寄存器名称是机器特定的
并在机器描述宏文件的“REGISTER_NAMES”宏中定义。
此标志没有否定形式,因为它指定了三向选择。
-fcall-使用-章
对待名为的寄存器 章 作为被函数破坏的可分配寄存器
调用。 它可能被分配给不跨域的临时变量或变量。
称呼。 以这种方式编译的函数不保存和恢复寄存器 章.
将此标志与帧指针或堆栈指针一起使用是错误的。 使用这个
在机器执行中具有固定普遍角色的其他寄存器的标志
模型产生了灾难性的结果。
此标志没有否定形式,因为它指定了三向选择。
-fcall-保存-章
对待名为的寄存器 章 作为函数保存的可分配寄存器。 它可能是
甚至为跨调用存在的临时变量或变量分配。 职能
以这种方式编译保存和恢复寄存器 章 如果他们使用它。
将此标志与帧指针或堆栈指针一起使用是错误的。 使用这个
在机器执行中具有固定普遍角色的其他寄存器的标志
模型产生了灾难性的结果。
将此标志用于寄存器会导致另一种灾难
可以返回函数值。
此标志没有否定形式,因为它指定了三向选择。
-fpack-结构[=n]
没有指定值,将所有结构成员打包在一起,没有孔。 当一个
指定值(必须是 XNUMX 的小幂),pack 结构成员
根据这个值,代表最大对齐(即具有
大于此值的默认对齐要求在输出时可能未对齐
下一个安装位置。
警告: 此 -fpack 结构 switch 导致 GCC 生成非二进制代码
与没有该开关生成的代码兼容。 此外,它使代码
次优。 使用它来符合非默认应用程序二进制接口。
-仪器功能
生成用于进入和退出函数的检测调用。 就在函数之后
进入并在函数退出之前,以下分析函数被调用
当前函数的地址及其调用点。 (在某些平台上,
“__builtin_return_address”在当前函数之外不起作用,因此调用站点
否则信息可能无法用于分析功能。)
无效__cyg_profile_func_enter(无效*this_fn,
无效 *call_site);
无效__cyg_profile_func_exit(无效*this_fn,
无效 *call_site);
第一个参数是当前函数的开始地址,可以是
正好在符号表中查找。
这种检测也适用于在其他函数中内联扩展的函数。
分析调用从概念上指示了内联函数的输入位置和
退出。 这意味着此类函数的可寻址版本必须可用。 如果
你对一个函数的所有使用都是内联扩展的,这可能意味着额外的扩展
代码大小。 如果你使用 外部 一致 在您的 C 代码中,此类的可寻址版本
必须提供功能。 (无论如何通常都是这种情况,但如果你幸运的话
并且优化器总是内联扩展函数,你可能已经逃脱了
不提供静态副本。)
一个函数可以被赋予属性“no_instrument_function”,在这种情况下这个
仪表没有完成。 这可以用于,例如,分析
上面列出的函数、高优先级中断例程和任何函数
不能安全地调用分析函数(可能是信号处理程序,如果
分析例程生成输出或分配内存)。
-finstrument-functions-exclude-file-list=文件,文件,...
设置从检测中排除的函数列表(请参阅说明
“-finstrument-functions”)。 如果包含函数定义的文件匹配
与其中之一 文件,则该函数未检测。 比赛是在
子串:如果 文件 参数是文件名的子串,它被认为是
成为一场比赛。
例如:
-finstrument-functions-exclude-file-list=/bits/stl,include/sys
排除在路径名包含“/bits/stl”的文件中定义的任何内联函数或
“包括/系统”。
如果出于某种原因,您想在其中一个中包含字母“,” 符号, 写 ','。 为了
例如,“-finstrument-functions-exclude-file-list=',,tmp'”(注意单引号
围绕选项)。
-finstrument-functions-exclude-function-list=符号,符号,...
这类似于“-finstrument-functions-exclude-file-list”,但此选项设置
要从检测中排除的函数名称列表。 函数名
被匹配的是其用户可见的名称,例如“vector 等等(常量向量&)",
不是内部损坏的名称(例如,“_Z4blahRSt6vectorIiSaIiEE”)。 比赛结束
在子串上:如果 符号 参数是函数名的子字符串,它是
被认为是一场比赛。 对于 C99 和 C++ 扩展标识符,函数名
必须以 UTF-8 格式给出,不使用通用字符名称。
-fstack-检查
生成代码以验证您没有超出堆栈边界。 你
如果您在具有多个线程的环境中运行,则应指定此标志,
但是你很少需要在单线程环境中指定它,因为堆栈
如果只有一个堆栈,几乎所有系统都会自动检测溢出。
请注意,此开关实际上不会导致进行检查; 经营的
系统或语言运行时必须这样做。 该开关导致代码生成
确保他们看到正在扩展的堆栈。
您还可以指定一个字符串参数:“no”表示不检查,“generic”
表示强制使用旧式检查,“特定”表示使用最佳检查
方法和等价于裸 -fstack-检查.
旧式检查是一种通用机制,不需要特定的目标支持
编译器,但有以下缺点:
1.修改大对象的分配策略:总是分配
如果它们的大小超过固定阈值,则动态。
2. 固定函数静态框架的大小限制:当它被一个
特定功能,堆栈检查不可靠,并且会发出警告
编译器。
3. 效率低下:因为修改了分配策略和泛型
实施,代码性能受到阻碍。
请注意,如果没有,旧式堆栈检查也是“特定”的回退方法
编译器中添加了目标支持。
-fstack-限制-寄存器=章
-fstack-限制符号=符号
-fno-堆栈限制
生成代码以确保堆栈不会增长超过某个值,或者
寄存器的值或符号的地址。 如果需要更大的堆栈,
在运行时发出信号。 对于大多数目标,信号在堆栈之前发出
超出边界,因此可以在不采取特殊措施的情况下捕获信号
注意事项。
例如,如果堆栈从绝对地址开始 0x80000000 并向下生长,
你可以使用标志 -fstack-limit-symbol=__stack_limit 和
-Wl,--defsym,__stack_limit=0x7ffe0000 强制执行 128KB 的堆栈限制。 注意
这可能只适用于 GNU 链接器。
-fsplit堆栈
生成代码以在堆栈溢出之前自动拆分堆栈。 所结果的
程序有一个不连续的堆栈,只有在程序无法执行时才会溢出
分配更多内存。 这在运行线程程序时最有用,因为它
不再需要计算用于每个线程的良好堆栈大小。 这是
目前只为运行 GNU/Linux 的 i386 和 x86_64 后端实现。
当代码编译时 -fsplit堆栈 调用没有编译的代码 -fsplit堆栈有
可能没有太多堆栈空间可供后面的代码运行。 如果编译所有
代码,包括库代码,与 -fsplit堆栈 不是一个选项,那么链接器可以
修复这些调用,以便代码编译时无需 -fsplit堆栈 总是有一个大
堆。 对此的支持在 GNU binutils 版本的黄金链接器中实现
2.21年及以后。
-fleading-下划线
此选项及其对应选项, -fno-领先-下划线, 强行改变方式 C
符号在目标文件中表示。 一种用途是帮助与遗产建立联系
汇编代码。
警告: 此 -fleading-下划线 switch 导致 GCC 生成不是
二进制与没有该开关生成的代码兼容。 用它来符合一个
非默认应用程序二进制接口。 并非所有目标都提供完整的支持
对于这个开关。
-ftls-模型=模型
更改要使用的线程本地存储模型。 这 模型 论点应该是其中之一
“全局动态”、“本地动态”、“初始执行”或“本地执行”。
默认不带 -fpic 是“初始执行”; 和 -fpic 默认是
“全球动态”。
-可见性=默认|内部|隐藏|受保护
将默认的 ELF 图像符号可见性设置为指定选项---所有符号都是
除非在代码中被覆盖,否则标有此标记。 使用这个功能可以很
显着改善共享对象库的链接和加载时间,产生更多
优化代码,提供近乎完美的 API 导出并防止符号冲突。 这是
非常 建议您在分发的任何共享对象中使用它。
尽管有命名法,“默认”总是意味着公开; 即,可链接
从共享对象外部反对。 "protected" 和 "internal" 没啥用
在实际使用中,唯一的其他常用选项是“隐藏”。 默认的
if -可见性 未指定为“默认”,即,使每个符号都公开---这
导致与以前版本的 GCC 相同的行为。
对确保 ELF 符号具有正确的好处的很好的解释
可见性由 Ulrich Drepper 的“How To Write Shared Libraries”给出(可以是
发现于http://people.redhat.com/~drepper/>)---但是一个卓越的解决方案
可以通过此选项将默认设置为公开时隐藏的内容标记为
默认隐藏并将事物标记为公开。 这是 Windows 上的 DLL 的标准,并且
- -fvisibility=隐藏 和 "__attribute__ ((visibility("default")))" 而不是
“__declspec(dllexport)”你得到几乎相同的语义和相同的语法。
这对那些从事跨平台项目的人来说是一个巨大的福音。
对于那些为现有代码添加可见性支持的人,您可能会发现 #pragma GCC
能见度 使用。 这通过您附上您希望设置的声明来工作
可见性(例如) #pragma GCC 能见度 推(隐藏) 和 #pragma GCC
能见度 流行的. 请记住,应查看符号可见性 as 部分 of 此
API 接口 合同 因此,所有新代码都应始终指定可见性
不是默认值; 即,仅在本地 DSO 内使用的声明应 时刻
被显式标记为隐藏以避免 PLT 间接开销---使这个
非常清楚还有助于代码的可读性和自文档化。 注意
由于 ISO C++ 规范要求,“operator new”和“operator delete”必须
始终为默认可见性。
请注意来自项目外部的标题,特别是系统标题和
来自您使用的任何其他库的头文件,可能不希望被编译
除默认值之外的可见性。 你可能需要明确地说 #pragma GCC
能见度 推(默认) 在包含任何此类标题之前。
外部 声明不受 -可见性,所以很多代码都可以
重新编译 -fvisibility=隐藏 没有任何修改。 然而,这意味着
对没有显式可见性的“extern”函数的调用使用 PLT,因此它更多
有效地使用“__attribute ((visibility))”和/或“#pragma GCC可见性”来告诉
应将“extern”声明视为隐藏的编译器。
需要注意的是 -可见性 确实会影响 C++ 模糊链接实体。 这意味着,对于
例如,必须显式标记在 DSO 之间抛出的异常类
具有默认可见性,以便 类型信息 节点在 DSO 之间是统一的。
这些技术、它们的好处以及如何使用它们的概述位于
<http://gcc.gnu.org/wiki/Visibility>.
-fstrict-易失性位域
如果访问易失性位域(或其他结构
字段,尽管编译器通常会尊重这些类型)应该使用单个
访问字段类型的宽度,如果可能,对齐到自然对齐。
例如,具有内存映射外设寄存器的目标可能需要所有这些
访问为 16 位宽; 使用此标志,您可以声明所有外围位域
作为“无符号短”(假设这些目标上的短是 16 位)以强制 GCC 使用
16 位访问,而不是更有效的 32 位访问。
如果禁用此选项,编译器将使用最有效的指令。 在里面
前面的例子,这可能是一个 32 位的加载指令,即使它访问
不包含位域或内存映射寄存器的任何部分的字节
与正在更新的无关。
如果目标需要严格对齐,并且遵守字段类型将需要
违反此对齐方式,将发出警告。 如果该字段具有“打包”属性,
访问是在不遵守字段类型的情况下完成的。 如果该字段没有
“packed”属性,访问是按照字段类型完成的。 在这两种情况下,GCC
假设用户知道一些它不知道的目标硬件。
此选项的默认值由应用程序二进制接口决定
目标处理器。
-fsync-libcalls
此选项控制“__sync”系列的任何外部实例
函数可用于实现 C++11“__atomic”系列函数。
此选项的默认值已启用,因此该选项的唯一有用形式
is -fno-sync-libcalls. 此选项用于实现 原子的
运行时库。
环境
本节描述了几个影响 GCC 运行方式的环境变量。 一些
其中一些通过指定搜索各种类型时使用的目录或前缀来工作
的文件。 有些用于指定编译环境的其他方面。
请注意,您还可以使用以下选项指定要搜索的位置 -B, -I 和 -L.
这些优先于使用环境变量指定的位置,反过来
优先于 GCC 配置指定的那些。
朗
LC_CTYPE
LC_消息
LC_ALL
这些环境变量控制 GCC 使用本地化信息的方式
这允许 GCC 与不同的国家公约一起工作。 GCC 检查区域设置
类别 LC_CTYPE 和 LC_消息 如果它已配置为这样做。 这些语言环境
类别可以设置为您的安装支持的任何值。 典型值为
en_GB.UTF-8 用于以 UTF-8 编码的英国英语。
这款 LC_CTYPE 环境变量指定字符分类。 GCC 使用它来
确定字符串中的字符边界; 这是一些多字节所需要的
包含引号和转义字符的编码,否则会被解释为
字符串结束或转义。
这款 LC_消息 环境变量指定在诊断中使用的语言
消息。
如果 LC_ALL 环境变量已设置,它会覆盖的值 LC_CTYPE 和
LC_消息; 否则, LC_CTYPE 和 LC_消息 默认为 朗
环境变量。 如果没有设置这些变量,GCC 默认为传统的
C 英语行为。
TMPDIR
If TMPDIR 设置后,它指定用于临时文件的目录。 海湾合作委员会使用
用于保存一个编译阶段输出的临时文件,该文件将用作
下一阶段的输入:例如预处理器的输出,即
正确输入到编译器。
GCC_COMPARE_DEBUG
设置 GCC_COMPARE_DEBUG 几乎相当于通过 -fcompare-调试 以及
编译器驱动程序。 有关更多详细信息,请参阅此选项的文档。
GCC_EXEC_PREFIX
If GCC_EXEC_PREFIX 被设置,它指定一个前缀用于名称
编译器执行的子程序。 组合此前缀时不添加斜线
带有子程序的名称,但您可以指定以斜杠结尾的前缀,如果
你的愿望。
If GCC_EXEC_PREFIX 未设置,GCC 尝试找出要使用的适当前缀
基于调用它的路径名。
如果 GCC 找不到使用指定前缀的子程序,它会尝试在
子程序的常用位置。
默认值为 GCC_EXEC_PREFIX is 前缀/lib/gcc/ 哪里 字首 是前缀
安装的编译器。 在很多情况下 字首 是运行时“前缀”的值
配置 脚本。
指定的其他前缀 -B 优先于这个前缀。
此前缀也用于查找文件,例如 crt0.o 用于链接。
此外,前缀以一种不寻常的方式用于查找要搜索的目录
对于头文件。 对于名称通常以开头的每个标准目录
- /usr/本地/库/gcc (更准确地说,值 GCC_INCLUDE_DIR), GCC 尝试
用指定的前缀替换开头以生成备用目录
姓名。 因此,与 -Bfoo/, GCC 搜索 富/酒吧 就在它搜索标准之前
目录 /usr/本地/库/栏. 如果标准目录以配置的
字首 那么值 字首 被替换 GCC_EXEC_PREFIX 寻找标题时
文件。
编译器_路径
价值 编译器_路径 是一个以冒号分隔的目录列表,很像 PATH.
GCC 在搜索子程序时尝试这样指定的目录,如果它不能
使用找到子程序 GCC_EXEC_PREFIX.
图书馆路径
价值 图书馆路径 是一个以冒号分隔的目录列表,很像 PATH.
当配置为本地编译器时,GCC 会尝试这样指定的目录
搜索特殊的链接器文件,如果使用找不到它们 GCC_EXEC_PREFIX.
使用 GCC 链接在搜索普通库时也会使用这些目录
等加工。为 -l 选项(但指定的目录 -L 先来)。
朗
此变量用于将区域设置信息传递给编译器。 一种方式
此信息用于确定字符集时要使用的字符集
文字、字符串文字和注释在 C 和 C++ 中解析。 当编译器是
配置为允许多字节字符,以下值 朗 旨在
认可:
C-JIS标准
识别 JIS 字符。
C-SJIS
识别 SJIS 字符。
欧洲联合委员会
识别 EUCJP 字符。
If 朗 未定义,或者如果它有其他值,则编译器使用“mblen”
和默认语言环境定义的“mbtowc”识别和翻译多字节
字符。
一些额外的环境变量会影响预处理器的行为。
路径
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
每个变量的值是一个由特殊字符分隔的目录列表,很多
喜欢 PATH, 在其中查找头文件。 特殊的性格,
“PATH_SEPARATOR”,取决于目标并且在 GCC 构建时确定。 对于微软
基于 Windows 的目标它是一个分号,对于几乎所有其他目标它是一个
冒号。
路径 指定要搜索的目录列表,就像用 -I,但
在给出的任何路径之后 -I 命令行选项。 这个环境变量
无论预处理哪种语言,都会使用。
其余的环境变量仅在预处理特定
语言表示。 每个都指定要搜索的目录列表,就像
指定为 -ISystem., 但在给定的任何路径之后 -ISystem. 关于的选项
命令行。
在所有这些变量中,一个空元素指示编译器搜索其当前的
工作目录。 空元素可以出现在路径的开头或结尾。 为了
例如,如果值 路径 是“:/special/include”,与
-一世。 -I/特殊/包括.
依赖输出
如果设置了这个变量,它的值指定了如何为 Make based 输出依赖
在编译器处理的非系统头文件上。 系统头文件是
在依赖输出中被忽略。
价值 依赖输出 可以只是一个文件名,在这种情况下 Make 规则
写入该文件,从源文件名猜测目标名称。 或者
值可以具有以下形式 文件 目标,在这种情况下,规则被写入文件 文件
运用 目标 作为目标名称。
换句话说,这个环境变量相当于组合了选项 -MM
和 -MF,有一个可选的 -公吨 也切换。
SUNPRO_DEPENDENCIES
该变量与 依赖输出 (见上文),除了那个系统
头文件不会被忽略,所以这意味着 -M 而非 -MM。 但是,那
省略了对主输入文件的依赖。
使用 onworks.net 服务在线使用 powerpc-linux-gnu-g++-4.8