本节按字母顺序介绍 cc 选项。cc(1) 手册页中也提供了这些说明。使用 cc –flags 选项可获得一行有关这些说明的摘要。
注明特定于一个或多个平台的选项可被接受,且不会出现错误,但在其他所有平台上会被忽略。
启用详细模式,显示命令选项的展开方式。 显示调用的每个组件。
在调用每个组件时进行显示,但实际上并不会执行组件。 还显示命令选项扩展的过程。
将 name 作为谓词与指定的 tokens 相关联,如同使用 #assert 预处理指令一样。 预断言:
system(unix)
machine(sparc) (SPARC)
machine(i386) (x86)
cpu(sparc) (SPARC)
cpu(i386) (x86)
这些预断言在 -pedantic 模式下无效。
后面仅跟随一个短划线 (-) 的 -A 将导致所有预定义宏(以 __ 开头的宏除外)和预定义断言被忽略。
与 -std=c89 等效。
指定用于链接的库绑定是 static 还是 dynamic,可分别指明库是非共享的还是共享的。
可以在一个命令行上多次使用 –B 选项。该选项传递给链接程序 ld(1)。
–Bdynamic 指示链接编辑器查找 liblib.so(共享)文件,如果未找到这些文件,则查找 liblib.a(静态非共享)文件。当链接需要共享库绑定时,请使用该选项。
–Bstatic 指示链接编辑器只查找 liblib.a(静态非共享)文件。当链接需要非共享库绑定时,请使用该选项。
在 –B 与 static 或 dynamic 值之间不允许有空格。
如果未指定 –B,则采用 –Bdynamic。
–Bstatic 和 –Bdynamic 选项会影响缺省情况下提供的库的链接。为了确保动态链接缺省库,最后使用的 –B 应该是 –Bdynamic。
以下编译器命令将链接 libfoo.a,即使 libfoo.so 存在时也是如此,其他所有库都是动态链接的:
example% cc prog.c -Bstatic -lfoo -Bdynamic
如果使用 –Bsymbolic,不同模块中的引用会绑定到应是一个全局对象内容的不同副本。
异常机制依赖对地址的比较。如果某项内容有两个副本,它们地址的比较结果不相同,这样异常机制可能会失败,这是由于异常机制依赖于比较的内容应该是唯一地址。
如果在不同的步骤中进行编译和链接,并要使用 –Bbinding 选项,则必须在链接步骤中包括该选项。
-staticlib=[no%]sunperf、ld(1)、Oracle Solaris 11.3 链接程序和库指南
指示 C 编译器 用 ld(1) 抑制链接并为每个源文件生成一个 .o 文件。您可使用 -o 选项显式指定单个对象文件。当编译器生成每个 .i 或 .c 输入文件的对象代码时,始终会在当前工作目录中创建一个对象 (.o) 文件。如果抑制链接步骤,将会同时抑制删除对象文件。
使用可选参数定义宏,如同使用 #define 预处理指令定义宏一样。 如果未指定 =expansion,编译器将采用 1。
有关编译器预定义宏的列表,请参见 cc(1) 手册页。
-dn 指定链接编辑器中的静态链接。
此选项及其参数将传递给 ld(1)。
(SPARC) 已过时。您不该使用此选项。改用 -xmemalign=8s。有关更多信息,请参见-xmemalign=ab。有关已过时选项的完整列表,请参见已过时选项。在 x86 平台上会在无提示的情况下忽略此选项。
仅通过预处理程序运行源文件并将输出发送给 stdout。 预处理程序直接构建到编译器中,但在 -Xs 模式下除外,在该模式下会调用 /usr/ccs/lib/cpp。包含预处理程序行号信息。另请参见 -P 选项的描述。
如果要将字符串 "error:" 作为前缀添加到错误消息开头以将错误消息与警告消息相区分,可使用此选项。此前缀也可附加到通过 -errwarn 转换成错误的警告。
|
如果您未指定此选项,则编译器将其设置为 -errfmt=no%error。如果指定了 –errfmt 但未提供值,则编译器会将其设置为 -errfmt=error。
将来自头文件的警告限制为由下表中的标志所指示的头文件组:
|
此命令抑制 C 编译器警告消息,但对错误消息没有影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。下表列出了 -erroff 值。
|
缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。
-erroff 选项只能抑制来自 C 编译器并在使用 -errtags 选项时显示标记的警告消息。您可以更好地控制错误消息抑制。请参见error_messages。
使用此选项可控制当编译器发现类型不匹配时生成的错误消息的详细程度。 当编译器发现涉及到大聚集的类型不匹配时,此选项特别有用。
i 可以为下表中所列出的值之一。
|
如果不指定 -errshort,编译器会将该选项设置为 -errshort=full。如果指定了 -errshort 但未提供值,则编译器会将此选项设置为 -errshort=tags。
该选项不会累积。它接受命令行中指定的最后一个值。
显示来自 C 编译器且可以使用 -erroff 选项抑制或使用 -errwarn 选项使其成为致命错误的每个警告消息的消息标记。 来自 C 编译器驱动程序以及 C 编译系统其他组件的消息不带错误标记,使用 -erroff 选项并不能抑制这些消息,而使用 -errwarn 选项也不会产生致命错误。
a 可以是 yes 或 no。缺省值为 -errtags=no。指定 -errtags 与指定 -errtags=yes 等效。
使用 -errwarn 选项可以在出现指定的警告消息时使 C 编译器退出,并指示故障状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序很重要,例如如果出现除 tag 之外的任何警告,%all,no%tag 会使 cc 以致命状态退出。
由于编译器错误检查的改善和功能的增加,C 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版中编译时也可能出现错误。
只有来自 C 编译器在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C 编译器以失败状态退出。
下表详细列出了 -errwarn 值:
|
缺省值为 -errwarn=%none。单独指定 -errwarn 与 -errwarn=%all 等效。
此选项是一个宏,该宏可有效地用作调整可执行文件以取得最佳运行时性能的起点。 -fast 选项宏随编译器发行版的升级而变化,并扩展为目标平台特定的多个选项。可使用 -# 选项或 -xdryrun 检查 -fast 的扩展选项,并将 -fast 的相应选项结合到正在进行的可执行文件优化过程中。
-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见-xlibmopt。
-fast 选项会影响 errno 的值。 有关更多信息,请参见保留 errno 的值。
用 -fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见编译时选项和链接时选项。
–fast 选项不适于计划在编译机器之外的其他目标机器上运行的程序。在这种情况下,请在 -fast 后附带相应的 -xtarget 选项。例如:
cc -fast -xtarget=generic ...
对于依赖于 SUID 指定的异常处理的 C 模块,请在 -fast 后附带 -xnolibmil:
% cc -fast -xnolibmil
使用 -xlibmil 时,无法通过设置 errno 或调用 matherr(3m) 来标记异常。
–fast 选项不适于要求严格遵守 IEEE 754 标准的程序。
下表列出了 -fast 在各平台中选择的选项集。
|
由这些选项执行的优化可能会改变由 ISO C 和 IEEE 标准定义的程序的行为。有关详细信息,请参见特定选项的描述。
-fast 标志的作用与命令行上的宏扩展相同。因此,您可以通过在 -fast 后附带预期的优化级别或代码生成选项来覆盖优化级别和代码生成选项。使用 -fast -xO4 对进行编译类似于使用 -xO2 -xO4 对进行编译。后者优先。
在 x86 上,-fast 选项包括 -xregs=frameptr。有关详细信息,特别是编译混合 C、Fortran 和 C++ 源代码时,请参见该选项的介绍。
请勿对依赖于 IEEE 标准异常处理的程序使用此选项;否则会产生不同的数值结果、程序提前终止或意外的 SIGFPE 信号。
要在运行的平台上查看 —fast 的实际扩展,请使用以下命令:
% cc -fast -xdryrun |& grep ###
|
旧的 C 和 C++ 对象(使用本发行版之前的 Studio 编译器创建的对象)可以与新的 C 和 C++ 对象链接,而不会更改旧对象的行为。要获得标准的符合规范的行为,您必须使用当前编译器重新编译旧代码。
typeof(int) i;/* declares variable "i" to be type int*/ typeof(i+10) j;/* declares variable "j" to be type int, the type of the expression */ i = sizeof(typeof(j)); /* sizeof returns the size of the type associated with variable "j" */ int a[10]; typeof(a) b;/* declares variable "b" to be array of size 10 */
typeof 运算符在宏定义(其中参数可以是任意类型)时特别有用。例如:
#define SWAP(a,b) { typeof(a) temp; temp = a; a = b; b = temp; }
|
如果未指定 -flteval,编译器会将其设置为 -flteval=any。如果指定了 -flteval 但未提供值,则编译器会将其设置为 -flteval=2。
-flteval=2 只能与 -xarch=sse、pentium_pro、ssea 或 pentium_proa 一起使用。此外,-flteval=2 还与 -fprecision 或 -nofstore 选项组合不兼容。
另请参见浮点计算器的精度。
启用自动生成浮点混合乘加指令。–fma=none 禁用这些指令的生成。–fma=fused 允许编译器通过使用浮点混合乘加指令,尝试寻找改进代码性能的机会。
缺省值是 –fma=none。
要生成混合乘加指令,最低体系结构要求是 –xarch=sparcfmaf(对于 SPARC)和 -xarch=avx2(对于 x86)。如果生成了混合乘加指令,编译器会标记此二进制程序,以防止该程序在不支持混合乘加指令的平台上执行。如果未使用最低体系结构,则 -fma=fused 不起作用。
混合乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 –fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。
此选项是用于 -fns 和 -ftrap=common 的宏。
在 SPARC 平台上,此选项用于启用非标准浮点模式。
对于 x86 平台,此选项用于选择 SSE 刷新为零模式以及非正规数为零模式(如果可用),从而导致将次正规结果刷新为零;如果可用的话,此选项还会导致将次正规操作数视为零。此选项对不使用 SSE 或 SSE2 指令集的传统 x86 浮点运算没有影响。
缺省值为 -fns=no,即标准浮点模式。-fns 与 -fns=yes 相同。
可以选择使用 =yes 或 =no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。
在一些 SPARC 系统上,使用非标准浮点模式会禁用“渐进下溢”,导致将微小的结果刷新为零,而不是产生非正规数。它还导致次正规操作数被替换为零而无提示。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。
在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。有关更多信息,请参见Oracle Developer Studio 12.5:数值计算指南。
在 SPARC 系统上,只有编译主程序时此选项才有效。
与 -xopenmp=parallel 相同。
与 -KPIC 等效。
与 -Kpic 等效。
–fprecision={single, double, extended}
(x86) 将浮点控制字中的舍入精度模式位分别初始化为 single(24 位)、double(53 位)或 extended(64 位)。缺省的浮点舍入精度模式为 extended。
注意,在 x86 中,浮点舍入精度模式的设置只影响精度,不影响指数、范围。
该选项仅在 x86 系统上且仅在编译主程序时才有效,但如果编译 64 位 (-m64) 或 SSE2 启动的 (-xarch=sse2) 处理器,忽略此选项。在 SPARC 系统上也忽略此选项。
设置程序初始化期间在运行时建立的 IEEE 754 舍入模式。
r 必须是以下值之一:nearest、tozero、negative、positive。
缺省值为 -fround=nearest。
含义与 ieee_flags 子例程的含义相同。
如果 r 为 tozero、negative 或 positive,此标志将在程序开始执行时分别将舍入方向模式设置为舍入到零、舍入到负无穷大或舍入到正无穷大。当 r 为 nearest 或未使用 -fround 标志时,舍入方向模式将保留其初始值不变(缺省为舍入到最接近的值)。
只有编译主程序时该选项才有效。
编译器缺省采用 -fsimple=0。指定 -fsimple 与指定 -fsimple=1 等效。
如果存在 n,它必须是 0、1 或 2。
|
即使使用 -fsimple=2,也不允许优化器在不产生任何内容的程序中引入浮点异常。
有关优化对精度的影响的更详细说明,请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance Computing》。
(仅限 -Xt 和 -Xs 模式)缺省情况下,-Xs 和 -Xt 会遵循 float 表达式的 K&R C 规则,将它们提升为 double 并以双精度对其求值。 指定 -Xs 或 -Xt 时使用 -fsingle 可使编译器将 float 表达式求值为单精度值。
(x86) 将表达式或函数赋值给一个变量时或将表达式强制转换为短浮点类型时,该命令可使编译器将浮点表达式或函数的值转换为赋值语句左侧的类型,而不是在寄存器中保留值。 由于舍入和截尾,结果可能会与使用寄存器值生成的结果不同。这是缺省模式。
使用 -nofstore 标志可以禁用此选项。
设置启动时生效的 IEEE 捕获模式,但不安装 SIGFPE 处理程序。 可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。
t 可以为下表中所列出的值之一。
|
请注意,no% 前缀仅用于修改 %all 和 common 值的含义,且必须与其中的一个值一起使用,如以下示例所示。no% 前缀不会显式导致禁用特定的陷阱。
如果未指定 –ftrap,则编译器假定 –ftrap=%none。
示例:–ftrap=%all,no%inexact 会设置所有陷阱,但 inexact 除外。
如果使用 -ftrap=t 编译一个例程,则应使用同一选项编译该程序的所有例程,以免出现意外结果。
使用 -ftrap=inexact 陷阱时务必谨慎。只要浮点值不能精确表示,使用 – ftrap=inexact 便会产生自陷。例如,以下语句就会产生这种情况:
x = 1.0 / 3.0;
只有编译主程序时该选项才有效。请小心使用该选项。要启用 IEEE 陷阱,请使用 -ftrap=common。
生成共享对象而非动态链接的可执行文件。 此选项将传递给 ld(1),并且不能与 -dn 选项一起使用。
使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 选项。
如果通过指定 -G 以及其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在与生成的共享对象链接时也指定这些选项。
创建共享对象时,用 -m64 编译的所有 64 位 SPARC 对象文件还必须用显式 -xcode 值(如-xcode[=v]中所述)进行编译。
生成附加的符号表信息,以供使用 dbx(1) 和性能分析器 analyzer(1) 进行调试。
如果指定 -g,并且优化级别为 -xO3 或更低,则编译器提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。
如果指定 -g,并且优化级别为 -xO4,则编译器提供进行全面优化的最佳效果符号信息。
使用 -g 选项进行编译,以使用性能分析器的全部功能。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和Oracle Developer Studio 12.5:性能分析器。
使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。
-g 作为宏实施,扩展到多个其他更原始的选项。有关扩展的详细信息,请参见 -xdebuginfo。
生成标准调试信息。
不生成任何调试信息。这是缺省值。
生成文件和行号以及在事后调试期间视为至关重要的简单参数信息。
与 -g 相同。
生成附加调试信息,当前只包括宏定义信息。与仅使用 -g 相比,此附加信息会增大生成的 .o 和可执行文件中调试信息的大小。
有关调试的更多信息,请参见《使用 dbx 调试程序》手册。
打印到标准错误,每行一个错误,包含当前编译期间每个文件的路径名。 这样输出的目的是显示包含在其他文件中的文件。
在以下示例中,程序 sample.c 包含文件 stdio.h 和 math.h。math.h 包含文件 floatingpoint.h,该文件本身还包含使用 sys/ieeefp.h 的函数。
% cc -H sample.c /usr/include/stdio.h /usr/include/math.h /usr/include/floatingpoint.h /usr/include/sys/ieeefp.h
为共享动态库分配一个名称,从而可以获得不同版本的库。name 应与 -o 选项提供的文件名相同。-h 和 name 之间的空格是可选的。
链接程序会为该库分配指定的 name,并在库文件中将该名称记录为库的内部名称。 如果 -hname 选项不存在,则库文件中不记录任何内在名称。
当运行时链接程序将库装入可执行文件时,会将内部名称从库文件复制到可执行文件的所需共享库文件列表中。每个可执行文件都有这样的列表。如果未提供共享文件的内部名称,链接程序就会复制共享库文件的路径。
-I dir 将 dir 添加到在其中搜索 #include 文件(/usr/include 前是相对文件名)的目录列表中,也就是说,这些目录路径不以 /(斜线)开头。
以指定的顺序搜索多个 -I 选项的目录。
有关编译器搜索模式的更多信息,请参见使用 -I- 选项更改搜索算法。
将选项传递给链接程序,以忽略任何 LD_LIBRARY_PATH 或 LD_LIBRARY_PATH_64 设置。
此选项使编译器将 filename 视为作为 #include 预处理程序指令出现在主源文件的第一行。考虑源文件 t.c:
main() { ... }
如果使用命令 cc -include t.h t.c 编译 t.c,则编译时好像源文件包含以下项:
#include "t.h" main() { ... }
编译器首先会在当前工作目录而不是包含主源文件的目录中搜索 filename,这与显式包括某个文件时的情况相同。例如,下面的目录结构包含两个名称相同但位置不同的头文件:
foo/ t.c t.h bar/ u.c t.h
如果您的工作目录是 foo/bar,并且您使用命令 cc ../t.c -include t.h 进行编译,则编译器会包括 foo/bar 中的 t.h 而不是 foo/ 中的此文件,后者是源文件 t.c 内包含 #include 指令时的情况。
如果编译器在当前工作目录中找不到使用 –include 指定的文件,则会在正常目录路径中搜索该文件。如果您指定多个 –include 选项,则文件的包括顺序与它们在命令行中的显示顺序相同。
(SPARC) 已过时。您不该使用此选项。改用 -xcode=pic32。
有关更多信息,请参见-xcode[=v]。有关已过时选项的完整列表,请参见已过时选项。
(SPARC) 已过时。您不该使用此选项。改用 -xcode=pic13。有关更多信息,请参见-xcode[=v]。有关已过时选项的完整列表,请参见已过时选项。
(x86) 生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。
将 dir 添加到通过 ld(1) 在其中搜索库的目录列表中。 此选项及其参数将传递给 ld(1)。
与对象库 libname .so 或 libname.a 链接。 库在命令中的顺序很重要,因为符号是从左向右进行解析。
此选项必须位于 sourcefile 参数之后。
与 Oracle Developer Studio 性能库进行链接。
指定编译的二进制对象的数据类型模型。
使用 –m32 来创建 32 位可执行文件和共享库。使用 –m64 来创建 64 位可执行文件和共享库。
使用 –m32 编译的对象文件或库无法与使用 –m64 编译的对象文件或库链接。
使用 –m64 编译具有大量静态数据的应用程序时,可能还需要 –xmodel=medium。请注意,部分 Oracle Linux 平台不支持 medium 模型。
使用 –m32|–m64 编译的模块必须还使用 –m32 |–m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见编译时选项和链接时选项。
在 Oracle Solaris 上,–m32 为缺省值。在 Oracle Linux 系统上,–m64 是缺省值。
另请参见 –xarch 的描述。
从对象文件的 .comment 部分中删除重复字符串。 使用 -mc 标志时,会调用 mcs -c。
(SPARC) 已过时。您不该使用此选项。应改用 -xmemalign=1i 选项。有关更多信息,请参见-xmemalign=ab。有关已过时选项的完整列表,请参见已过时选项。
(SPARC) 已过时。您不该使用此选项。应改用 –xmemalign=2i 选项。有关更多信息,请参见-xmemalign=ab。有关已过时选项的完整列表,请参见已过时选项。
-mr 可从 .comment 部分中删除所有字符串。 使用此标志时,会调用 mcs -d -a。
-mr,string 可从 .comment 部分中删除所有字符串,并在对象文件的该部分插入 string。如果 string 包含嵌入空白,则必须将其括入引号。空 string 将导致 .comment 部分为空。此选项将作为 -d -astring 传递给 mcs。
使用此选项编译和链接多线程代码。
此选项将 -D_REENTRANT 传递给预处理程序。
-mt=yes 是编译器的缺省行为。-mt 等效于 -mt=yes。如果不想出现该行为,请使用选项 -mt=no。
-xopenmp 选项和 -xautopar 选项自动包括 -mt=yes。
请以一致的方式使用此选项。如果使用 –mt 编译和链接一个转换单元,则必须使用 –mt 编译和链接该程序的所有单元。
要确定在缺省情况下将链接哪些系统支持库,请使用 –dryrun 选项进行编译。
另请参见-xnolib、Oracle Solaris Multithreaded Programming Guide和Oracle Solaris 11.3 链接程序和库指南。
(x86) 在将浮点表达式或函数赋值给一个变量或转换为短浮点类型时,不将该表达式或函数的值转换为赋值左侧的类型, 而将该值保留在寄存器中。另请参见-fstore。
-xO3 优化级别会提高运行时性能。但是,对于依赖于被自动视为 volatile 的所有变量的程序,这可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的旧版多线程应用程序。解决方法是用 -xO2 而不是 -O 进行编译。
将输出文件命名为 filename 而非缺省的 a.out。filename 不能与输入源文件相同,因为编译器不会覆盖源文件。
filename 必须具有合适的后缀。在与 —c 一起使用时,filename 指定目标 .o 对象文件;在与 —G 一起使用时,它指定目标 .so 库文件。此选项及其参数传递给链接程序 ld。
仅通过 C 预处理程序运行源文件。 然后将输出放在带有 .i 后缀的文件中。与 -E 不同,此选项不在输出中包括预处理程序类型的行号信息。另请参见 -E 选项。
此选项现在已过时。改用-xpg。
严格遵循非 ANSI 构造的错误/警告。-std 标志可用于指定生效的 ANSI 标准。-Xc、-Xa、-Xt、-Xs 和 -xc99 标志不能与 -pedantic 标志一起指定。这样做会导致编译器发出错误。
未指定 -pedantic 选项时的缺省值为 -pedantic=no。
-pedantic 与 -pedantic=yes 等效。
如果指定了 none 或者如果未在命令行上指定 -preserve_argvalues 选项,则编译器行为像往常一样。
指定 simple 时,最多保存六个整数参数。
指定 complete 时,堆栈跟踪中所有函数参数的值按正确顺序显示给用户。
对于形式参数的赋值,值在函数生命周期内不会更新。
要传递多个选项,按照逗号分隔列表的顺序指定它们。可以对使用 -Qoption 传递给组件的选项进行重新排序。驱动程序识别的选项将按正确顺序排列。对于驱动程序已识别的选项,请勿使用 -Qoption。
phase 可以为以下列表中的值之一。
编译器
代码生成器 (SPARC)
预处理程序
cc 驱动程序
汇编程序
过程间优化器
静态错误检查
优化器
链接编辑器 (ld)
mcs-在指定了 —mc 或 —mr 时处理对象文件的注释部分。
后优化器
代码生成器 (x86)
另请参见可提供等效功能的 —Wc, arg。提供 —Qoption 是为了与其他编译器兼容。
如果使用 -Qy,则将关于每个调用的编译工具的标识信息添加到输出文件的 .comment 部分,使用 mcs 可访问这部分文件。此选项对软件管理十分有用。
-Qn 可抑制此信息。
将用于指定库搜索目录的以冒号分隔的目录列表发送给运行时链接程序。 如果该目录列表存在且非空,则会将其记录在输出对象文件中并传递给运行时链接程序。
如果同时指定了 LD_RUN_PATH 和 -R 选项,则 -R 选项优先。
指示 cc 生成汇编源文件,而不汇编或链接程序。 汇编程序语言输出将写入后缀为 .s 的对应文件。
从输出对象文件中删除所有符号调试信息。此选项不能与 -g 一同指定。
传递给 ld(1)。
与 -library=sunperf 一起使用时,-staticlib=sunperf 将与 Sun 性能库静态链接。缺省情况下,如果指定了 -library=no%sunperf,-library=sunperf 会导致动态链接 Sun 性能库。
为了与 CC 兼容,%all 和 %none 也是 -staticlib 接受的值,其中 %all 等效于 sunperf,%none 等效于 no%sunperf。
value 是必需的并且定义为下列项之一:
接受的由 ISO C90 标准定义的 C 源代码语言。
接受的由 ISO C99 标准定义的 C 源代码语言。
接受的由 ISO C11 标准定义的 C 源代码语言。
–std 缺省设置为 c11。
如果指定了标志 -Xc、-Xa、-Xt 或 -xtransition 中的任何一个,则 -std 的缺省值不会生效,编译器缺省采用 -xc99=all,no_lib。如果指定了 -Xs,则 –std 缺省值不会生效,编译器缺省采用 -xc99=none。如果指定了 -xc99,则 -std 的缺省值不会生效,编译器采用的值由 -xc99 标志指定。
如果指定了 -std 标志,则无法使用 -Xc、-Xa、-Xt、-Xs 和 -xc99 标志。这样做会导致编译器发出错误。
如果在不同的步骤中编译和链接,则必须在两个步骤中为 -std 标志使用相同的值。
为临时文件定义目录。
该选项设置目录的路径名称,用于存储在编译过程中生成的临时文件。对于 –temp 设置的值和 TMPDIR 值,编译器优先采用前者。
–keeptmp
在执行中出现严重错误时发出堆栈跟踪。
当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出堆栈跟踪、转储信息并退出。如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪。
要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,但除非生成可执行二进制文件,否则将忽略该选项。使用 -traceback 和 -G 创建共享库是个错误。
|
如果不指定该选项,则缺省值为 -traceback=%none。
只使用 -traceback 而不使用 = 信号表示 -traceback=common。
如果您不需要信息转储,请将 coredumpsize 限制设置为零,如下所示:
% limit coredumpsize 0
-traceback 选项不影响运行时性能。
取消定义预处理程序符号 name。 此选项可删除由 -D 在同一命令行上创建的预处理程序符号 name 的任何初始定义,包括由命令行驱动程序放置在此的定义。
-U 对源文件中的预处理程序指令没有任何影响。可以在命令行上指定多个 -U 选项。
如果在命令行中为 -D 和 -U 指定了相同的 name,则会取消定义 name,而不管这些选项出现的顺序如何。在以下示例中,-U 取消定义 __sun:
cc -U__sun text.c
由于已取消定义 __sun,因此在 test.c 中采用以下形式的预处理程序语句将不会生效。
#ifdef(__sun)
有关预定义符号的列表,请参见-Dname[(arg[,arg])][=expansion]。
指示编译器执行更严格的语义检查并启用其他类似 lint 的检查。 例如,以下代码在编译和执行时不会出现问题。
#include <stdio.h> main(void) { printf("Hello World.\n"); }
使用 -v 选项,该代码仍会进行编译。但是,编译器将显示以下警告:
"hello.c", line 5: warning: function has no return statement: main
-v 不能给出 lint(1) 给出的所有警告。您可以通过 lint 运行以上示例来了解差异。
将参数 arg 传递给指定的组件 c。 有关组件的列表,请参见表 1。
前后参数之间只能用逗号分隔。所有 -W 参数均在其余的命令行参数之后进行传递。要在参数中包括逗号,请在紧靠逗号之前使用转义符 \(反斜杠)。所有 -W 参数均在常规命令行参数之后进行传递。
例如,-Wa,-o,objfile 按顺序将 -o 和 objfile 传递给汇编程序。此外,-Wl,-I,name 将导致链接阶段覆盖动态链接程序的缺省名称 /usr/lib/ld.so.1。
这些参数相对于其他指定的命令行选项传递给工具的顺序可能会更改后续的编译器发行版。
下表列出了 c 的可能值。
|
请注意,您不能使用 -Wd 将 cc 选项传递给 c 编译器。
此选项等效于选项 –erroff=%all。
如果指定了 -std 或 -xlang 标志,则无法使用 -Xc、-Xa、-Xt 和 -Xs 标志。
不使用 -std 标志时,-X(注意 X 大写)选项可指定符合 1990 和 1999 ISO C 标准的各种级别。-xc99 的值影响 -X 选项所应用的 ISO C 标准的版本。-xc99 选项的缺省值为支持 1999 ISO/IEC C 标准的 -xc99=all。-xc99=none 支持 1990 ISO/IEC C 标准。有关受支持的 1999 ISO/IEC 功能的讨论,请参见D.1。有关 ISO/IEC C 与 K&R C 之间差异的讨论,请参见附录 H。
如果不使用 -pedantic 标志,则编译器的缺省模式为 -std=c11。如果 -xc99 标志已指定或生效,则 -Xa 是编译器的缺省模式。
(c =一致性)对使用非 ISO C 构造的程序发出错误和警告。此选项与 ISO C 严格一致,没有 K&R C 兼容性扩展。
ISO C 以及 K&R C 兼容性扩展,具有 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果 -Xa 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。
(t = 过渡)–Xt 选项在将来的发行版中会被删除。建议正确迁移需要使用 –Xt 进行构建和编译的 C 代码,以至少符合 ISO C 标准的 C99 版本 (dialect),即与 –std=c99 兼容。
此选项使用 ISO C plus K&R C 兼容性扩展,不带 ISO C 要求的语义更改。 如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 K&R C 解释。如果将 -Xt 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。
(s = K&R C) 在将来的发行版中,-Xs 选项将需要 –E。建议正确迁移需要使用 -Xs 进行构建和编译的 C 代码,以至少符合 ISO C 标准的 C99 版本 (dialect),即与 -std=c99 兼容。
尝试对在 ISO C 与 K&R C 之间具有不同行为的所有语言构造发出警告。编译器语言包含与 K&R C 兼容的所有功能。此选项调用 cpp 进行预处理。
(x86) 已过时。您不该使用此选项。改用 -xchip=generic。有关已过时选项的完整列表,请参见已过时选项。
(x86) 已过时。您不该使用此选项。改用 -xchip=generic。有关已过时选项的完整列表,请参见已过时选项。
将 arg 传递给链接程序 ld(1)。
(仅限 Oracle Solaris x86/x64)-xaddr32=yes 编译标志将生成的可执行文件或共享对象限定为 32 位地址空间。
以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。
指定 -xaddr32=no 时,会生成常见的 64 位二进制文件。
如果未指定 -xaddr32 选项,则假定 -xaddr32=no。
如果仅指定了 -xaddr32,则假定 -xaddr32=yes。
此选项仅适用于 -m64 编译,并且仅在支持 SF1_SUNW_ADDR32 软件功能的 Oracle Solaris 平台上适用。由于 Oracle Linux 内核不支持地址空间限制,此选项在 Oracle Linux 上不可用。
链接时,如果单个对象文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。
限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。
有关更多信息,请参阅Oracle Solaris 11.3 链接程序和库指南中介绍的 SF1_SUNW_ADDR32 软件功能定义。
编译器使用 -xalias_level 选项确定为了使用基于类型的别名分析执行优化可以进行何种假设。 此选项使指定的别名级别对正在编译的转换单元生效。
如果不指定 -xalias_level 命令,编译器将假定 -xalias_level=any。如果指定不带值的 -xalias_level,则缺省值为 -xalias_level=layout。
-xalias_level 选项要求的优化级别为 -xO3 或更高。如果优化级别设置较低,则发出警告并忽略 -xalias_level 选项。
切记,如果使用 -xalias_level 选项,但无法坚持为任何别名级别描述的关于别名的所有假定和约束,则程序的行为未定义。
将 l 替换为下表中的某一术语。
(已过时)在以后的发行版中将删除此选项。请改用 -xprevise。
生成能使用Oracle Developer Studio 12.5:代码分析器用户指南查看的源代码静态分析。
使用 —xanalyze=code 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 —xanalyze=code。
缺省值为 —xanalyze=%none。
在 Oracle Linux 上,需要指定 -xanalyze=code 和 -xannotate。
有关更多信息,请参见Oracle Developer Studio 12.5:代码分析器用户指南。
创建可供优化和监测工具 binopt(1)、code-analyzer(1)、discover(1)、collect(1) 和 uncover(1) 以后使用的二进制文件。
在 Oracle Solaris 上的缺省值为 -xannotate=yes。在 Oracle Linux 上的缺省值为 -xannotate=no。指定不带值的 -xannotate 等效于 -xannotate=yes。
要最好地利用优化和监测工具,在编译和链接时都必须采用 -xannotate=yes。如果不使用优化和监测工具,则使用 -xannotate=no 进行编译和链接可来生成略小的二进制文件和库。
指定目标指令集体系结构 (instruction set architecture, ISA)。
该选项将编译器生成的代码限制为特定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用此选项可能会影响二进制程序的可移植性。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
指定 _asm 语句或通过 .il 内联模板文件(使用特定于体系结构的指令)进行编译时,可能需要指定合适的 -xarch 值以免出现编译错误。
下表列出了 SPARC 和 x86 平台通用的 -xarch 关键字。
|
下表介绍了 SPARC 平台上的 -xarch 关键字。
|
另请注意:
使用 generic, sparc, sparcvis2, sparcvis3, sparcfmaf, sparcima 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行。
对于任何特定选择,生成的可执行文件在传统体系结构中可能不运行或运行缓慢。而且,由于所有指令集体系结构中均未实现四精度 (long double) 浮点指令,因此编译器不在其生成的代码中使用这些指令。
下表列出了 x86 平台上的 -xarch 标志。
|
如果在 x86 平台上使用 —m64 编译或链接了某个程序的任意部分,则该程序的所有部分也都必须使用这些选项之一进行编译。有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel 64 和 IA-32《Architectures Software Developer Manuals》,网址为 http://www.intel.com。
另请参见x86 特殊注意事项和二进制兼容性验证。
尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 –xarch 值。例如,-xtarget=T3 可扩展为 -xarch=sparcvis3 -xchip=T3 -xcache=8/16/4:6144/64/24。在以下命令中,-xarch=sparc4 覆盖了由 -xtarget=T3 的扩展设置的 -xarch=sparcvis3。
example% cc -xtarget=T3 -xarch=sparc4 foo.c
如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
a 必须是以下值之一:
与 Oracle Developer Studio 捆绑的 libstatomic 库进行链接。
链接 /usr/lib 中的 libatomic 库。
不链接任何原子支持库。
既不指定 –latomic 也不指定 –xatomic 时,选项 –xatomic=none 为缺省值。
–latomic 将自动转换为 –xatomic=studio。
显式 –xatomic 选项应覆盖存在的 –latomic,而不管在命令行上的顺序为何。如果 –xatomic 的设置与 –latomic 相冲突,将发出一条警告消息。
C 编译器缺省情况下支持原子,但缺省情况下不与原子运行时支持库链接。要使用原子,您可能需要使用 –xatomic 选项将您的程序与原子运行时支持库链接。
有关选择适合您的应用程序的原子运行时库的更多信息,请参见Oracle Developer Studio 12.5:C++ 用户指南 中的 捆绑的原子库。
为循环启用自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高,则将优化级别提高到 -xO3 并发出警告。
如果要进行自己的线程管理,请勿使用 -xautopar。
要达到更快的执行速度,该选项需要具有多个硬件线程的系统。使用 OMP_NUM_THREADS 或 PARALLEL 环境变量可指定要使用的线程数。有关这些环境变量及其缺省值的信息,请参阅Oracle Developer Studio 12.5:OpenMP API 用户指南。
为了获得最佳性能,用于执行并行区域的线程数不应超出计算机上的可用硬件线程(或虚拟处理器)数量。在 Oracle Solaris 系统上,可以使用 psrinfo(1M) 命令确定此数量。在 Oracle Linux 系统上,可以检查 /proc/cpuinfo 文件来确定此数量。
如果使用 -xautopar 且在一个步骤中进行编译和链接,则进行链接时会自动包括 OpenMP 运行时支持库 (libmtsk.so) 和线程安全的 C 运行时库。如果使用 -xautopar 并在不同的步骤中进行编译和链接,则还必须使用 -xautopar 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
(SPARC) 此选项现在已过时,将在以后的编译器发行版中删除。请参见-xannotate[=yes|no]。
指示编译器准备二进制文件,以便以后进行优化、转换和分析。 此选项可用于生成可执行文件或共享对象。此选项必须与 -xO1 或更高的优化级别一起使用时才有效。使用此选项生成二进制文件时,文件大小会有所增加。
如果在不同的步骤中进行编译,则在编译步骤和链接步骤中都必须有 -xbinopt:
example% cc -c -xO1 -xbinopt=prepare a.c b.c example% cc -o myprog -xbinopt=prepare a.o
如果有些源代码不可用于编译,仍可使用此选项来编译其余代码。然后,应将其用于可创建最终库的链接步骤中。在此情况下,只有用此选项编译的代码才能进行优化、转换或分析。
使用 -xbinopt=prepare 和 -g 编译会将调试信息包括在内,从而增加可执行文件的大小。缺省值为 -xbinopt=off。
有关更多信息,请参见 binopt(1) 手册页。
使用 -xbuiltin 选项可改进调用标准库函数的代码的优化。 很多标准库函数(例如在 math.h 和 stdio.h 中定义的函数)通常由多个程序使用。-xbuiltin 选项使编译器可在对性能有益时替换内部函数或内联系统函数。有关如何读取对象文件中的编译器注释来确定编译器实际对哪些函数进行替换的说明,请参见 er_src(1) 手册页。
请注意,这些替换会使 errno 的设置变得不可靠。 如果您的程序依赖于 errno 的值,请不要使用此选项。另请参见保留 errno 的值。
-xbuiltin=%default 仅内联未设置 errno 的函数。errno 的值在任何优化级别上都始终是正确的,并且可以可靠地检查。对于 -xO3 或更低级别的 -xbuiltin=%default,编译器将确定哪些调用对内联有益,并且不内联其他函数。-xbuiltin=%none 选项可禁用库函数的所有替换。
如果没有指定 -xbuiltin,则在以优化级别 -xO1 或更高级别进行编译时缺省值为 -xbuiltin=%default,而在以 -xO0 级别进行编译时,缺省值为 -xbuiltin=%none。如果指定不带参数的 -xbuiltin,则缺省值为 -xbuiltin=%all,并且编译器会更加主动地替换内部函数或内联标准库函数。
如果使用 -fast 进行编译,则 -xbuiltin 设置为 %all。
当指定 -std=c89 和 -xCC 时,编译器将接受 C++ 样式注释。 特别是,可使用 // 指示注释的开始。
-xc99 选项可控制编译器识别根据 C99 标准(ISO/IEC 9899:1999 C 编程语言)实现的功能。
下表列出了 o 的可接受值。可以用逗号分隔多个值。
|
如果未指定 -xc99,编译器缺省采用 -xc99=all,no_lib。如果指定了 -xc99,但没有指定任何值,该选项将设置为 -xc99=all。
如果已指定 -std 或 -xlang 标志,则不能使用 -xc99 标志。
定义可供优化器使用的缓存属性。 此选项不保证使用每个特定的缓存属性。
可选属性 [/ti] 用于设置可以共享高速缓存的线程数。如果没有为 t 指定值,则缺省值为 1。
c 必须是以下值之一:
generic
native
s1/l1/a1[/t1]
s1/l1/a1[/t1]:s2/l2/a2[/t2]
s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
s/l/a/t 属性定义如下:
级别为 i 的数据高速缓存的大小,以千字节为单位
级别为 i 的数据高速缓存的行大小,以字节为单位
级别为 i 的数据高速缓存的关联性
共享级别为 i 的缓存的硬件线程数
下表列出了 -xcache 值。
|
示例: -xcache=16/32/4:1024/32/1 指定以下内容:
级别 1 高速缓存具有:
16 千字节
32 字节行大小
四向关联性
级别 2 高速缓存具有:
1024 字节
32 字节行大小
直接映射关联性
(SPARC) 已过时。您不该使用此选项。使用此选项编译生成的代码在当前的 SPARC 平台中运行较慢。应改用 -O,并利用 -xarch、-xchip 和 -xcache 的编译器缺省值。
提供此选项只是为了方便从 char 类型定义为 unsigned 的系统中迁移代码。 如果不是从这样的系统中迁移,最好不要使用该选项。只有依赖 char 类型符号的代码才需要重写,以便显式指定 signed 或 unsigned。
下表列出了 o 的可接受值:
|
如果未指定 -xchar,编译器将假定 -xchar=s。
如果指定了 -xchar 但未指定值,编译器将假定 -xchar=s。
-xchar 选项仅会更改使用 -xchar 编译的代码中 char 类型的值范围。该选项不会更改任何系统例程或头文件中 char 类型的值范围。具体来讲,指定此选项时不更改 limits.h 定义的 CHAR_MAX 和 CHAR_MIN 的值。因此,CHAR_MAX 和 CHAR_MIN 不再表示无格式 char 中可编码的值的范围。
如果使用 -xchar,则在将 char 与预定义的系统宏进行比较时要特别小心,原因是宏中的值可能带符号。对于返回可通过宏访问的错误代码的任何例程,这种情况很常见。错误代码一般是负值,因此在将 char 与此类宏中的值进行比较时,结果始终为假。负数永远不等于无符号类型的值。
请勿使用 -xchar 为通过库导出的任何接口编译例程。Oracle Developer Studio 的所有目标平台的 ABI 将 char 类型指定为 signed,并且系统库的行为也与此一致。目前还未对系统库针对将 char 指定为无符号的效果进行广泛测试。可以不使用该选项,而是修改代码使其与 char 类型是否带符号没有关联。类型 char 的符号因编译器和操作系统而异。
以指定的字节顺序放置多字符字符常量构成的字符,来生成一个整型常量。 使用以下值之一作为 o:
low:按由低到高的字节顺序放置多字符字符常量构成的字符。
high:按由高到低的字节顺序放置多字符字符常量构成的字符。
default:按编译模式 (-Xv) 所确定的顺序放置多字符字符常量构成的字符。有关更多信息,请参见字符常量和-X[c|a|t|s]。
下表列出了 o 的值。
|
如果未指定 -xcheck,则编译器将缺省设置为 -xcheck=noreturn。如果指定了不带任何参数的 -xcheck,则编译器缺省为 -xcheck=%all(除非是在 SPARC 的 Oracle Solaris 系统上,在该系统上,编译器在这两种情况下都缺省为 -xcheck=stkovf:detect)。
在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。因此,要同时启用堆栈溢出诊断和局部变量初始化,请使用以下选项:
cc -xcheck=stkovf:diagnose,init_local ...
使用 -xcheck=init_local,编译器可在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值。(请注意,这些值可能会发生更改,因此不应该依赖它们。)
|
为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中的指针说明进行初始化。
永远不会初始化以下局部变量类型:限定的 const、register、计算的 goto 的标签号、局部标签。
struct 中属于基本类型的字段将按照上表所述进行初始化(与 union 中第一个声明的 pointer 或 float 字段相同),以便最大限度地增加未初始化的引用生成可见错误的可能性。
数组元素也按上表所述进行初始化。
嵌套的 struct、union 和数组字段可按照上表所述进行初始化,但以下情况除外:struct 包含位字段、union 没有 pointer 或 float 字段,或者数组类型无法进行完整的初始化。这些例外情况将使用用于 double 类型的局部变量的值进行初始化。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分。其主要用途是覆盖 -xtarget 选项提供的值。
此选项通过指定目标处理器来指定计时属性。部分影响如下:
指令的顺序,即调度
编译器使用分支的方法
语义上等价的其他指令可用时使用的指令
下表列出了 SPARC 平台的 c 的 -xchip 值:
|
下表列出了用于 x86 平台的 -xchip 值:
|
下表列出了 v 的值。
|
对于 32 位体系结构,缺省值是 -xcode=abs32。64 位体系结构的缺省值是 -xcode=abs44。
生成共享动态库时,缺省 -xcode 值 abs44 和 abs32 对 64 位体系结构无效。改为指定 -xcode=pic13 或 -xcode=pic32。在 SPARC 上使用 -xcode=pic13 和 -xcode=pic32 时的两项名义性能开销为:
使用 -xcode=pic13 或 -xcode=pic32 编译的例程会在入口点执行一些附加指令,以将寄存器设置为指向用于访问共享库的全局变量或静态变量的表 (_GLOBAL_OFFSET_TABLE_)。
对全局或静态变量的每次访问都会涉及通过 _GLOBAL_OFFSET_TABLE_ 的额外间接内存引用。如果编译包括 -xcode=pic32,则每个全局和静态内存引用中都会有两个附加指令。
在考虑这些开销时,请记住:由于受到库代码共享的影响,使用 -xcode=pic13 和 -xcode=pic32 会大大减少系统内存需求。共享库中使用 -xcode=pic13 或 -xcode=pic32 编译的每页代码都可以供使用该库的每个进程共享。如果共享库中的代码页包含非 pic(即绝对)内存引用,即使仅包含单个非 pic 内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本。
确定是否已经使用 -xcode=pic13 或 -xcode=pic32 编译 .o 文件的最简单方法是使用 nm 命令:
% nm file.o | grep _GLOBAL_OFFSET_TABLE_ U _GLOBAL_OFFSET_TABLE_
包含与位置无关的代码的 .o 文件将包含对 _GLOBAL_OFFSET_TABLE_ 无法解析的外部引用(用字母 U 标记)。
要确定是使用 -xcode=pic13 还是使用 -xcode=pic32,请使用 elfdump -c 检查全局偏移表 (Global Offset Table, GOT) 的大小并查找节头 sh_name: .got。 sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13。否则,请指定 -xcode=pic32。有关更多信息,请参见 elfdump(1) 手册页。
按照以下准则来确定应如何使用 -xcode:
如果要生成可执行文件,请勿使用 -xcode=pic13 或 -xcode=pic32。
如果要生成仅用于链接到可执行文件的归档库,请勿使用 -xcode=pic13 或 -xcode=pic32。
如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,再使用 -xcode=pic32。
如果要生成用于链接到共享库的归档库,请使用 -xcode=pic32。
已过时,不使用。改用 –xipo。-xcrossfile 是 —xipo=1 的别名。
允许 C 编译器接受在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。 这些语言环境包括 ja_JP.PCK。
处理此类语言环境所需的编译器转换阶段可能导致编译时间明显延长。仅当编译的源文件包含此类语言环境中某个语言环境的源代码字符时,才应该使用此选项。
除非指定 -xcsi,否则编译器不识别在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。
如果您维护会读取 DWARF 格式的调试信息的软件,请指定 -xdebugformat=dwarf。 此选项会导致编译器使用 DWARF 标准格式生成调试信息,这是缺省设置。
|
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。此选项需要一个参数。
此选项影响使用 -g 选项记录的数据的格式。即使在没有使用 -g 的情况下记录少量调试信息,此选项仍可控制其信息格式。因此,即使不使用 -g,-xdebugformat 也会有影响。
dbx 和性能分析器软件可识别 STABS 和 DWARF 格式,因此使用此选项对任何工具的功能都没有影响。
有关更多信息,请参见 dumpstabs(1) 和 dwarfdump(1) 手册页。
术语 tagtype 是指标记的类型:struct、union、enum 和 class。
以下列表包含子选项 a 的可能值。应用于某子选项的前缀 no% 会禁用该子选项。缺省值为 -xdebuginfo=%none。禁止指定不带子选项的 -xdebuginfo。
不生成任何调试信息。这是缺省值。
发出行号和文件信息。
发出参数的位置列表信息。发出标量值(例如 int、char *)的完整类型信息以及类型名称,但是不发出 tagtype 的完整定义。
发出词法上全局和局部变量的位置列表信息,包括文件和函数静态信息,但是不包括类静态和外部信息。发出标量值(例如 int 和 char *)的完整类型信息以及类型名称,但是不发出 tagtype 的完整定义。
发出关于函数和变量声明、成员函数以及类声明中的静态数据成员的信息。
发出从 param 和 variable 数据集引用的 tagtype 的完整类型定义以及模板定义。
发出宏信息。
发出 DWARF 代码标记(又称为 Stabs N_PATCH)。这是有关由 RTC 和 discover 使用的位字段、结构副本以及溢出的信息。
生成对硬件计数器分析至关重要的信息。该信息包括 ldst_map-从 ld/st 指令到引用的符号表条目的映射,以及分支目标地址的 branch_target 表-用于验证回溯是否未跨分支目标。有关更多信息,请参见 -xhwcprof。
这些是扩展到 -xdebuginfo 组合及其他选项的宏,如下所示:
-g = -g2 -gnone = -xdebuginfo=%none -xglobalize=no -xpatchpadding=fix -xkeep_unref=no%funcs,no%vars -g1 = -xdebuginfo=line,param,codetag -xglobalize=no -xpatchpadding=fix -xkeep_unref=no%funcs,no%vars -g2 = -xdebuginfo=line,param,decl,variable,tagtype,codetag -xglobalize=yes -xpatchpadding=fix -xkeep_unref=funcs,vars -g3 = -xdebuginfo=line,param,decl,variable,tagtype,codetag,macro -xglobalize=yes -xpatchpadding=fix -xkeep_unref=funcs,vars
分析循环以了解迭代间数据依赖性并执行循环重构,包括循环交换、循环熔合以及标量替换。
对于所有优化级别 -xO3 以及更高级别,-xdepend 缺省为 -xdepend=on。指定 -xdepend 的显式设置会覆盖任何缺省设置。
指定不带参数的 -xdepend 等效于 -xdepend=yes。
依赖性分析在单处理器系统中可能很有用。但是,如果您在单处理器系统上使用 -xdepend,则不应同时指定 -xautopar,因为将针对多处理器系统执行 -xdepend 优化。
要查看宏在程序中如何工作时,请使用该选项。 该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出信息输出到标准错误 (stderr)。-xdumpmacros 选项在整个文件中或在 dumpmacros 或 end_dumpmacros pragma 覆盖它之前都是有效的。请参见dumpmacros。
下表列出了 value 的有效参数。前缀 no% 可禁用关联的值。
|
该选项的值会累积,因此指定 -xdumpmacros=sys -xdumpmacros=undefs 与 -xdumpmacros=undefs,sys 的效果相同。
指定不带任何参数的 -xdumpmacros 缺省设置为 -xdumpmacros=defs,undefs,sys。未指定 -xdumpmacros 时的缺省值为 -xdumpmacros=%none。
如果使用选项 -xdumpmacros=use,no%loc,则使用的每个宏名称只打印一次。但是,如果要了解更多详细信息,请使用选项 -xdumpmacros=use,loc,这样每次使用宏时都会打印位置和宏名称。
例如以下文件 t.c:
example% cat t.c #ifdef FOO #undef FOO #define COMPUTE(a, b) a+b #else #define COMPUTE(a,b) a-b #endif int n = COMPUTE(5,2); int j = COMPUTE(7,1); #if COMPUTE(8,3) + NN + MM int k = 0; #endif
以下示例显示了使用 defs、undefs、sys 和 loc 参数时文件 t.c 的输出。
example% cc -c -xdumpmacros -DFOO t.c #define __SunOS_5_9 1 #define __SUNPRO_C 0x5140 #define unix 1 #define sun 1 #define sparc 1 #define __sparc 1 #define __unix 1 #define __sun 1 #define __BUILTIN_VA_ARG_INCR 1 #define __SVR4 1 #define __SUNPRO_CC_COMPAT 5 #define __SUN_PREFETCH 1 #define FOO 1 #undef FOO #define COMPUTE(a, b) a + b example% cc -c -xdumpmacros=defs,undefs,loc -DFOO -UBAR t.c command line: #define __SunOS_5_9 1 command line: #define __SUNPRO_C 0x5140 command line: #define unix 1 command line: #define sun 1 command line: #define sparc 1 command line: #define __sparc 1 command line: #define __unix 1 command line: #define __sun 1 command line: #define __BUILTIN_VA_ARG_INCR 1 command line: #define __SVR4 1 command line: #define __SUN_PREFETCH 1 command line: #define FOO 1 command line: #undef BAR t.c, line 2: #undef FOO t.c, line 3: #define COMPUTE(a, b) a + b
以下示例说明了 use、loc 和 conds 参数如何报告文件 t.c 中宏的行为:
example% cc -c -xdumpmacros=use t.c used macro COMPUTE example% cc -c -xdumpmacros=use,loc t.c t.c, line 7: used macro COMPUTE t.c, line 8: used macro COMPUTE example% cc -c -xdumpmacros=use,conds t.c used macro FOO used macro COMPUTE used macro NN used macro MM example% cc -c -xdumpmacros=use,conds,loc t.c t.c, line 1: used macro FOO t.c, line 7: used macro COMPUTE t.c, line 8: used macro COMPUTE t.c, line 9: used macro COMPUTE t.c, line 9: used macro NN t.c, line 9: used macro MM
例如文件 y.c:
example% cat y.c #define X 1 #define Y X #define Z Y int a = Z;
以下示例基于 y.c 中的宏显示了 -xdumpmacros=use,loc 的输出:
example% cc -c -xdumpmacros=use,loc y.c y.c, line 4: used macro Z y.c, line 4: used macro Y y.c, line 4: used macro X
Pragma dumpmacros/end_dumpmacros 会覆盖 -xdumpmacros 命令行选项的作用域。
该选项指示编译器将函数或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)可将这些段重新排序以优化程序性能。该优化在缺页时间构成程序运行时的一大部分时最有效。
对变量进行重新排序有助于解决以下对运行时性能有负面影响的问题:
在内存中存放位置很近的无关变量会造成缓存和页的争用。
在内存中存放位置很远的相关变量会造成不必要的过大工作集。
未用到的弱变量副本会造成不必要的过大工作集,从而降低有效数据密度。
为优化性能而对变量和函数进行重新排序时,需要执行以下操作:
使用 -xF 进行编译和链接。
按照Oracle Developer Studio 12.5:性能分析器和Oracle Solaris 11.3 链接程序和库指南中有关为函数或数据生成映射文件的说明进行操作。
使用通过链接程序的 -M 选项生成的新映射文件重新链接。
在分析器下重新执行以验证是否增强。
下表列出了 v 的值。
|
在这些值(%all 和 %none 除外)前面添加 no% 可禁用子选项。例如 no%func。
如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func。
使用 -xF=lcldata 会限制某些地址计算优化,因此,只应在必要时才使用该标志。
请参见 analyzer(1) 和 ld(1) 手册页。
全局化是调试器中的修复和继续功能所必需的技术,函数级或文件级静态符号通过此技术提升到全局,并在名称前面添加一个前缀以区分同名的符号。
缺省值为 -xglobalize=no。指定 -xglobalize 与指定 -xglobalize=yes 等效。
请参见 -xpatchpadding。
-xhelp=flags 显示编译器选项汇总信息。
如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用 -g 生成的符号信息结合)。它将分析数据与目标的数据空间而非指令空间进行关联,可以对行为进行深入洞察,单独通过指令分析难以做到这一点。
可使用 -xhwcprof 编译一组指定的对象文件。但是,-xhwcprof 在应用于应用程序中的所有对象文件时非常有用,可识别并关联分布在应用程序的对象文件中的所有内存引用。
如果在不同的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。-xhwcprof 的未来扩展可能需要在链接时使用它。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求启用优化,并将调试数据格式设置为 DWARF (-xdebugformat=dwarf),这是当前 Oracle Developer Studio 编译器的缺省设置。不允许在同一命令行上出现 -xhwcprof 和 -xdebugformat=stabs。
-xhwcprof 使用 -xdebuginfo 自动启用所需的最少量调试信息,所以不需要 -g。
-xhwcprof 和 -g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof 和 -g 所引起的增加总量还多。
-xhwcprof 作为宏实施,扩展到多个其他更原始的选项,如下所示:
-xhwcprof -xdebuginfo=hwcprof,tagtype,line -xhwcprof=enable -xdebuginfo=hwcprof,tagtype,line -xhwcprof=disable -xdebuginfo=no%hwcprof,no%tagtype,no%line
下列命令可编译 example.c,并可为硬件计数器分析以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:
example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c
有关基于硬件计数器的分析的更多信息,请参见Oracle Developer Studio 12.5:性能分析器。
[{%auto,func_name,no%func_name}[,{%auto,func_name,no%func_name}]...]
-xinline 尝试只内联可选列表中指定的函数。该列表可为空,或者包含由逗号分隔的 func_name、no%func_name 或 %auto 列表,其中 func_name 是函数名称。-xinline 仅在 –xO3 或更高级别上起作用。
|
该列表值从左至右进行累积。对于 -xinline=%auto,no%foo 的规范,编译器将尝试内联除 foo 之外的所有函数。对于 -xinline=%bar,%myfunc,no%bar 的规范,编译器仅尝试内联 myfunc。
在优化级别为 -xO4 或更高级别上编译时,编译器通常尝试内联源文件中定义的对函数的所有引用。通过指定 -xinline 选项,您可以限定编译器尝试内联的函数集。如果仅指定 -xinline= 而不指定任何函数或 %auto,则表示不内联源文件中的任何例程。如果您指定了 func_name 和 no%func_name 而未指定 %auto,则编译器将仅尝试内联列表中指定的函数。如果在优化级别设置为 -xO4 或更高时用 -xinline 选项在值列表中指定 %auto,编译器将尝试内联所有未被 no%func_name 显式排除的函数。
如果以下任何条件适用,则不内联函数。且不发出任何警告。
优化级别低于 -xO3。
无法找到例程。
优化器无法内联例程。
正编译的文件中不存在例程的源代码(但是,请参见 -xipo)。
如果在命令行指定多个 -xinline 选项,它们将不会累积。命令行上的最后一个 -xinline 指定编译器尝试内联的函数。
另请参见 -xldscope。
使用该选项可手动更改编译器用来确定何时内联函数调用的试探式方法。
该选项仅在 -O3 或更高级别上起作用。当自动内联处于启用状态时,以下子选项仅在 -O4 或更高级别上起作用。
在以下子选项中,n 必须是正整数;a 可以是以下几项之一:
|
如果指定了 -xinline_param=default,编译器会将子选项的所有值设置为缺省值。
如果不指定该选项,则缺省值为 -xinline_param=default。
值和选项的列表从左至右进行累积。所以对于 -xinline_param=max_inst_hard:30,..,max_inst_hard:50 的规范,值 max_inst_hard:50 将传递给编译器。
如果在命令行上指定了多个 -xinline_param 选项,则子选项的列表同样从左至右进行累积。例如,
-xinline_param=max_inst_hard:50,min_counter:70 ... -xinline_param=max_growth:100,max_inst_hard:100
的效果等同于
-xinline_param=max_inst_hard:100,min_counter:70,max_growth:100
该选项可生成在编译器内联函数时写入标准输出的报告。报告的类型取决于 n 的值,它必须为 0、1 或 2。
不生成报告。
生成内联参数缺省值的摘要报告。
生成内联消息的详细报告,显示已内联和未内联的调用点,并注明未内联调用点的简短原因。在某些情况下,该报告将包括针对可用于内联未内联的调用点的 -xinline_param 建议的值。
如果未指定 -xinline_report,则 n 的缺省值为 0。如果指定了不带 =n 的 -xinline_report,则缺省值为 1。
如果存在 -xlinkopt,则有关未内联的调用点的内联消息可能并不准确。
指定此选项编译并检测您的程序,以供线程分析器进行分析。有关线程分析器的更多详细信息,请参见 tha(1) 手册页。
然后可使用性能分析器以 collect –r races 来运行此检测过的程序,从而创建数据争用检测实验。如果您单独运行检测过的代码,其运行速度将非常缓慢。
可指定 –xinstrument=no%datarace 来关闭线程分析器的源代码准备。这是缺省值。
您必须为 –xinstrument= 指定参数。
如果在不同的步骤中进行编译和链接,则在编译和链接步骤都必须指定 –xinstrument=datarace。
此选项定义了预处理程序令牌 __THA_NOTIFY。可指定 #ifdef __THA_NOTIFY 来保护对 libtha(3) 例程的调用。
该选项也设置 –g。
–xinstrument 不能与 –xlinkopt 一起使用。
用 0、1 或 2 替换 a。没有任何参数的 -xipo 等效于 -xipo=1。-xipo=0 是缺省设置,表示禁用 -xipo。在 -xipo=1 时,编译器会跨所有源文件执行内联。
在 -xipo=2 时,编译器执行过程间调用别名分析同时优化内存分配和布局,以提高缓存的性能。
编译器可通过调用过程间分析组件执行部分程序优化。 它在链接步骤中跨所有对象文件执行优化,并且不限于编译命令的源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。
编译时和链接时都必须指定 -xipo。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的对象文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。在编译步骤中创建的对象文件具有在这些文件内编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
如果您的 .o 文件是用来自不同编译器版本的 –xipo 选项编译的,则混用这些文件可能会导致失败,并显示有关 "IR version mismatch"(IR 版本不匹配)的错误消息。在使用 –xipo 选项时,所有的文件都应当使用相同版本的编译器来编译。
在编译和链接大型多文件应用程序时,-xipo 特别有用。用该标志编译的对象文件具有在这些文件内编译的分析信息,这些信息实现了在源代码和预编译的程序文件中的过程间分析。
分析和优化只限于使用 -xipo 编译的对象文件,并不扩展到对象文件或库。
-xipo 是多阶段的,因此如果要在不同的步骤中进行编译和链接,需要为每一步指定 -xipo。
关于 -xipo 的其他重要信息:
它要求优化级别最低为 -xO4。
编译时未使用 -xipo 的对象可以自由地与使用 -xipo 编译的对象链接。
在此例中,编译和链接在单个步骤中进行:
cc -xipo -xO4 -o prog part1.c part2.c part3.c
优化器在三个源文件之间执行交叉文件内联。此过程是在最终链接步骤中完成的,因此源文件的编译不必全部在单次编译中进行,可以分多次单独进行编译,且每次编译时都指定 -xipo。
在此例中,编译和链接在不同的步骤中进行:
cc -xipo -xO4 -c part1.c part2.c cc -xipo -xO4 -c part3.c cc -xipo -xO4 -o prog part1.o part2.o part3.o
即使使用 -xipo 进行编译,也存在库不参与跨文件过程间分析的限制,如以下示例所示:
cc -xipo -xO4 one.c two.c three.c ar -r mylib.a one.o two.o three.o ... cc -xipo -xO4 -o myprog main.c four.c mylib.a
在此示例中,过程间优化是在以下例程之间执行的:one.c、two.c 和 three.c 之间,main.c 和 four.c 之间,但不在 main.c 或 four.c 和 mylib.a 上的例程之间执行。(第一次编译可能会生成有关未定义符号的警告,但仍可执行过程间优化,因为它是一个编译和链接步骤。)
在链接步骤中使用对象文件集合时,编译器尝试执行整个程序分析和优化。对于该对象文件集合中定义的任何函数或子例程 foo(),编译器做出以下两个假定:
运行时在该对象文件集合之外定义的其他例程不显式调用 foo()。
对象文件集合中的任何例程调用 foo() 时,不会插入该对象文件集合之外定义的不同版本的 foo()。
如果假定 2 不成立,请不要使用 -xipo=1 或 -xipo=2 进行编译。
例如,如果对函数 malloc() 创建了您自己的版本,并使用 -xipo=2 进行编译。这样,对于任何库中引用 malloc() 且与您的代码链接的所有函数,都必须使用 -xipo=2 进行编译,并且需要在链接步骤中对其对象文件进行操作。由于此过程对于系统库不大可能,因此不要使用 -xipo=2 编译您的 malloc() 版本。
另举一例,如果生成了一个共享库,有两个外部调用(foo() 和 bar())分别在两个不同的源文件中。并假设 bar() 调用 foo()。如果可在运行时插入 foo(),则不要使用 -xipo=1 或 -xipo=2 编译 foo() 或 bar() 的源文件。否则,foo() 会内联到 bar() 中,从而导致出现错误的结果。
-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的对象文件来优化传递给链接程序的对象文件。库中包含的在编译期间优化的任何对象文件都会替换为其优化后的版本。
下表列出了 a 的值。
|
如果不为 -xipo_archive 指定设置,编译器会将其设置为 -xipo_archive=none。
您必须为 –xipo_archive= 指定值。
在不设置 -xipo_build 的情况下生成 -xipo 涉及通过编译器的两次传递,一次是在生成对象文件时,再一次是随后在链接时执行跨文件优化时。设置 -xipo_build 可避免初始传递期间的优化而仅在链接时优化,从而缩短编译时间。无需对对象文件进行优化,与 -xipo 一样,将在链接时执行优化。如果使用 -xipo_build 生成的未优化对象文件链接起来而未包括 -xipo 来执行优化,则应用程序将因无法解析的符号错误而无法链接。
以下示例将执行 .o 文件的快速生成,后跟链接时跨文件优化:
% cc -O -xipo -xipo_build -o code1.o -c code1.c % cc -O -xipo -xipo_build -o code2.o -c code2.c % cc -O -xipo -o a.out code1.o code2.o
-xipo_build 将在创建 .o 文件时禁用 -O,以快速生成这些文件。链接时将执行完全 -O 优化,作为 -xipo 跨文件优化的一部分。
以下示例在不使用 -xipo 的情况下执行链接。
% cc -O -o a.out code1.o code2.o
如果使用 -xipo_build 生成了 code1.o 或 code2.o,结果将发生链接时故障,指明符号 __unoptimized_object_file 无法解析。
单独生成 .o 文件时,缺省行为是 -xipo_build=no。但是,当从源文件的一次传递中生成可执行文件或库时,将隐式启用 -xipo_build。例如:
% cc -fast -xipo a.c b.c c.c
将为生成 a.o、b.o 和 c.o 的第一次传递隐式启用 -xipo_build=yes。包括选项 -xipo_build=no 可禁用该行为。
禁用或设置 #pragma ivdep pragma 的解释(忽略向量依赖性)。
ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这将使编译器能够执行各种循环优化(例如微向量化、分发、软件流水线等),而以其他方式可能无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。
#pragma ivdep 指令的解释依赖于 —xivdep 选项的值。
以下列表列出了 p 的值及其含义。
忽略假定的循环附带依赖性
忽略所有循环附带向量依赖性
忽略假定的向后循环附带向量依赖性
忽略所有向后循环附带向量依赖性
不忽略任何依赖性(禁用 ivdep pragma)
提供这些解释是为了与另一个供应商对 ivdep pragma 的解释兼容。
使用多个进程进行编译。如果未指定该标志,则缺省行为是 -xjobs=auto。
指定 -xjobs 选项可设置编译器完成其任务需创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。目前,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。
通常,n 的安全值等于 1.5 乘以可用处理器数。如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。
如果指定了 -xjobs=auto,则编译器将自动选择适当数量的并行作业。
指定 -xjobs 时务必要指定值。否则,会发出错误诊断并使编译终止。
如果未指定 -xjobs,则缺省行为是 -xjobs=auto。通过将 -xjobs=n 添加到命令行可覆盖该行为。出现最合适的实例之前,-xjobs 的多重实例在命令行上会互相覆盖。
以下示例将与 -xipo 的最多三个并行进程链接:
% cc -xipo -xO4 -xjobs=3 t1.o t2.o t3.o
以下示例将与 -xipo 的一个进程串行链接:
% cc -xipo -xO4 -xjobs=1 t1.o t2.o t3.o
以下示例将与为 -xipo 选择作业数量的编译器并行链接:
% cc -xipo -xO4 t1.o t2.o t3.o
请注意,这与显式指定 -xjobs=auto 时的行为完全相同:
% cc -xipo -xO4 -xjobs=auto t1.o t2.o t3.o
保留未引用函数和变量的定义。no% 前缀使编译器有可能删除这些定义。
缺省值为 no%funcs,no%vars。指定 -xkeep_unref 等效于指定 -xkeep_unref=funcs,vars,表示 -keep_unref 保留一切。
禁止对命名函数 (name) 进行与堆栈相关的优化。
禁止对所有代码进行与堆栈相关的优化。
允许对所有代码进行与堆栈相关的优化。
此选项是累积性的,可以多次出现在命令行中。例如,—xkeepframe=%all —xkeepframe=no%func1 表示应当为除 func1 以外的所有函数保留堆栈帧。而且,—xkeepframe 优先于 —xregs=frameptr。例如,—xkeepframe=%all —xregs=frameptr 表示应保留所有函数的堆栈,但会忽略 —xregs=frameptr 的优化。
如果命令行中未指定,编译器将采用 -xkeepframe=%none 作为缺省值。如果指定了但没有值,编译器将采用 -xkeepframe=%all。
(Oracle Solaris) -xlang 标志可用于覆盖 -std 标志指定的缺省 libc 行为。language 必须是以下值之一:
指定要符合 C90 标准的 libc 的运行时库行为。
指定 libc 的运行时库行为要符合 C99 标准。
与 c99 等效。c99 和 c11 的 libc 的运行时库行为相同。
如果未指定 -xlang,则它缺省为与 –std 标志相同的值。
如果指定了 -xlang 标志,则无法使用 -Xc、-Xa、-Xt、-Xs 和 -xc99 标志。这样做会导致编译器发出错误。
如果在不同的步骤中编译和链接,则必须在两个步骤中为 -xlang 使用相同的值。
要确定将哪个驱动程序用于混合语言链接,请使用以下语言分层结构:
使用 CC 命令。有关详细信息,请参见Oracle Developer Studio 12.5:C++ 用户指南。
使用 f95 命令。有关详细信息,请参见Oracle Developer Studio 12.5:Fortran 用户指南。
使用 f95 -xlang=f77。有关详细信息,请参见Oracle Developer Studio 12.5:Fortran 用户指南。
使用 cc 命令。
此标志仅在 Oracle Solaris 上可用,在 Oracle Linux 上会被忽略而无提示。
指定 -xldscope 选项,以更改用于外部符号定义的缺省链接程序作用域。 由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。
v 必须是下列值之一:
|
如果未指定 -xldscope,编译器将假定 -xldscope=global。如果指定不带参数的 -xldscope,编译器会发出错误信息。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。
如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。编译器在以下情况下会内联函数:
使用 -xinline 指定函数名称。
在 -xO4 或更高级别进行编译(在这种情况下可能会自动进行内联)。
使用内联说明符。
使用内联 pragma。
使用跨文件优化。
例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:
void* ABC_allocator(size_t size) { return malloc(size); }
如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库用户尝试用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。
生成库时,用 __hidden 或 __symbolic 说明符声明的库函数可以内联生成。这些函数不应被用户覆盖。有关更多信息,请参见链接程序作用域说明符。
用 __global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。
另请参见 -xinline、-xO、-xipo、#pragma、inline。
强制为异常类中的数学例程返回 IEEE 754 样式的值。 在此情况下,不打印异常消息,并且不应依赖 errno。
内联一些库例程,以加快执行速度。此选项可为浮点选项和系统平台选择合适的汇编语言内联模板。
无论将函数的任何规范作为 -xlibmil 标记的一部分,-xlibmil 都会内联函数。
但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。 另请参见保留 errno 的值。
使编译器可以使用优化数学例程的库。 使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
数学例程库优化了性能,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。
请注意,这些替换会使 errno 的设置变得不可靠。 如果您的程序依赖于 errno 的值,请不要使用此选项。有关更多信息,请参见保留 errno 的值。
该库选项在命令行上的顺序并不重要。
此选项由 -fast 选项设置。
(已过时)使用 -library=sunperf 可与 Sun 性能库链接。
编译器忽略此选项且不显示任何提示。
(Oracle Solaris) 指示编译器对可重定位的对象文件执行链接时优化。 这些优化在链接时通过分析二进制对象代码来执行。虽然未重写对象文件,但生成的可执行代码可能与初始对象代码不同。
必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制对象文件执行部分受限的优化。
-xlinkopt 优化出现在编译器命令行上的静态库代码,但不会优化出现在命令行上的共享(动态)库代码。您还可以在生成共享库(用 -G 编译)时使用 -xlinkopt。
级别设置执行的优化级别,必须为 0、1 或 2。下表列出了优化级别:
|
如果在不同的步骤中编译,-xbinopt 必须同时出现在编译和链接步骤中。
example% cc -c -xlinkopt a.c b.c example% cc -o myprog -xlinkopt=2 a.o
有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
请注意,仅当编译器链接时才使用级别参数。在该示例中,即使二进制对象代码是用隐含级别 1 编译的,使用的后优化级别仍然是 2。
指定 -xlinkopt 时若不带级别参数,则表示 -xlinkopt=1。
-xlinkopt 选项需要分析反馈 (-xprofile) 来优化程序。分析功能会展示代码中最常用和最不常用的部分,从而使优化器相应地进行处理。链接时优化对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。另外,-xlinkopt 在用于编译整个程序时最有效。此选项的用法如下所示:
example% cc -o progt -xO5 -xprofile=collect:prog file.c example% progt example% cc -o prog -xO5 -xprofile=use:prog -xlinkopt file.c
有关使用分析反馈的详细信息,请参见-xprofile=p。
使用 -xlinkopt 编译时,请不要使用 -zcombreloc 链接程序选项。
注意,使用该选项编译会略微延长链接的时间,对象文件的大小也会增加,但可执行文件的大小保持不变。使用 -xlinkopt 和 -g 编译会将调试信息包括在内,从而增加了可执行文件的大小。
–xlinkopt 不能与 –xinstrument 一起使用。
显示哪些循环已并行化。 提供未并行化循环的简要原因。 仅当指定了 -xautopar 时,-xloopinfo 选项才有效,否则,编译器将发出警告。
要达到更快的执行速度,则该选项需要多处理器系统。在单处理器系统中,生成的代码通常运行得较慢。
只对指定的 C 程序运行 C 预处理程序,同时请求预处理程序生成 makefile 依赖性并将结果发送至标准输出。 有关 make 文件和相关项的详细信息,请参见 make(1) 手册页。
例如:
#include <unistd.h> void main(void) {}
生成的输出如下:
e.o: e.c e.o: /usr/include/unistd.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/machtypes.h e.o: /usr/include/sys/select.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/unistd.h
如果您指定 -xM 和 -xMF,则编译器会将所有 makefile 依赖性信息追加到使用 -xMF 指定的文件中。
像 -xM 一样生成 makefile 依赖性,但不包括 /usr/include 文件。 例如:
more hello.c #include<stdio.h> main() { (void)printf(“hello\n”); } cc– xM hello.c hello.o: hello.c hello.o: /usr/include/stdio.h
使用 -xM1 编译不会报告头文件的依赖性:
cc– xM1 hello.c hello.o: hello.c
-xM1 在 -Xs 模式下不可用。
如果您指定 -xM1 和 -xMF,则编译器会将所有 makefile 依赖性信息附加至使用 -xMF 指定的文件中。
像 -xM 一样生成 makefile 依赖性,但编译继续。-xMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .d 的 filename。如果指定 -xMD 和 -xMF,预处理程序会将所有 makefile 依赖性信息写入到使用 -xMF 指定的文件中。不允许使用 -xMD -xMF 或 -xMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
使用此选项可为 makefile 依赖性输出指定一个文件。您无法在一个命令行上使用 -xMF 为多个输入文件指定单独的 filename。不允许使用 -xMD -xMF 或 -xMMD -xMF 编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
此选项无法与 -xM 或 -xM1 一起使用。
使用此选项可生成不包括系统头文件的 makefile 依赖性。此选项与 -xM1 提供的功能相同,但是编译继续。-xMMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .d 的 filename。如果您指定 -xMF,则编译器将改用您提供的文件名。不允许使用 -xMMD -xMF 或 -xMMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
将数据段合并到文本段。 在此编译所生成的对象文件中初始化的数据是只读数据,并可(除非用 ld -N 链接)在进程间共享。
三个选项 -xMerge -ztext -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
此选项可将 pragma opt 的级别限制为指定级别。v 为 off、1、2、3、4、5 之一。 缺省值为 -xmaxopt=off,表示忽略 pragma opt。指定未提供参数的 -xmaxopt 等效于指定 -xmaxopt=5。
如果同时指定了 -xO 和 -xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。
(SPARC) 使用 -xmemalign 选项可控制编译器对数据对齐所做的假定。通过控制因可能出现的未对齐内存访问而生成的代码以及出现未对齐内存访问时的程序行为,可以更轻松地将代码移植到 SPARC 平台。
指定最大假定内存对齐和未对齐数据访问行为。 您必须同时为 a(对齐)和 b(行为)提供值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。下表列出了 -xmemalign 的对齐值和行为值。
|
如果要链接到某个已编译的对象文件,并且编译该对象文件时 b 的值设置为 i 或 f,就必须指定 -xmemalign。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐来生成所需的装入/存储序列。-xmemalign 选项允许您在这些情况下指定编译器要假定的数据最大内存对齐。它还指定在运行时发生未对齐内存访问时要执行的错误行为。
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应是:
操作系统将陷阱转换为 SIGBUS 信号。如果程序无法捕捉到信号,则程序将会停止。即使程序捕捉到信号,未对齐的访问尝试仍将无法成功。
操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱。
以下缺省值仅适用于未使用 -xmemalign 选项时:
-xmemalgin=8i(对于所有 32 位平台 (-m32))。
-xmemalign=8s(对于所有 64 位平台 (-m64))。
对于所有平台,使用了 -xmemalign 选项但未提供值时的缺省值为 -xmemalign=1i。
下表介绍了如何使用 -xmemalign 来处理不同的对齐情况。
|
(x86) -xmodel 选项使编译器可针对 Oracle Solaris x86 平台修改 64 位对象的格式;只应为此类对象的编译指定该选项。
在用 -m32 指定时,此选项无效。
下表列出了 a 的值。
|
此选项不累积,因此编译器根据命令行最右侧的 -xmodel 实例设置模型值。
如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。
您不必使用此选项编译所有转换单元。只有可以确保访问的对象在可访问范围之内,才可编译选择的文件。
请注意,并非所有 Oracle Linux 系统都支持 medium 模型。
缺省情况下不链接任何库;即不向 ld(1) 传递任何 -l 选项。 通常,cc 驱动程序将 -lc 传递给 ld。
在您使用 -xnolib 时,必须自己传递所有 -l 选项。
不内联数学库例程。 例如,在 –fast 选项后面使用该选项:
% cc– fast– xnolibmil....
通过禁用以前指定的所有 -xlibmopt 选项,禁止编译器使用优化的数学库。 例如,在 -fast 后面使用该选项,这将启用 -xlibmopt。
% cc -fast -xnolibmopt ...
不将共享库的运行时搜索路径生成到可执行文件中。
建议用该选项生成提交到客户(这些客户的程序使用的共享库可能具有不同路径)的可执行文件。
设置编译器优化级别。请注意,大写字母 O 后跟数字 1、2、3、4 或 5。 一般说来,优化级别越高,运行时性能越好。不过,较高的优化级别会延长编译时间并生成较大的可执行文件。
在少数情况下,-xO2 级别的性能可能比其他优化级别好,而 -xO3 也可能胜过 -xO4。
如果优化器内存不足,它将尝试通过在较低的优化级别中重试当前的过程来进行恢复,并以命令行选项中指定的原始级别继续后续过程。
缺省为不优化,但只有不指定优化级别时才可能使用缺省设置。如果您指定优化级别,则无法禁用优化。
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会发出优化已设置的警告消息。不使用任何优化来编译的唯一方法是从指定优化级别的命令行或 makefile 删除所有选项。
如果使用 -g 并且优化级别为 -xO3 或更低,编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化和后端内联被禁用。
如果使用 -g 并且优化级别为 -xO4 或更高,编译器会为完全优化提供尽可能多的符号信息。
使用 -g 进行调试不会抑制 -xOn,但 -xOn 会在某些方面限制 -g。例如,优化选项会降低调试的效用,以致您无法显示 dbx 中的变量,但您仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见《使用 dbx 调试程序》第 1 章中的“调试优化的代码”。
如果同时指定了 -xO 和 -xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。
如果在 -xO3 或 -xO4 级别上优化非常大的程序(在同一程序中有数千行代码),优化器可能需要大量虚拟内存。在此类情况下,机器性能可能会降低。
下表列出了 SPARC 平台上的优化级别。
|
下表列出了 x86 平台上的优化级别。
|
有关调试的更多信息,请参见Oracle Developer Studio 12.5:使用 dbx 调试程序。有关优化的更多信息,请参见Oracle Developer Studio 12.5:性能分析器。
另请参见 -xldscope 和 -xmaxopt。
下表详细列出了 -xopenmp 值:
|
如果指定了 -xopenmp 但未指定值,编译器将假定 -xopenmp=parallel。如果根本未指定 -xopenmp,编译器将假定 -xopenmp=none。
如果使用 dbx 调试 OpenMP 程序,那么编译时使用 -g -xopenmp=noopt 可以在并行区设置断点并显示变量内容。
在以后的发行版中,-xopenmp 的缺省值可能会更改。可以通过显式指定适当的优化级别来避免警告消息。
使用 OMP_NUM_THREADS 环境变量可指定在运行 OpenMP 程序时要使用的线程数。如果未设置 OMP_NUM_THREADS,则所使用的缺省线程数是每个插槽核心数(即,每个处理器芯片的核心数)的倍数,此数值小于等于核心总数与 32 中较小的一个。可以通过以下方法指定不同线程数:设置 OMP_NUM_THREADS 环境变量,或调用 omp_set_num_threads() OpenMP 运行时例程,或者在并行区域指令中使用 num_threads 子句。为了获得最佳性能,用于执行并行区域的线程数不应超出计算机上的可用硬件线程(或虚拟处理器)数量。在 Oracle Solaris 系统上,可以使用 psrinfo(1M) 命令确定此数量。在 Oracle Linux 系统上,可以检查 /proc/cpuinfo 文件来确定此数量。有关更多信息,请参见Oracle Developer Studio 12.5:OpenMP API 用户指南。
缺省情况下,禁用嵌套并行操作。要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。有关详细信息,请参见Oracle Developer Studio 12.5:OpenMP API 用户指南。
如果在不同的步骤中进行编译和链接,请在编译步骤和链接步骤中都指定 -xopenmp。与链接步骤配合使用时,-xopenmp 选项将与 OpenMP 运行时支持库 libmtsk.so 链接。
为了获得最新功能和性能,请确保系统上安装了 OpenMP 运行时库 libmtsk.so 的最新修补程序。
有关用于生成多线程应用程序的 OpenMP Fortran 95、C 和 C++ 应用程序接口 (application program interface, API) 的更多信息,请参见Oracle Developer Studio 12.5:OpenMP API 用户指南。
编译器对源文件仅执行语法和语义检查,以打印所有 K&R C 函数的原型。 此选项不生成任何对象代码或可执行代码。例如,对以下源文件指定 -xP,
f() { } main(argc,argv) int argc; char *argv[]; { }
产生以下输出:
int f(void); int main(int, char **);
SPARC:有效值如下:4k、8K、64K、512K、2M、4M、32M、256M、2G、16G 或 default。
x86:有效值如下:4K、2M、4M、1G 或 default。
如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。必须指定适于目标平台的有效页面大小。
使用 pagesize(1) Oracle Solaris 命令可以确定页面中的字节数。操作系统不保证支持页面大小请求。但是,可以使用适当段对齐来增加获取请求的页面大小的可能性。有关如何设置段对齐,请参见 -xsegment_align 选项。可以使用 pmap(2) 或 meminfo(2) 来确定目标平台的页面大小。
除非在编译和链接时使用,否则 -xpagesize 选项不会生效。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
如果指定 -xpagesize=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
此选项是用于 -xpagesize_heap 和 -xpagesize_stack 的宏。这两个选项与 -xpagesize 接受相同的参数。可以通过指定 -xpagesize 为这两个选项设置相同的值,也可以分别为它们指定不同的值。
libhugetlbfs 库是使 –xpagesize 在 Oracle Linux 上工作所必需的。有关更多信息,请参见 Oracle Linux libhugetlbfs(7) 手册页。
此选项与 -xpagesize 接受相同的值。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。
如果指定 -xpagesize_heap=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
除非在编译和链接时使用,否则 -xpagesize_heap 选项不会生效。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
此选项与 -xpagesize 接受相同的值。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。
如果指定 -xpagesize_stack=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
除非在编译和链接时使用,否则 -xpagesize_stack 选项不会生效。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 24。
在各个函数启动之前保留内存区域。如果指定了 fix,编译器将保留 fix 所需的空间量并继续。这是第一个缺省值。如果指定了 patch 或未指定任何值,则编译器将保留特定于平台的缺省值。值 -xpatchpadding=0 表示保留 0 字节的空间。在 x86 上 size 的最大值是 127 字节,在 SPARC 上是 2048 字节。
此编译器选项可激活预编译头文件功能。v 可以是 auto、autofirst、collect:pch_filename 或 use:pch_filename。 要使用该功能,需要指定 -xpch 和 -xpchstop 选项,并使用 #pragma hdrstop 指令。
使用 -xpch 选项可以创建预编译头文件并减少编译时间。预编译头文件可减少源文件共享一组通用的 include 文件(包含大量源代码)的应用程序的编译时间。预编译头文件的工作机理是,首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者编译其他有同样头文件顺序的源文件时就可以使用这些收集到的信息。编译器收集的信息存储在预编译头文件中。
有关更多信息,请参见 –xpchstop、hdrstop。
编译器可以通过两种方法之一自动生成预编译头文件。一种方法是让编译器从在源文件找到的第一个 include 文件创建预编译头文件。另一种方法是让编译器从在源文件中找到的 include 文件集合中选择,选择范围从第一个 include 文件开始,直到已经定义好的确定哪个 include 文件是最后一个的点结束。使用下表中所述标志之一可以确定编译器用于自动生成预编译头文件的方法。
|
要手动创建预编译头文件,请首先使用 -xpch,并指定 collect 模式。指定 -xpch=collect 的编译命令只能指定一个源文件。在以下示例中,-xpch 选项根据源文件 a.c 创建名为 myheader.cpch 的预编译头文件:
cc -xpch=collect:myheader a.c
有效的预编译头文件名总是带有后缀 .cpch。在指定 pch_filename 时,该后缀可以由您自己添加或由编译器添加。例如,如果指定 cc -xpch=collect:foo a.c,则预编译的头文件名为 foo.cpch。
如果编译器无法将预编译头文件与 -xpch=auto 和 -xpch=autofirst 结合使用,则会生成新的预编译头文件。如果编译器无法将预编译头文件与 -xpch=use 结合使用,则会发出警告并使用实际的头文件来完成编译。
您也可以通过指定 -xpch=use:pch_filename 来指示编译器使用特定的预编译头文件。您可以将 include 文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件。例如,在 use 模式下的命令可能为:cc -xpch=use:foo.cpch foo.c bar.c foobar.c。
如果以下条件都成立,则只应使用现有的预编译头文件。如果以下任一条件不成立,则应重新创建预编译头文件:
用于访问预编译头文件的编译器与创建预编译头文件的编译器相同。由某一版本的编译器创建的预编译头文件可能无法供其他版本的编译器使用。
除 -xpch 选项之外,用 -xpch=use 指定的编译器选项必须与创建预编译头文件时指定的选项相匹配。
用 -xpch=use 指定的包含头文件的集合与创建预编译头文件时指定的头文件集合是相同的。
用 -xpch=use 指定的包含头文件的内容与创建预编译头文件时指定的包含头文件的内容是相同的。
当前目录(即发生编译并尝试使用给定预编译头文件的目录)与创建预编译头文件所在的目录相同。
在使用 -xpch=collect 指定的文件中预处理指令(包括 #include)的初始序列,与在使用 -xpch=use 指定的文件中预处理指令的序列相同。
要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的 include 文件(按其初始标记序列)。 标记是指关键字、名称或标点符号。被 #if 指令排除的注释和代码不能被编译器识别为标记。该初始标记序列称为活前缀。也就是说,活前缀是源文件中通用于所有源文件的最靠前的部分。创建预编译头文件并进而确定源文件中哪些头文件是预编译的时,编译器使用此活前缀作为整个操作的依据。
编译器在当前编译期间找到的活前缀必须与用于创建预编译头文件的活前缀匹配。也就是说,必须在使用相同预编译头文件的所有源文件中对活前缀给出一致的解释。
源文件的活前缀只能包含注释和以下任意预处理程序指令:
#include #if/ifdef/ifndef/else/elif/endif #define/undef #ident (if identical, passed through as is) #pragma (if identical)
以上任何指令都可以引用宏。#else、#elif 和 #endif 指令必须在活前缀内匹配。注释被忽略。
指定 -xpch=auto 或 -xpch=autofirst 时,编译器会自动确定活前缀的终点。其定义如下。
第一个声明/定义
第一个 #line 指令
#pragma hdrstop 指令
在指定的 include 文件之后(如果您指定 –xpch=auto 和 –xpchstop)
第一个 include 文件(如果您指定 –xpch=autofirst)
对于 -xpch=collect 或 -xpch=use,活前缀以 #pragma hdrstop 结尾。
在共享预编译头文件的每个文件的活前缀中,每个相应的 #define 和 #undef 指令都必须引用相同的符号。例如,每个 #define 必须引用同一个值。这些指令在每个活前缀中出现的顺序也必须相同。每个相应 pragma 也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中。
当头文件在不同源文件中的解释一致(特别是在仅包含完整声明时),则头文件是可预编译的。也就是说,任何一个文件中的声明都必须独自成为有效声明。不完全的类型声明,例如 struct S;,是有效声明。完全类型声明可以出现在某些其他文件中。请考虑这些头文件示例:
file a.h struct S { #include "x.h" /* not allowed */ }; file b.h struct T; // ok, complete declaration struct S { int i; [end of file, continued in another file] /* not allowed*/
并入预编译头文件的头文件不得违反以下约束。这里没有定义对违反上述约束的程序的编译结果。
头文件不得使用 __DATE__ 和 __TIME__。
头文件不得包含 #pragma hdrstop。
如果头文件还包含变量和函数定义,则也是可预编译的。
编译器自动创建预编译头文件时,会将该文件写入 SunWS_cache 目录中。此目录始终位于创建对象文件的位置。该文件的更新受锁保护,这样可在 dmake 下正常工作。
如果需要强制编译器重新生成自动生成的预编译头文件,可以使用 CCadmin 工具清除预编译头文件高速缓存目录。有关更多信息,请参见 CCadmin(1) 手册页。
不要在命令行上指定冲突的 -xpch 标志。例如,同时指定 -xpch=collect 和 -xpch=auto 或同时指定 -xpch=autofirst 和 -xpchstop=<include> 会产生错误。
如果指定 -xpch=autofirst,或指定不带 -xpchstop 的 -xpch=auto,则出现在第一个 include 文件之前或出现在使用用于 -xpch=auto 的 -xpchstop 指定的 include 文件之前的任何声明、定义或 #line 指令都会生成警告,并禁止自动生成预编译头文件。
-xpch=autofirst 或 -xpch=auto 时的第一个 include 文件之前的 #pragma hdrstop 会禁止自动生成预编译头文件。
指定 -xpch=collect 时,编译器会生成预编译头文件的依赖性信息。需要在 make 文件中创建适当的规则,以利用这些依赖性。考虑下面的 make 文件示例:
%.o : %.c shared.cpch $(CC) -xpch=use:shared -xpchstop=foo.h -c $< default : a.out foo.o + shared.cpch : foo.c $(CC) -xpch=collect:shared -xpchstop=foo.h foo.c -c a.out : foo.o bar.o foobar.o $(CC) foo.o bar.o foobar.o clean : rm -f *.o shared.cpch .make.state a.out
这些 make 规则以及编译器生成的依赖性,会在与 -xpch=collect 一起使用的任何源文件或属于预编译头文件的一部分的任何头文件发生更改时,强制重新创建手动创建的预编译头文件。此约束可防止使用过期的预编译头文件。
您无需在 make 文件中为 -xpch=auto 或 -xpch=autofirst 创建任何其他 make 规则。
使用 -xpchstop=file 选项可为预编译头文件指定活前缀的最后一个 include 文件。 在命令行使用 -xpchstop 与将 hdrstop pragma 置于第一个包含指令之后等效,此包含指令在您使用 cc 命令指定的每个源文件中引用 file。
结合使用 -xpchstop=<include> 和 -xpch-auto 可以创建基于从其往上并包括 <include> 的头文件的预编译头文件。此标志覆盖缺省的 -xpch=auto 行为(使用整个活前缀中包含的所有头文件的行为)。
在以下示例中,-xpchstop 选项指定了预编译头文件的活前缀以 projectheader.h 的包含结束。因此,privateheader.h 不是活前缀的一部分。
example% cat a.c #include <stdio.h> #include <strings.h> #include "projectheader.h" #include "privateheader.h" . . . example% cc -xpch=collect:foo.cpch a.c -xpchstop=projectheader.h -c
另请参见 -xpch。
(Oracle Solaris) 生成可移植的可执行代码 (Portable Executable Code, PEC) 二进制文件。此选项将程序中间表示置于对象文件和二进制文件中。该二进制文件可在以后用于调整和故障排除。
使用 –xpec 生成的二进制文件通常比未使用 –xpec 生成的文件大五倍到十倍。
如果不指定 –xpec,则编译器假定 –xpec=no。如果指定了 –xpec 但未提供标志,则编译器假定 –xpec=yes。
准备对象代码,以收集用 gprof(1) 进行分析所需的数据。 此选项调用在正常终止情况下产生 gmon.out 文件的运行时记录机制。
在 64 位 Oracle Solaris 平台上,使用 prof(1) 或 gprof(1) 生成分析,在 32 位 Oracle Solaris 平台上,则只使用 gprof 生成分析;分析中包含大概的用户 CPU 时间,这些时间源自主可执行文件中的例程以及(链接可执行文件时指定为链接程序参数的)共享库中的例程的 PC 示例数据(请参见 pcsample(2))。不会对其他共享库(在进程启动后使用 dlopen(3C) 打开的库)进行分析。
在 32 位 Oracle Solaris 系统中,使用 prof(1) 生成的分析仅限于可执行文件中的例程。通过使用 -xpg 链接可执行文件并使用 gprof(1),可以对 32 位共享库进行分析。
在 x86 系统中,-xpg 与 -xregs=frameptr 不兼容。这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr。在将 -fast 与 -xpg 配合使用时,应使用 -fast -xregs=no%frameptr -xpg 进行编译。
当前的 Oracle Solaris 发行版不包括使用 -p 编译的系统库。因此,在当前 Oracle Solaris 平台上收集的分析不包含系统库例程的调用计数。
如果在编译时指定 -xpg,则还必须在链接时指定它。有关在编译时和链接时都必须指定的选项的完整列表,请参见编译时选项和链接时选项。
显式预取只应在度量支持的特殊环境下使用。
下表列出了 val 的值。
|
缺省值为 -xprefetch=auto,explicit。此缺省值会对实质上具有非线性内存访问模式的应用程序造成负面影响。要覆盖该缺省值,请指定 -xprefetch=no%auto,no%explicit。
sun_prefetch.h 头文件提供了可用来指定显式预取指令的宏。 预取的位置大约为可执行文件中对应于宏出现的位置。
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。
该因子必须是形式为 n.n. 的正数。
在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。
编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加值,请使用大于 1 的因子。介于 .5 和 2.0 之间的值最有可能提供最佳性能。
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小此值,请使用小于 1 的因子。
要使用 latx:factor 子选项,则以接近 1.0 的因子值开始并对应用程序进行性能测试。适当增加或减小该因子,然后再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几个增量中将看不到性能差异,之后会突然出现差异,然后性能再趋于稳定。
a 的值为 [no%]indirect_array_access。
使用 -xprefetch_auto_type=indirect_array_access,可以允许编译器通过为直接内存访问生成预取的方式为选项 -xprefetch_level 指示的循环生成间接预取。
如果不指定 -xprefetch_auto_type 的设置,编译器会将其设置为 -xprefetch_auto_type=no%indirect_array_access。
类似 -xalias_level 的选项可以影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而发生的自动插入间接预取的主动性。
使用 -xprefetch_level 选项,可以控制自动插入通过 -xprefetch=auto 确定的预取指令的主动性。l 必须为 1、2 或 3。 编译器将变得更加主动,换句话说,它会引入更多更高 -xprefetch_level 级别的预取。
适用于 -xprefetch_level 的值取决于应用程序具有的高速缓存未命中次数。较高级别的 -xprefetch_level 值具有提高应用程序性能的潜能。
仅当使用 -xprefetch=auto 对此选项进行编译且优化级别为 3 或更高时,此选项才有效。
-xprefetch_level=1 启用预取指令自动生成。-xprefetch_level=2 启用级别 1 之外的额外生成。-xprefetch_level=3 启用级别 2 之外的额外生成。
指定了 -xprefetch=auto 时,缺省值为 -xprefetch_level=1。
使用该选项编译可生成能使用代码分析器查看的源代码静态分析。
使用 -xprevise=yes 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 -xprevise=yes。
缺省值为 -xprevise=no。
在 Oracle Linux 上,需要指定 -xprevise=yes 和 -xannotate。
有关详细信息,请参见Oracle Developer Studio 12.5:代码分析器用户指南。
p 必须是 collect[ :profdir]、use[ :profdir] 或 tcov[ :profdir]。
此选项将会导致在执行期间收集并保存执行频率数据。在后续运行中,可以使用该数据来改进性能。对多线程应用程序来讲,分析收集 (Profile collection) 是一种安全的方法。也就是说,对执行其自己的多任务处理 (-mt) 的程序进行分析可产生准确的结果。只有指定 -xO2 或更高的优化级别时,此选项才有效。如果分别执行编译和链接,则链接步骤和编译步骤中必须都出现同一 -xprofile 选项。
在 -xprofile=use 时优化器收集并保存执行频率,以供将来使用。编译器生成可测量语句执行频率的代码。
-xMerge, -ztext, 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
分析目录名 profdir(如果指定)是包含已分析的对象代码的程序或共享库在执行时用来存储分析数据的目录路径名。如果 profdir 路径名不是绝对路径,在使用选项 -xprofile=use:profdir 编译程序时将相对于当前工作目录来解释该路径。
如果未使用 —xprofile=collect: prof_dir 或 —xprofile=tcov: prof_dir 指定任何分析目录名,则分析数据在运行时将存储在名为 program.profile 的目录中,其中 program 是已分析进程的主程序的根基名称。在此情况下,环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 可用于控制在运行时将分析数据存储在何处。如果已设置,分析数据将写入 $SUN_PROFDATA_DIR/$SUN_PROFDATA 指定的目录。如果在编译时指定了分析目录名,则 SUN_PROFDATA_DIR 和 SUN_PROFDATA 在运行时不起任何作用。这些环境变量同样控制由 tcov 写入的分析数据文件的路径和名称,如 tcov(1) 手册页中所述。
如果未设置这些环境变量,分析数据将写入当前目录中的目录 profdir.profile,其中 profdir 是可执行文件的名称或在 -xprofile=collect:profdir 标志中指定的名称。如果 profdir 已在 .profile 中结束,-xprofile 不会将 .profile 附加到 profdir 中。如果多次运行程序,那么执行频率数据会累积在 profdir.profile 目录中;也就是说,以前执行的输出不会丢失。
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何对象文件也使用 -xprofile=collect 进行链接。
以下示例在生成程序所在目录的 myprof.profile 目录中收集分析数据,然后使用这些分析数据:
demo: cc -xprofile=collect:myprof.profile -xO5 prog.c -o prog demo: ./prog demo: cc -xprofile=use:myprof.profile -xO5 prog.c -o prog
以下示例在目录 /bench/myprof.profile 中收集分析数据,然后在优化级别为 -xO5 的反馈编译中使用收集的分析数据:
demo: cc -xprofile=collect:/bench/myprof.profile \ -xO5 prog.c -o prog ...run prog from multiple locations.. demo: cc -xprofile=use:/bench/myprof.profile \ -xO5 prog.c -o prog
通过从使用 —xprofile=collect[: profdir] 或 —xprofile=tcov[: profdir] 编译的代码中收集的执行频率数据针对在执行已分析代码时执行的工作进行优化。profdir 是某个目录的路径名,该目录包含通过运行使用 —xprofile=collect[: profdir] 或 —xprofile=tcov[: profdir] 编译的程序收集的分析数据。
要生成 tcov 和 —xprofile=use[:profdir] 都能使用的数据,必须在编译时使用 —xprofile=tcov[:profdir] 选项指定一个分析目录。必须在 —xprofile=tcov: profdir 和 —xprofile=use: profdir 中指定相同的分析目录。为最大限度地减少混淆情况,请将 profdir 指定为绝对路径名。
profdir 路径名是可选的。如果未指定 profdir,将使用可执行二进制文件的名称。如果未指定 -o,将使用 a.out。如果未指定 profdir,编译器将查找 profdir.profile/feedback 或 a.out.profile/feedback。例如:
demo: cc -xprofile=collect -o myexe prog.c demo: cc -xprofile=use:myexe -xO5 -o myexe prog.c
程序是使用以前生成并保存在 feedback 文件中的执行频率数据优化的,此数据是先前执行用 -xprofile=collect 编译的程序时写入的。
除了 -xprofile 选项之外,源文件和其他编译器选项必须与用于编译(该编译过程创建了生成 feedback 文件的编译程序)的相应选项完全相同。编译器的相同版本必须同时用于 collect 生成和 use 生成。
如果用 -xprofile=collect:profdir 编译,则必须将相同的分析目录名 profdir 用在优化编译中:-xprofile=use: profdir。
另请参见 -xprofile_ircache,以了解有关加速 collect 阶段和 use 阶段之间的编译的说明。
如果指定了可选的 profdir 参数,则编译器将在指定位置创建分析目录。分析目录中存储的数据可通过 tcov(1) 或设置了 -xprofile=use:profdir 的编译器使用。如果省略可选的 profdir 路径名,则会在执行已分析的程序时创建分析目录。只能通过 tcov(1) 使用该分析目录中存储的数据。使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 可以控制分析目录的位置。
如果 profdir 指定的位置不是绝对路径名,则编译时会相对于当前工作目录来解释该位置。
由 profdir 指定位置的目录必须在要执行已进行分析的程序的所有计算机中都可以访问。除非不再需要分析目录中的内容,否则不应删除该目录,因为除非重新编译,否则编译器存储在其中的数据将无法恢复。
示例 1:如果用 -xprofile=tcov:/test/profdata 编译一个或多个程序的对象文件,编译器会创建一个名为 /test/profdata.profile 的目录并将其用来存储描述已分析的对象文件的数据。该同一目录还可在执行时用来存储与已进行分析的对象文件关联的执行数据。
示例 2:如果名为 myprog 的程序用 -xprofile=tcov 进行编译并在目录 /home/joe 中执行,将在运行时创建目录 /home/joe/myprog.profile 并将其用来存储运行时分析数据。
(SPARC) 将 -xprofile_ircache[=path] 与 -xprofile=collect|use 一起使用,通过重用 collect 阶段保存的编译数据来缩短 use 阶段的编译时间。
在编译大程序时,由于中间数据的保存,使得 use 阶段的编译时间大大减少。注意,所保存的数据会占用相当大的磁盘空间。
在使用 -xprofile_ircache[=path] 时,path 会覆盖保存缓存文件的位置。缺省情况下,这些文件会作为对象文件保存在同一目录下。collect 和 use 阶段出现在两个不同目录中时,指定路径很有用。以下示例显示了典型的命令序列:
example% cc -xO5 -xprofile=collect -xprofile_ircache t1.c t2.c example% a.out // run collects feedback data example% cc -xO5 -xprofile=use -xprofile_ircache t1.c t2.c
(SPARC) 如果同时还指定 -xprofile=use 命令,请使用 -xprofile_pathmap=collect_prefix:use_prefix 选项。 以下两个条件都成立且编译器无法找到使用 -xprofile=use 编译的对象文件的分析数据时,使用 -xprofile_pathmap。
使用 -xprofile=use 编译对象文件所在的目录与先前使用 -xprofile=collect 编译对象文件所在的目录不同。
对象文件在分析中共享公共基名,但可以根据它们在不同目录中的位置互相区分。
collect-prefix 是某个目录树的 UNIX 路径名的前缀,该目录树中的对象文件是使用 -xprofile=collect 编译的。
use-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的对象文件是使用 -xprofile=use 编译的。
如果指定了 -xprofile_pathmap 的多个实例,编译器将按照这些实例的出现顺序对其进行处理。将 -xprofile_pathmap 实例指定的每个 use-prefix 与对象文件路径名进行比较,直至找到匹配的 use-prefix 或发现最后一个指定的 use-prefix 与对象文件路径名也不匹配。
在自动并行化期间分析循环以了解约简操作。 只有在同时指定了 -xautopar 时,此选项才有效。否则,编译器会发出警告。
当启用了约简识别时,编译器会并行化约简,例如点积、最大与最小查找。这些约简产生的舍入与通过非并行化代码获得的舍入不同。
另请参见Oracle Developer Studio 12.5:OpenMP API 用户指南。
r 是一个逗号分隔列表,它包含下面的一个或多个子选项:appl、float、frameptr。
用 no% 作为子选项的前缀会禁用该子选项。
请注意,-xregs 子选项仅限于特定的硬件平台。
示例:
-xregs=appl,no%float
|
SPARC 缺省值为 -xregs=appl,float。
x86 缺省值为 -xregs=no%frameptr,float。
在 x86 系统中,-xpg 与 -xregs=frameptr 不兼容。这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr。
您应使用 -xregs=no%appl,float 编译用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要了解其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。
将赋值为指针的函数参数视为受限指针。f 为 %all、%none 或由下面的一个或多个函数名构成的逗号分隔列表:{%all|%none|fn[,fn...]}。
如果使用此选项指定了函数列表,则指定函数中的指针参数将被视为受限指针。如果指定了 -xrestrict=%all,则整个 C 文件中的所有指针参数都将被视为受限指针。有关更多信息,请参阅受限指针。
此命令行选项可以单独使用,但最好将其用于优化。例如,以下命令将 prog.c 文件中的所有指针参数都视为受限指针:
%cc -xO3 -xrestrict=%all prog.c
以下命令将文件 prog.c 中的函数 agc 的所有指针参数都视为限定指针:
%cc -xO3 -xrestrict=agc prog.c
缺省值为 %none。指定 -xrestrict 与指定 -xrestrict=%all 等效。
(Oracle Solaris) 将调试信息从对象文件链接到可执行文件。
-xs 与 -xs=yes 相同。
-xdebugformat=dwarf 的缺省值与 -xs=yes 相同。
-xdebugformat=stabs 的缺省值与 -xs=no 相同。
该选项控制可执行文件大小与为了调试而需要保留对象文件之间的权衡。对于 dwarf,请使用 -xs=no 使可执行文件保持较小但依赖于对象文件。对于 stabs,请使用 -xs 或 -xs=yes 以较大的可执行文件为代价避免对对象文件的依赖。该选项对程序的 dbx 性能或运行时性能几乎没有影响。
当编译命令强制链接时(即未指定 -c),没有对象文件和调试信息必须放置在可执行文件中。在这种情况下,将忽略 -xs=no(隐式或显式)。
该功能的实施方法是让编译器调整发出的对象文件中的节标志和/或节名称,然后告知链接程序对该对象文件的调试信息执行什么操作。因此它是一个编译器选项,而非链接程序选项。可以使一个可执行文件的某些对象文件使用 -xs=yes 进行编译,而其他对象文件使用 -xs=no 进行编译。
Oracle Linux 编译器接受 -xs 但会将其忽略。Oracle Linux 编译器不接受 -xs={yes|no}。
该选项允许在 SPARC V9 体系结构中使用无故障装入指令。
仅当与优化级别 –xO5 及以下 –xarch 值中的一个一起使用时,此选项才能有效:sparc、sparcvis、sparcvis2 或 sparcvis3(用于 –m32 和 –m64)。
启用或禁用编译器安全代码分析,以便在编译时查找和显示可能的内存安全违规。安全代码分析与编译进程并行运行,这可能会延长编译时间。
如果未指定 –xsecure_code_analysis 或在指定此选项时没有未为其指定 yes|no 参数,则缺省值为 –xsecure_code_analysis=yes。
使用 –xsecure_code_analysis=no 禁用安全代码分析。
(Oracle Solaris) 此选项使驱动程序在链接行上包括特殊映射文件。映射文件将文本、数据和 bss 段对齐到 n 指定的值。使用非常大的页面时,在适当的边界上对齐堆和堆栈段非常重要。如果未对齐这些段,将使用小页面直到下一个边界,这会导致性能下降。映射文件确保在适当边界上对齐段。
n 值必须是以下项之一:
SPARC:以下值有效:8K、64K、512K、2M、4M、32M、256M、1G 和 none。
x86:以下值有效:4K、8K、64K、512K、2M、4M、32M、256M、1G 和 none。
SPARC 和 x86 的缺省值为 none。
建议的用法如下所示:
SPARC 32-bit compilation: -xsegment_align=64K SPARC 64-bit compilation: -xsegment_align=4M x86 32-bit compilation: -xsegment_align=8K x86 64-bit compilation: -xsegment_align=4M
驱动程序将包括相应的映射文件。例如,如果用户指定 -xsegment_align=4M,驱动程序会将 -M install-directory/lib/compilers/mapfiles/map.4M.align 添加到链接行,其中 install-directory 是安装目录。然后,将在 4M 边界上对齐上述段。
将无后缀的浮点常量表示为单精度模式,而非缺省的双精度模式。 与 -pedantic 一起使用无效。
示例: 如果编译器增加代码大小,它不会解开循环或并行化循环。
此选项已过时,可能会在将来的发行版中删除。—xstrconst 是 —features=conststrings 的别名。
t 的值必须是下列值之一:native、generic 或 system-name。
例如,–xtarget=T3 等效于 –xchip=T3 –xcache=8/16/4:6144/64/24 –xarch=sparcvis3。
cc -dryrun -xtarget=T3 |& grep ### ### command line files and options (expanded): ### -dryrun -xchip=T3 -xcache=8/16/4:6144/64/24 -xarch=sparcvis3
数据类型模型(32 位或 64 位),由 –m32|–m64 选项指示。要指定 64 位数据类型模型,请如下所示使用 –m64 选项:
-xtarget=<value> ... -m64
要指定 32 位数据类型模型,请如下所示使用 –m32 选项:
-xtarget=<value> ... -m32
有关缺省数据类型模型的讨论,另请参见 –m32|–m64 选项。
|
通过为编译器提供目标计算机硬件的精确描述,某些程序的性能可得到提高。如果程序性能很关键,则合适的目标硬件规范可能非常重要,尤其是在较新版本的 SPARC 处理器上运行时。不过,对大多数程序和较旧的 SPARC 处理器来讲,性能的提高微不足道,因此指定 generic 就足够了。
|
|
指定 -xthreadvar 来控制线程局部变量的实现。将此选项与 __thread 声明说明符结合使用,可利用编译器的线程局部存储设备。 使用 __thread 说明符声明线程变量后,请指定 -xthreadvar,以便能够将线程局部存储用于动态(共享)库中的位置相关的代码(非 PIC 代码)。有关如何使用 __thread 的更多信息,请参见线程局部存储说明符。
o 必须为 dynamic 或 no%dynamic。
|
如果未指定 -xthreadvar,则编译器所用的缺省设置取决于是否启用与位置无关的代码。如果启用了与位置无关的代码,则该选项设置为 -xthreadvar=dynamic。如果禁用了与位置无关的代码,则该选项设置为 -xthreadvar=no%dynamic。
如果指定了 -xthreadvar 但未指定任何值,该选项将设置为 -xthreadvar=dynamic。
如果动态库包含与位置有关的代码,则必须指定 -xthreadvar。
链接程序不支持在动态库中与非 PIC 代码等效的线程变量。由于非 PIC 线程变量要快很多,因此应将其用作可执行文件的缺省设置。
另请参见 -xcode、-KPIC 和 -Kpic 的描述。
-xthroughput 选项可告知编译器当多个进程同时在系统上运行时应用程序将会运行。
如果 -xthroughput=yes,编译器首选这样的优化:会稍微降低单个进程的性能,同时提高系统上所有进程完成的工作量。例如,编译器可能会选择在预取数据时不太主动。这样的选择会减少该进程消耗的内存带宽,由此该进程运行速度可能会减慢,但是也会留出更多内存带宽供其他进程共享。
缺省值为 -xthroughput=no。
针对 K&R C 与 Oracle Developer Studio ISO C 之间的差异发出警告。
-xtransition 选项与 -Xa 和 -Xt 选项一起使用时将发出警告。通过适当编码,可以消除关于不同行为的所有警告消息。除非使用 -xtransition 选项,否则不再出现以下警告:
\a is ISO C “alert” character
\x is ISO C hex escape
bad octal digit
base type is really type tag: name
comment is replaced by “##”
comment does not concatenate tokens
declaration introduces new type in ISO C: type tag
macro replacement within a character constant
macro replacement within a string literal
no macro replacement within a character constant
no macro replacement within a string literal
operand treated as unsigned
trigraph sequence replaced
ISO C treats constant as unsigned: operator
semantics of operator change in ISO C; use explicit cast
-xtrigraphs 选项确定编译器是否识别 ISO C 标准定义的三字符序列。
缺省情况下,编译器假定 -xtrigraphs=yes 并识别整个编译单元的所有三字符序列。
如果源代码具有包含问号 (?) 的文字串(编译器将其解释为三字母序列),那么您可以使用 -xtrigraph=no 子选项禁用对三字母序列的识别。-xtrigraphs=no 选项可禁用对整个编译单元内的所有三字母的识别。
请考虑以下名为 trigraphs_demo.c 的源文件示例。
#include <stdio.h> int main () { (void) printf("(\?\?) in a string appears as (??)\n"); return 0; }
以下示例显示了使用 -xtrigraphs=yes 编译此代码时的输出。
example% cc -xtrigraphs=yes trigraphs_demo.c example% a.out (??) in a string appears as (]
以下示例显示了使用 -xtrigraphs=no 编译此代码时的输出。
example% cc -xtrigraphs=no trigraphs_demo.c example% a.out (??) in a string appears as (??)
-xunboundsym=yes 表示程序包含对动态绑定符号的引用。
-xunboundsym=no 表示程序不包含对动态绑定符号的引用。
缺省值为 -xunboundsym=no。
建议优化器解开循环 n 次。n 是正整数。 n 为 1 时,要求编译器不要解开循环。当 n 大于 1 时, -xunroll=n 建议编译器根据需要解开循环 n 次。
如果您需要支持使用 ISO10646 UTF-16 文本字符串的国际化应用程序,请使用此选项。 换句话说,如果代码中包含您希望在对象文件中由编译器转换成 UTF-16 字符串的文本字符串,请使用该选项。如果不指定此选项,编译器将既不生成、也不识别 16 位的文本字符串。此选项使编译器可以将 U"ASCII_string" 文本字符串识别成 unsigned short int 类型的数组。因为此类字符串还不属于任何标准,所以此选项启用对非标准 C 的识别。
通过指定 -xustr=no,可以关闭编译器识别 U"ASCII_string" 文本字符串。该选项在命令行上最右侧的实例覆盖了先前的所有实例。
缺省值为 -xustr=no。如果指定了没有参数的 -xustr,编译器将不接受该选项,而是发出一个警告。如果 C 或 C++ 标准定义了语法的含义,那么缺省设置是可以更改的。
可以指定 -xustr=ascii_utf16_ushort,而无需同时指定 U"ASCII_string" 文本字符串。
如果指定 -xustr=ascii_utf16_ushort 标志,则还必须指定以下选项之一:-Xc、-Xa、-Xt、-Xs、-xc99、-std=c99、-std=c89 或 -ansi。
不是所有文件都必须使用该选项编译。
以下示例显示了前置有 U 的带引号文本字符串。此外,还显示了用于指定 -xustr 的命令行。
example% cat file.c const unsigned short *foo = U"foo"; const unsigned short bar[] = U"bar"; const unsigned short *fun() { return foo;} example% cc -xustr=ascii_utf16_ushort file.c -c
8 位字符文字可以带有 U 前缀,以形成一个 unsigned short 类型的 16 位 UTF-16 字符。示例:
const unsigned short x = U'x'; const unsigned short y = U'\x79';
在支持 SIMD 的处理器上允许自动生成向量库函数的调用或生成 SIMD(Single Instruction Multiple Data,单指令多数据)指令。 使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
下表列出了 a 的值。no% 前缀可禁用关联的子选项。
|
在 x86 上,缺省设置为 –xvector=simd。在 SPARC 上,在 –xarch=sparcace 和 –xarch=sparcaceplus 下,缺省设置为 –xvector=simd,对于其他 SPARC –xarch 值,–xvector=%none。如果指定不带子选项的 -xvector,在 x86 Oracle Solaris、SPARC Solaris 和 Oracle Linux 平台上,编译器将分别采用 -xvector=simd,lib、-xvector=lib 和 -xvector=simd。
-xvector 选项需要 -xO3 或更高的优化级别。如果优化级别低于 -xO3,则在无提示的情况下忽略此选项。
在装入步骤中,编译器包含 libmvec 库。如果在不同的步骤中进行编译和链接,请对这两个命令使用相同的 -xvector 选项。
(SPARC) 在使用 vis.h 头文件生成 VIS 指令或使用汇编程序内联代码 (.il)(使用 VIS 指令)时,请使用 -xvis=[yes|no] 命令。 缺省值为 -xvis=no。指定 -xvis 与指定 -xvis=yes 等效。
VIS 指令集是 SPARC-V9 指令集的扩展。尽管 SPARC 处理器是 64 位的,但在很多情况下数据都限制在 8 位或 16 位范围内,特别是在多媒体应用程序中。VIS 指令可以用一条指令处理 4 个 16 位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高。
发出有关可能存在的并行编程相关问题的警告,这些问题可能导致在使用 OpenMP 时出现错误的结果。与 -xopenmp 和 OpenMP API 指令一起使用。
编译器在检测到下列情形时会发出警告。
循环是使用 MP 指令并行化的,而这些指令中的不同循环迭代之间存在数据依赖性
OpenMP 数据共享属性子句存在问题。例如,声明在 OpenMP 并行区域中的访问可能导致数据争用的变量 "shared",或者声明其在并行区域中的值在并行区域之后使用的变量 "private"。
如果所有并行化指令在处理期间均未出现问题,则不显示警告。
示例:
cc -xopenmp -vpara any.c
指定新目录 dir 作为组件 c 的位置。c 可以包含任何字符,这些字符表示 -W 选项下列出的组件。
如果已指定组件的位置,则工具的新路径名称为 dir/tool。如果对任何一项应用了多个 -Y 选项,则保留最后一个选项。
指定用来搜索所有编译器组件的目录 dir。 如果 dir 中找不到组件,搜索将转至安装编译器的目录。