cc [-#] [-###] [-Aname[(tokens)]] [-ansi] [-B[static|dy- namic]] [-C] [-c] [-D] [-d[y|n]] [-dalign] [-E] [-errfmt[=[no%]error]] [-errhdr[=h]] [-erroff[=t[,t...]]] [-errshort[=i]] [-errtags=a] [-errwarn[=t[,t...]]] [-fast] [-fd] [-features=[a]] [-flags] [-flteval[={any|2}]] [-fma[={none|fused}]] [-fnonstd] [-fns=[no|yes]] [-fopenmp] [-fprecision=p] [-fround=r] [-fsimple[=n]] [-fsingle] [-fstore] [-ftrap[=t[,t...]]] [-G] [-g] [-g[n]] [-H] [-hname] [-I[-|dir]] [-i] [-include] [-KPIC] [-Kpic] [-keeptmp] [-Ldir] [-lname] [-library=sunperf] [-m32|-m64] [-mc] [-misalign] [-misalign2] [-mr[,string]] [-mt] [-native] [-nofstore] [-O] [-On] [-ofilename] [-P] [-p] [-pedantic{=[yes|no]}] [-preserve_argvalues[=int|none]] [-Qoption phase [,option...]] [-Q[y|n]] [-qp] [-Rdir[:dir...]] [-S] [-s] [-staticlib=[no%]sunperf] [-std=value] [-temp=path] [-traceback[=list]] [-Uname] [-V] [-v] [-Wc,arg] [-w] [-X[c|a|t|s]] [-Xlinker arg] [-xaddr32[={yes|no}]] [-xalias_level[=a]] [-xanalyze={code|no}] [-xannotate] [-xarch=a] [-xautopar] [-xbinopt={a}] [-xbuiltin[=a]] [-xCC] [-xc99[=o]] [-xcache=c] [-xchar[=o]] [-xchar_byte_order[=o]] [-xcheck=n] [-xchip=c] [-xcode=v] [-xcsi] [-xdebugfor- mat=[stabs|dwarf]] [-xdebuginfo=a[,a...]] [-xdepend[={yes|no}]] [-xdryrun] [-xdumpmacros[=v[,v...]]] [-xe] [-xF[=v]] [-xglobalize[={yes|no}]] [-xhelp=f] [-xhwcprof[={enable|disable}]] [-xinline=[v[,v...]]] [-xinline_param=a[,a[,a]...]] [-xinline_report[=n]] [-xinstrument=[no%]datarace] [-xipo[=n]] [-xipo_archive[=a]] [-xipo_build=[yes|no]] [-xivdep[=p]] [-xjobs={n|auto}] [-xkeep_unref[={[no%]funcs,[no%]vars}]] [-xkeepframe[=p]] [-xlang=language] [-xldscope=[v]] [-xlibmieee] [-xlibmil] [-xlibmopt] [-xlicinfo] [-xlinkopt[=level]] [-xloopinfo] [-xM] [-xM1] [-xMD] [-xMF] [-xMMD] [-xMerge] [-xmaxopt[=v]] [-xmemalign=ab] [-xmodel=[a]] [-xnolib] [-xnolibmil] [-xnolibmopt] [-xnorunpath] [-xOn] [-xopenmp[=i]] [-xP] [-xpagesize=n] [-xpagesize_heap=n] [-xpagesize_stack=n] [-xpatchpadding[={fix|patch|size}]] [-xpec] [-xpch=v] [-xpchstop] [-xpentium] [-xpg] [-xprefetch[=val[,val]]] [-xprefetch_auto_type=[a] [-xprefetch_level=l] [-xprevise={yes|no}] [-xprofile=p] [-xprofile_ircache[=path]] [-xprofile_pathmap=collect_prefix:use_prefix] [-xreduction] [-xregs=r[,r...]] [-xrestrict[=f]] [-xs[={yes|no}]] [-xsafe=mem] [-xsegment_align=n] [-xsfpconst] [-xspace] [-xstrconst] [-xtarget=t] [-xtemp=path] [-xthreadvar[=o] [-xthroughput[={yes|no}]] [-xtime] [-xtransition] [-xtrigraphs[=[yes|no]] [-xunboundsym={yes|no}] [-xunroll=n] [-xustr={ascii_utf16_ushort|no}] [-xvector[=a]] [-xvis] [-xvpara] [-Yc,dir] [-YA,dir] [-YI,dir] [-YP,dir] [-YS,dir] [-Zll]
Oracle Solaris Studio 12.4 C 编译器版本 5.13。
本手册页详细介绍 Oracle Solaris Studio 12.4 发行版中 C 编译器可用的选项或标志。
Oracle 技术网 (Oracle Technical Network, OTN) Solaris Studio Web 站点上提供了本发行版的完整文档:
http://oracle.com/technetwork/server-storage/solarisstudio
OTN Web 站点提供了有关 Oracle Solaris Studio 的完整资源,包括许多技术文章,这些文章详细介绍了最佳实践,并深入探究了各种编程技术和其他主题。
有关 Oracle Solaris Studio 套件中所有新增特性和功能的完整描述,请参见“此发行版的新增功能”指南。
根据定义,手册页是指快速参考。有关 C 编译器及其选项的更多详细信息,请参见 C 用户指南。
分别使用 -m32 和 -m64 选项指定目标编译的内存模型 ILP32 或 LP64。
-xarch 选项不再承载隐式内存模型定义,只能用于指定目标处理器的指令集。
ILP32 模型指定 C 语言 int、long 和 pointer 数据类型均为 32 位。LP64 模型指定 long 和 pointer 数据类型均为 64 位。Oracle Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。
如果使用 -m64 进行编译,则生成的可执行文件仅能在运行 64 位内核的 Oracle Solaris OS 或 Linux OS 下的 64 位 SPARC 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Oracle Solaris 或 Linux OS 上进行。
针对 x86 Oracle Solaris 平台进行编译时,要注意一些重要问题。
在 -xarch 设置为 sse、sse2、sse2a 或 sse3 以及更高级别的情况下编译的程序必须仅在提供这些扩展和功能的平台上运行。
在本发行版中,-xarch=generic 的缺省指令集和含义已更改为 sse2。现在,如果在不指定目标平台选项的情况下进行编译,会导致 sse2 二进制与早期的 Pentium III 或早期的系统不兼容。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
-xarch=pentium_pro 或 -xarch=sse 的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用缺省 -xarch=sse2 进行编译。
因为内部数学库(例如,sin(x))不同,所以 Oracle Solaris 和 Linux 之间的数值结果也会不同。
自 Oracle Solaris 10 发行版起,链接程序将自动检查二进制对象与运行时硬件平台的兼容性。
使用专门的 -xarch 硬件标志编译和生成的程序二进制文件将由操作系统进行验证,验证它们是否在适当的平台上运行。如果在没有相应功能或指令集扩展的平台上运行使用专门的 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
但是,在 Linux 上,没有此类验证检查。在早期的硬件平台上运行由 Oracle Solaris Studio 编译器编译的二进制对象会导致运行时故障;在 Linux 上,用户负责在适当的硬件平台上部署这些二进制文件。
如果程序中采用的 .il 内联汇编语言函数或 __asm() 汇编程序代码使用了 SSE、SSE2、SSE2a、SSE3 以及更高版本的指令和扩展,则此警告也适用于这类程序。
cc (1) 手册页介绍了在当前的 Oracle Solaris 操作系统下符合 SVID 要求的 ISO C 编译器选项。请注意,缺省情况下,C 编译器识别 2011 ISO/IEC C 标准的某些构造。具体来说,C 用户指南中详细介绍了支持的功能。使用 -std 标志可将编译器限制到 ISO/IEC C 标准的特定版本。
cc 是 C 编译系统的接口。编译过程并入了预处理程序、编译器、代码生成器、优化器、汇编程序和链接编辑器。cc 将处理提供的选项,然后使用适当的参数执行各种组件。cc 接受多种类型的文件作为参数。
带有 .c 后缀的文件将当作 C 源文件,可能会进行预处理、编译、优化、检测分析、汇编和链接编辑。虽然预处理程序可以用作宏处理器,但是不建议这样做,因为它的输出倾向于用作有效 C 编译器的输入。如果提供了适当的选项,在任何一遍操作完成后,编译过程都可能会停止。
如果编译过程通过汇编程序运行,则将在当前的工作目录中生成对象文件,以 .o 后缀替换了 .c。但是,如果编译了单个 C 文件,然后立即对其进行链接编辑,则通常会删除 .o 文件。
带有 .s 后缀的文件将当作汇编源文件;它们可能会进行汇编和链接编辑。
带有 .S 后缀的文件将当作汇编源文件;它们可能会进行汇编和链接编辑。此类文件将先传递给预处理程序(Oracle Solaris 上的 /usr/ccs/lib/cpp),然后传递给汇编程序。
带有 .i 后缀的文件将当作预处理的 C 源文件,可能会进行编译、优化、检测分析、汇编和链接编辑。名称不是以 .c、.s、.S 或 .i 结尾的文件将传递给链接编辑器,链接编辑器将生成一个动态链接的可执行文件,缺省情况下其名称为 a.out。
要更改用于查找库的缺省目录,请查看选项 -Yc, dir。dir 是冒号分隔的路径列表。
通过使用 -### 或 -xdryrun 选项并检查 ld 调用的 -Y 选项,可查看缺省库搜索顺序。
通过缺省编译器选项文件,用户可以指定一组应用于所有编译的缺省选项,除非另行覆盖。例如,该文件可以指定所有编译的缺省级别为 -xO2,或自动包括文件 setup.il。
启动时,编译器会搜索缺省选项文件,并列出应对所有编译包含的缺省选项。环境变量 SPRO_DEFAULTS_PATH 指定要在其中搜索缺省文件的目录的冒号分隔列表。
如果该环境变量未设置,则会使用一组标准缺省设置。如果该环境变量已设置但为空,则不会使用任何缺省设置。
缺省文件名的格式必须为 compiler.defaults,其中 compiler 是以下项之一:cc、c89、c99、CC、ftn 或 lint。例如,C 编译器的缺省文件名应为 cc.defaults
如果在 SPRO_DEFAULTS_PATH 列出的目录中找到了适用于编译器的缺省文件,则编译器将读取该文件,并在处理命令行上的选项之前处理这些选项。系统将使用找到的第一个缺省文件,并且会终止搜索。
系统管理员可能会在 Studio-install-path/prod/etc/config 中创建适用于整个系统范围的缺省文件。如果设置了该环境变量,则不会读取已安装的缺省文件。
缺省文件的格式与命令行类似。该文件的每一行都可以包含一个或多个由空格分隔的编译器选项。Shell 扩展(例如通配符和替换)将不会应用于缺省文件中的选项。
SPRO_DEFAULTS_PATH 的值和完全扩展的命令行将显示在由选项 -#、-### 和 -dryrun 生成的详细输出中。
用户在命令行上指定的选项通常会优先于从缺省文件读取的选项。例如,如果缺省文件指定使用 -xO4 进行编译,而用户在命令行上指定了 -xO2,则将使用 -xO2 进行编译。
缺省选项文件中显示的某些选项将附加在命令行中指定的选项之后。这些选项包括预处理程序选项 -I,链接程序选项 -B、-L、-R 和 -l,以及所有文件参数(例如:源文件、对象文件、归档文件和共享对象)。
以下是如何使用用户提供的缺省编译器选项启动文件的示例。
demo% cat /project/defaults/cc.defaults -fast -I/project/src/hdrs -L/project/libs -llibproj -xvpara demo% setenv SPRO_DEFAULTS_PATH /project/defaults demo% cc -c -I/local/hdrs -L/local/libs -lliblocal tst.c
编译器命令现在等效于:
cc -fast -xvpara -c -I/local/hdrs -L/local/libs -lliblocal \ tst.c -I/project/src/hdrs -L/project/libs -llibproj
尽管编译器缺省文件提供了可为整个项目设置缺省值的便利方法,但它也可能成为问题难以诊断的原因。将环境变量SPRO_DEFAULTS_PATH设置为当前目录以外的绝对路径可避免出现此类问题。
缺省选项文件的接口稳定性未确定。选项处理顺序在以后的发行版中可能会更改。
在所有平台上都无提示接受所有特定于平台的选项。这项规则的任何例外都在特定选项下注明。
仅在 SPARC 平台上有效的选项标有 (SPARC)。仅在 x86/x64 平台上有效的选项标有 (x86)。
过时的选项标记为 (Obsolete)(已过时),以后不应再使用。提供它们只是为了与早期发行版兼容。请使用指定的替代选项。
有关链接程序选项,请参见 ld(1)。
通常,按从左向右的顺序处理编译器选项,允许选择性地覆盖宏选项。此规则不适用于链接程序或预处理程序选项。
在命令行选项语法中,方括号 ([]) 中显示的项目是可选的。花括号括起要选择的文字项目的竖线分隔列表,如 {yes | no | maybe} 中所示。当显示的标志不带值时,列表中的第一项通常表示缺省值。
例如,-someoption[={no|yes}] 意味着 -someoption 与 -someoption=no 相同。
以下选项由 cc 进行解释:
打开详细模式,显示如何扩展命令选项。显示调用的每个组件。
好像要进行调用一样显示每个组件,但不实际执行该组件。还显示命令选项扩展的过程。
将 name 作为谓词与指定的 tokens 关联,就好像通过 #assert 预处理指令进行关联一样。
Preassertions:system(unix) machine(sparc) (SPARC) machine(i386) (x86) cpu(sparc) (SPARC) cpu(i386) (x86)
以上内容在 -pedantic 模式下未预定义。
如果 -A 后面只跟一个短划线 (-),将导致所有预定义宏(以 __ 开头的宏除外)和预定义断言被忽略。
与 -std=c89 等效。
指定用于链接的库绑定是静态还是动态,可分别指明库是非共享的还是共享的。如果提供了 -lx 选项,-B dynamic 将使链接编辑器先查找名为 libx.so 的文件,然后查找名为 libx.a 的文件。-B static 将使链接编辑器仅查找名为 libx.a 的文件。此选项可作为一个切换开关在命令行中多次指定。
注意:在 Oracle Solaris 64 位编译环境中,许多系统库(例如 libc)只能作为动态库使用。因此,请勿在命令行上将 -Bstatic 用作最后一个切换开关。
此选项及其参数将传递给 ld。
禁止 C 预处理程序删除注释,位于预处理指令行上的注释除外。
针对未链接的每个源文件编译并生成 .o 文件。您可使用 -o 选项显式指定单个对象文件。当编译器生成每个 .i 或 .c 输入文件的对象代码时,始终会在当前工作目录中创建一个对象文件。如果抑制链接步骤,将会同时抑制删除对象文件。
使用可选参数定义宏,如同使用 #define 预处理指令定义宏一样。如果未指定 =expansion,则编译器假定为 =1。
Predefinitions:unix sparc (SPARC) sun
以上内容在 -pedantic 模式下未预定义。
这些预定义内容在所有模式下都有效:
__BUILTIN_VA_ARG_INCR __SUNPRO_C=0x5120 __SVR4 (Oracle Solaris) __SunOS_5_10 (Oracle Solaris) __SunOS_5_11 (Oracle Solaris) __amd64 (x86 -m64) __gnu__linux (linux) __i386 (x86) __linux (linux) __linux__ (linux) __sparc (SPARC) __sparcv8 (SPARC) __sparcv9 (SPARC -m64) __sun (Oracle Solaris) __unix __`uname -s`_`uname -r | tr . _` __x86_64 (x86 -m64) linux (x86, linux)
以下内容在未指定 -pedantic 以指示 _Restrict 关键字的可用性时使用任意 -std 标志进行预定义:
__RESTRICT
编译器还预定义以下类似于对象的宏,以指示可以识别 pragma:
__PRAGMA_REDEFINE_EXTNAME
允许或不允许动态链接。
-dy 指定链接编辑器中的动态链接,这是缺省值。-dn 指定链接编辑器中的静态链接。
此选项及其参数将传递给 ld。
注意:如果将此选项与动态库结合使用,将导致致命错误。大多数系统库仅作为动态库可用。
(SPARC)(已过时)您不应使用此选项。改用 -xmemalign=8s。有关已过时选项和标志的完整列表,请参见 C 用户指南。在 x64/x86 平台上忽略此选项。
仅通过预处理程序运行源文件并将输出发送到 stdout。预处理程序直接构建到编译器中,但在 -Xs 模式下除外,在该模式下会调用 /usr/ccs/lib/cpp。包含预处理程序行号信息。另请参见 -P 选项。
如果要将字符串 "error:" 作为前缀添加到错误消息开头,以使它们更容易与警告消息区分,请使用该选项。此前缀也可附加到通过 -errwarn 转换成错误的警告。
向所有错误消息添加前缀 "error:"。
不向任何错误消息添加前缀 "error:"。
如果不使用此选项,则编译器将其设置为 -errfmt=no%error。如果使用 -errfmt 但未提供值,则编译器会将其设置为 -errfmt=error。
使用该选项可将来自头文件的警告限制到由以下标志所指示的头文件组:
检查使用的所有头文件。
不检查任何头文件。
缺省值。检查所有用户头文件。不检查 /usr/include 及其子目录中的系统包含文件。不检查编译器提供的系统头文件。
禁止编译器警告消息,但是对错误消息无影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。
-erroff 值是逗号分隔列表的成员,该列表包含以下项中的一个或多个:
抑制由该 tag 指定的警告消息。可通过 -errtags=yes 选项来显示消息的标记。
启用由该 tag 指定的警告消息。
禁止所有警告消息。
启用所有警告消息。这是缺省值。
顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。
缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。
-erroff 选项只能抑制来自 C 编译器前端并在使用 -errtags 选项时显示标记的警告消息。您可以使用 #pragma 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。顺序很重要;例如,如果发出除标记之外的任何警告,%all,no%tag 会使 C 编译器以致命状态退出。
由于编译器错误检查的改善和功能的增加,C 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版本中编译时也可能出现错误。
只有来自 C 编译器前端在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C 编译器以失败状态退出。
缺省值为 -errwarn=%none。如果单独指定 -errwarn,与 -errwarn=%all 等效。
下表详细列出了 -errwarn 值:
在 tag 指定的消息作为警告消息发出时使 cc 以致命状态退出。如果未出现 tag,则没有影响。
在 tag 指定的消息仅作为警告消息发出时防止 cc 以致命状态退出。如果未出现 tag,则没有影响。为了避免在发出警告消息时导致 cc 以致命状态退出,可使用该选项来还原以前用该选项和 tag 或 %all 指定的警告消息。
如果发出了任何警告消息,将导致 cc 以致命状态退出。%all 可以后跟 no%tag,以避免该行为的特定警告消息。
防止 cc 在出现任何警告标记时以致命状态退出。这是缺省值。
该选项是一个宏,您可以有效地将其用作调优可执行文件以获得最高运行时性能的起点。-fast 的扩展可从一个编译器发行版更改为下一个发行版,并且包括特定于目标平台的选项。可使用 -# 或 -xdryrun 选项检查 -fast 的扩展选项,并将 -fast 的相应选项结合到正在进行的可执行文件优化过程中。
-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见本手册页中 -xlibmopt 的描述。
-fast 选项影响 errno 的值。有关更多信息,请参见本手册页结尾的“附注”部分。
用 -fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
-fast 选项不适于计划在编译机器之外的其他目标机器上运行的程序。在这种情况下,请在 -fast 后附带相应的 -xtarget 选项。例如:
% cc -fast -xtarget=generic
对于依赖于 SUID 指定的异常处理的 C 模块,请在 -fast 后附带 -xnolibmil -xbuiltin=%default
% cc -fast -xnolibmil -xbuiltin=%default
-fast 选项的作用与命令行上的宏扩展相同。因此,您可以通过在 -fast 后面附加所需选项来覆盖任何扩展选项。
如果将 -fast 与其他选项相结合,最后一项规范适用。
为 -fast 启用以下选项:
-fma=fused (SPARC, x86) -fns (SPARC, x86) -fsimple=2 (SPARC, x86) -fsingle (SPARC, x86) -nofstore (x86) -xalias_level=basic (SPARC, x86) -xbuiltin=%all (SPARC, x86) -xdepend (SPARC, x86) -xlibmil (SPARC, x86) -xlibmopt (SPARC, x86) -xmemalign=8s (SPARC) -xO5 (SPARC, x86) -xregs=frameptr (x86) -xtarget=native (SPARC, x86)
请注意,这些组件选项标志会随各个编译器发行版而发生变化。有关由 -fast 设置的选项的详细信息,请参见 C 用户指南。
要在正在运行的系统上确定 -fast 的扩展,请执行命令:
cc -fast -xdryrun |& grep ###
注意:有些优化对程序行为进行特定假定。如果程序不符合这些假定,应用程序可能会失败或产生错误结果。请参阅各个选项的描述,以确定您的程序是否适合用 -fast 编译。
请勿对依赖于 IEEE 标准异常处理的程序使用此选项;否则会产生不同的数值结果、程序提前终止或意外的SIGFPE信号。
x86 上的 -fast 选项包括 -xregs=frameptr。请确保阅读 -xregs=frameptr 的介绍,特别是编译混合 C、Fortran 和 C++ 源代码时。
报告 K&R 函数声明和定义。
缺省情况下,编译器对外部内联函数的处理方式遵循 ISO/IEC 9899:1999 C 标准指定的行为。使用 -features=no%extinl 编译新代码可获得与 5.5 或更低版本 C 和 C++ 编译器相同的外部内联函数处理方式。
旧的 C 和 C++ 对象(C/C++ 5.6 之前)可以与新的 C 和 C++ 对象链接,而不会更改旧对象的行为。要获得符合标准的行为,必须使用当前编译器重新编译旧代码。
下表列出了 a 的可能值。前缀 no% 可禁用子选项。
启用或禁用将文本字符串放置在只读内存中。缺省值为 -features=conststrings,它取代了过时的 -xstrconst 选项。请注意,程序将无法在缺省编译模式下写入文本字符串,如同您在命令行上指定了 -xstrconst 一样。
允许/禁止零大小的结构/联合声明以及返回语句返回一个值的 void 函数起作用。
将外部内联函数生成为全局函数。这是缺省值,符合 1999 C 标准。
将外部内联函数生成为静态函数。
启用/禁用typeof运算符的识别。运算符的类型返回其参数(表达式或类型)的类型。它在语法上的指定类似 sizeof 运算符,但在语义上的行为类似通过 typedef 定义的类型。因此,可以将其用在可使用typedef的任意位置。例如,可将其用在声明、强制类型转换中,也可用在 sizeof 或 typeof 的内部。缺省值为 -features=typeof。
选项 -features=%none 已过时,应替换为 -features=no% 后跟子选项。
示例:
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 */
运算符的类型在宏定义(其中参数可以是任意类型)时特别有用。例如:
#define SWAP(a,b) { typeof(a) temp; temp = a; a = b; b = temp; }
与 -xhelp=flags 相同。输出可用选项的一行摘要信息。
(x86) 使用该选项可控制如何对浮点表达式求值。
浮点表达式求值为双精度长型。
根据构成表达式的变量和常量类型的组合来对浮点表达式进行求值。
如果未指定 -flteval,编译器会将其设置为 -flteval=any。如果指定了 -flteval 但未提供值,则编译器会将其设置为 -flteval=2。
-flteval=2 仅可以与 -xarch=sse、pentium_pro、ssea 或 pentium_proa 一起使用。
-flteval=2 也不能与选项 -fprecision 或 -nofstore 结合使用。
有关更多信息,请参见 C 用户指南附录 E 中的“浮点计算器的精度”。
启用自动生成浮点混合乘加指令。-fma=none 禁用这些指令的生成。-fma=fused 允许编译器通过使用浮点混合乘加指令,尝试寻找改进代码性能的机会。
缺省值为 -fma=none。
要生成混合乘加指令,最低体系结构要求是 -xarch=sparcfmaf(对于 SPARC)和 -xarch=avx2(对于 x86)。如果生成了混合乘加指令,编译器会标记此二进制程序,以防止该程序在不支持混合乘加指令的平台上执行。如果未使用最低体系结构,则 -fma=fused 没有作用。
混合乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 -fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。
用于 -fns 和 -ftrap=common 的宏。
对于 SPARC,请选择 SPARC 非标准浮点模式。
对于 x86,选择 SSE 刷新为零模式,以及非正规数为零模式(如果可用)。此选项导致在 x86 上将次正规结果刷新为零。如果可用的话,此选项还导致将次正规操作数视为零。此选项对不使用 SSE 或 SSE2 指令集的传统 x86 浮点运算没有影响。
缺省值为 -fns=no,即标准浮点模式。
可以选择使用 =yes 或 =no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。
-fns 与 -fns=yes 相同。-fns=yes 选择非标准浮点。-fns=no 选择标准浮点。
在一些 SPARC 系统上,使用非标准浮点模式会禁用“渐进下溢”,导致将微小的结果刷新为零,而不是产生非正规数。此外,还会导致次正规操作数在无提示的情况下替换为零。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。
在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。有关详细信息,请参见《数值计算指南》。
在 SPARC 系统上,只有编译主程序时此选项才有效。
与 -xopenmp=parallel 相同。
(x86) 将浮点控制字中的舍入精度模式位初始化为 p,它为 single(24 位)、double(53 位)或 extended(64 位)之一。缺省的浮点舍入精度模式为 extended。
注意,在 x86 中,浮点舍入精度模式的设置只影响精度,不影响指数、范围。
该选项仅在 x86 系统上且仅在编译主程序时使用才有效,但如果针对 64 位平台 (-m64) 或启用 SSE2 的处理器 (-xarch=sse2) 进行编译,将忽略该选项。在 SPARC 平台上忽略 -fprecision。
设置在程序初始化过程中在运行时建立的 IEEE 754 舍入模式。
r 必须是以下值之一:nearest、tozero、negative、positive。
缺省值为 -fround=nearest。
含义与 ieee_flags 子例程的含义相同。
如果 r 为 tozero、negative 或 positive,此标志将导致程序开始执行时舍入方向模式分别设置为舍入到零、舍入到负无穷大或舍入到正无穷大。当 r 为 nearest 或未使用 -fround 标志时,舍入方向模式将保留其初始值不变(缺省为舍入到最接近的值)。
只有编译主程序时该选项才有效。
请注意,使用 -xvector 或 -xlibmopt 进行编译时需要具有缺省的舍入模式。与使用 -xvector 或 -xlibmopt(或同时使用两者)编译的库链接的程序必须确保缺省舍入生效。
允许优化器简化关于浮点运算的假定。
编译器缺省采用 -fsimple=0。指定 -fsimple 与指定 -fsimple=1 等效。
如果存在 n,它必须是 0、1 或 2。
允许无简化假定。保持严格的 IEEE 754 符合性。
允许保守简化。结果代码未严格符合 IEEE 754。
在 -fsimple=1 的情况下,优化器可假定:
在进程初始化之后,IEEE 754 缺省舍入/捕获模式不发生改变。
可以删除不生成可见结果(潜在的浮点异常除外)的计算
使用无穷大或 NaN 作为操作数的计算不需要将 NaN 传送到它们的结果中。例如,x*0 可以用 0 替换。
计算不依赖于零的符号。
在 -fsimple=1 的情况下,不允许优化器不考虑舍入或异常进行完全优化。特别是,在运行时舍入模式包含常量的情况下,浮点计算不能由产生不同结果的计算替换。
包含 -fsimple=1 的所有功能,当 -xvector=simd 生效时,还允许使用 SIMD 指令计算约简。
此外,还允许主动浮点优化,这可能导致很多程序因舍入更改而产生不同数值结果。例如,-fsimple=2 允许优化器尝试将给定循环中 x/y 的所有计算都替换为 x*z,其中保证在循环中至少对 x/y 进行一次求值,z=1/y,并且已知 y 和 z 的值在循环执行期间具有常量值。
即使在 -fsimple=2 的情况下,也仍然不允许优化器在不生成任何内容的程序中引入浮点异常。
有关优化如何影响精度的更详细说明,另请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance Computing》。另请参见 OTN Oracle Solaris Studio Web 站点 (oracle.com/technetwork/server-storage/solarisstudio/) 上有关性能和精度的文章
(仅 -Xt 和 -Xs 模式)缺省情况下,-Xs 和 -Xt 遵循浮点表达式的 K&R C 规则,方法是将其提升到 double,并以双精度对其进行求值。指定 -Xs 或 -Xt 时使用 -fsingle 标志可使编译器将浮点表达式求值为单精度值。
(x86) 使编译器在将浮点表达式或函数赋值给一个变量时或者该表达式转换为短浮点类型时,将该表达式或函数的值转换为赋值左侧的类型,而不是将值留在寄存器中。由于舍入和截断,结果可能会与寄存器值所生成的结果不同。这是缺省模式。要禁用此选项,请使用 -nofstore 选项。
设置在启动时有效的 IEEE 754 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。
使用前缀 no% 可从 %all 或 common 中删除子选项。
在除以零时自陷。
在结果不精确时自陷。
在操作无效时自陷。
在溢出时自陷。
在下溢时自陷。
在所有以上内容中自陷。
不在以上任何内容中自陷。
在无效、除以零和溢出时自陷。
缺省值为 -ftrap=%none。
注意,选项的 no% 形式只用于修改 %all 或 common 值的含义,且必须与其中的一个值一起使用,如以下示例所示。选项自身的 [no%] 形式不会显式导致禁用特定的陷阱。
示例:-ftrap=%all,no%inexact 表示设置除 inexact 以外的所有陷阱。
如果使用 -ftrap=t 编译一个例程,就要使用相同的 -ftrap=t 选项编译程序的所有例程;否则,会得到意外结果。
使用 -ftrap=inexact 陷阱时一定要格外小心,因为只要浮点值不能精确表示,便会产生自陷。例如,以下语句可能会产生这种情况:
x = 1.0 / 3.0;
生成共享对象而非动态链接的可执行文件。该选项将传递给 ld,不能与 -dn 选项一起使用。
使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 选项。
如果通过指定 -G 以及其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在与生成的共享对象链接时也指定这些选项。
创建共享对象时,针对 64 位 SPARC 体系结构编译的所有对象文件也必须使用某个显式 -xcode 值进行编译,如 -xcode 说明下所述。
请参见 -g[n]。
为 dbx(1) 和性能分析器 analyzer(1) 生成附加的符号表信息。
如果指定 -g,并且优化级别为 -xO3 或更低,则编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化和后端内联被禁用。
如果指定 -g,并且优化级别为 -xO4,则编译器会为完全优化提供尽可能多的符号信息。
使用 -g 选项进行编译,以使用性能分析器的全部功能。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和性能分析器手册。
使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。
如果在不同的步骤中编译和链接程序,则在一个步骤中使用 -g 选项而在另一个步骤中不使用该选项不会影响程序的正确性,但会影响调试程序的能力。对于未使用 -g 编译但使用 -g 链接的任何模块,将不能为调试做好妥善准备。请注意,要进行调试,通常需要使用 -g 选项对包含函数 main 的模块进行编译。
-g 作为宏实施,扩展到多个其他更原始的选项。有关扩展的详细信息,请参见 -xdebuginfo。
值:
生成标准调试信息。
不生成任何调试信息。这是缺省值。
生成文件和行号以及在事后调试期间视为至关重要的简单参数信息。
与 -g 相同。
生成附加调试信息,当前只包括宏定义信息。与仅使用 -g 相比,此附加信息会增大生成的 .o 和可执行文件中调试信息的大小。
将当前编译过程中所包含的每个文件的路径名输出为标准错误,一行一个。
为共享动态库分配一个名称;允许您保留不同版本的库。
一般而言,-h 后面的 name 应该与在 -o 选项中提供的文件名相同。-h 和 name 之间的空格是可选的。
链接程序会为该库分配指定的 name,并在库文件中将该名称记录为库的内部名称。如果没有 -h name 选项,则没有内部名称记录在库文件中。
当运行时链接程序将库装入可执行文件时,会将内部名称从库文件复制到可执行文件的所需共享库文件列表中。每个可执行文件都有这样的列表。如果没有共享文件的内部名称,链接程序就复制共享库文件的路径。
-Idir 可将 dir 添加到从中搜索 #include 文件的目录列表。-I 值从左至右进行累积。
对于 #include <foo.h> 形式的 include 语句,预处理程序将按以下顺序搜索头文件:
以 -I 选项命名的目录(如果有)。
编译器和系统标准目录,通常是 /usr/include。
对于 #include "foo.h" 形式的 include 语句,编译器将按以下顺序搜索目录:
当前目录(即包含 include 语句本身的文件所在的目录)。
以 -I 选项命名的目录(如果有)。
编译器和系统标准目录,通常是 /usr/include。
-I- 可将包含文件搜索规则更改为:
编译器从不搜索当前目录,除非在 -I 指令中显式列出了该目录。甚至是形式为 #include "foo.h" 的包含语句,也是这种情况。
对于 #include "foo.h" 形式的包含文件,按以下顺序搜索目录:
使用 -I 选项指定的目录(在 -I- 前后)。
编译器和系统标准目录,通常是 /usr/include。
对于 #include <foo.h> 形式的包含文件,按以下顺序搜索目录:
使用 -I 选项指定的在 -I- 后面显示的目录(即编译器不搜索在 -I- 前面显示的 -I 目录)。
编译器和系统标准目录,通常是 /usr/include。
只有命令行上的第一个 -I- 选项的作用如上所述。
-Idir 在 dir 中 usr/include 的前面查找名称不是以斜杠 (/) 开头的包含的文件。以指定的顺序搜索多个 -I 选项的目录。
警告:
任何时候都不要将编译器安装区域 /usr/include、/lib、/usr/lib 指定为搜索目录。
忽略 LD_LIBRARY_PATH 和 LD_LIBRARY_PATH_64 设置。
此选项使编译器处理 filename 的方式就相当于它是位于主源文件首行的 #include 预处理程序指令。
编译器在其中搜索 filename 的第一个目录是当前工作目录而不是包含主源文件的目录,这就是显式包括某个文件时的情况。如果编译器在当前工作目录中找不到 filename,则会在正常目录路径中搜索。如果您指定多个 -include 选项,则文件的包括顺序与它们在命令行中的顺序相同。
(SPARC)(已过时)您不应使用此选项。改用 -xcode=pic32。有关已过时选项和标志的完整列表,请参见 C 用户指南。
(x86) -KPIC 与 x86 体系结构上的 -Kpic 相同。
(SPARC)(已过时)您不应使用此选项。改用 -xcode=pic13。有关已过时选项和标志的完整列表,请参见 C 用户指南。
(x86) 生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。
保留编译过程中创建的临时文件而不自动删除这些文件。
将 dir 添加到要按 ld 在其中搜索库的目录列表。此选项及其参数将传递给 ld。
警告:
任何时候都不要将编译器安装区域 /usr/include、/lib、/usr/lib 指定为搜索目录。
与对象库 libname .so 或 libname.a 链接(对于 ld(1))。库在命令行中的顺序很重要,因为符号是从左向右进行解析。此选项必须位于 sourcefile 之后。
与 Oracle Solaris Studio 提供的性能库进行链接。
指定编译的二进制对象的内存模型。
使用 -m32 创建 32 位可执行文件和共享库。使用 -m64 创建 64 位可执行文件和共享库。
在所有 Oracle Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、pointer 数据类型)是缺省值。在启用了 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和指针数据类型)。-m64 仅允许在支持 LP64 模型的平台上使用。
使用 -m32 编译的对象文件或库不能同使用 -m64 编译的对象文件或库链接。
使用 -m64 编译具有大量静态数据的应用程序时,可能还需要 -xmodel=medium。请注意,部分 Linux 平台不支持中等模型。
使用 -m32|-m64 编译的模块还必须使用 -m32 |-m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
注意,在以前的编译器发行版中,通过选择带有 -xarch 的指令集来实现内存模型 ILP32 或 LP64 。从 Sun Studio 12 编译器开始,就不再是这样了。在大多数平台上,仅需向命令行添加 -m64 即可创建 64 位对象。
在 Oracle Solaris 上,-m32 为缺省值。在支持 64 位程序的 Linux 系统上,缺省为 -m64 -xarch=sse2。
另请参见:-xarch。
从对象文件的 .comment 部分中删除重复字符串。使用 -mc 标志时,会调用 mcs -c。
(SPARC)(已过时)您不应使用此选项。应改用 -xmemalign=1i 选项。有关已过时选项和标志的完整列表,请参见 C 用户指南。
(SPARC)(已过时)您不应使用此选项。应改用 -xmemalign=2i 选项。有关已过时选项和标志的完整列表,请参见 C 用户指南。
-mr 可从对象文件的 .comment 部分中删除所有字符串。使用 -mr 标志时,会调用 mcs -d。
-mr,string 可从 .comment 部分中删除所有字符串,并在对象文件的 .comment 部分插入 string。如果 string 包含嵌入空白,则必须将其括入引号。如果 string 为空,.comment 部分将为空。使用此标志时,会调用 mcs -d -a。
使用此选项,可以通过 Oracle Solaris 线程或 POSIX 线程 API 编译和链接多线程代码。-mt=yes 选项确保按正确的顺序链接库。
此选项将 -D_REENTRANT 传递给预处理程序。
要使用 Oracle Solaris 线程,请包括 thread.h 头文件并使用 -mt=yes 选项进行编译。要在 Oracle Solaris 平台上使用 POSIX 线程,请包括 pthread.h 头文件并使用 -mt=yes 选项进行编译。
在 Linux 平台上,只有 POSIX 线程 API 可用。(Linux 平台上没有 libthread)。因此,Linux 平台上的 -mt=yes 会添加 -lpthread,而不是 -lthread。要在 Linux 平台上使用 POSIX 线程,请使用 -mt 进行编译。
请注意,当使用 -G 进行编译时,-ltread 和 -lpthread 均不会自动包括在 -mt=yes 内。生成共享库时,您需要显式列出这些库。
-xopenmp 选项(用于使用 OpenMP 共享内存并行化 API)自动包括 -mt=yes。
如果使用 -mt=yes 进行编译并在单独的步骤中进行链接,则除了在编译步骤中外,还必须在链接步骤中使用 -mt=yes 选项。如果使用 -mt=yes 编译和链接一个转换单元,则必须使用 -mt=yes 编译和链接该程序的所有单元。
-mt=yes 是编译器的缺省行为。如果不想出现该行为,请使用选项 -mt=no。
选项 -mt 等效于 -mt=yes。
另请参见:-xnolib
此选项等效于 -xtarget=native。
(x86) 取消命令行上的 -fstore。取消强制表达式具有 -fstore 调用的目标变量精度。
-nofstore 由 -fast 调用。正常情况下,缺省值为 -fstore。
使用缺省优化级别 -xO3。但是,对于依赖于被自动视为 volatile 的所有变量的程序,-xO3 可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的旧版多线程应用程序。解决方法是使用 -xO2 而非 -O 进行编译。
与 -xOn 相同。
将输出文件命名为 filename,而非缺省的 a.out。filename 不能与 sourcefile 相同,因为 cc 不会覆盖源文件。
filename 必须具有合适的后缀。当与 -c 一起使用时,filename 指定目标 .o 对象文件;当与 -G 一起指定时,它指定目标 .so 库文件。此选项及其参数将传递给 ld。
仅预处理指定的 C 文件,将结果保留在后缀为 .i 的相应文件中。输出将不包含任何预处理行指令,这与 -E 不同。
(已过时)请参见 -xpg。
严格遵循非 ANSI 构造的错误/警告。-std 标志可用于指定生效的 ANSI 标准。-Xc、-Xa、-Xt、-Xs 和 -xc99 标志不能与 -pedantic 标志一起指定。这样做会导致编译器发出错误。
如果未指定 -pedantic,则第一个缺省为 -pedantic=no。
第二个缺省值等效于 pedantic=yes。
(x86) 在堆栈中保存基于寄存器的函数参数的副本。
如果指定了 none 或者如果未在命令行上指定 -preserve_argvalues 选项,则编译器行为像往常一样。
指定 simple 时,最多保存六个整数参数。
指定 complete 时,堆栈跟踪中所有函数参数的值按正确顺序显示给用户。
对于形式参数的赋值,值在函数生命周期内不会更新。
将 option 传递到编译 phase。
要传递多个选项,按照逗号分隔列表的顺序指定它们。可以对使用 -Qoption 传递给组件的选项进行重新排序。驱动程序识别的选项将按正确顺序排列。对于驱动程序已识别的选项,请勿使用 -Qoption。
下表显示了 phase 的可能值和 -Wc,arg 的相应参数
Qoption phase W<c> ===== ==== fbe a Assembler: (fbe), (gas) cg c C code generator: (cg)(SPARC) driver d cc driver (1) ld l Link editor (ld) mcs m mcs ipo O (Capital letter 'O') Interprocedural optimizer postopt o Postoptimizer cpp p Preprocessor (cpp) ube u C code generator (ube), (x86) acomp 0 (The number zero) Compiler acomp iropt 2 Optimizer: (iropt)
另请参见:-Wc,arg
将标识信息发送到输出文件或不将标识信息发送到输出文件。如果使用 y,则将关于每个调用的编译工具的标识信息添加到输出文件中(缺省行为)。这对于软件管理很有用。-Qn 会禁止该信息。
与 -p 相同。
冒号分隔的目录列表,用于指定运行时链接程序的库搜索目录。如果列表存在且不为空,将在输出对象文件中记录列表并将其传递给运行时链接程序。
如果同时指定了 LD_RUN_PATH 和 -R 选项,则 -R 选项优先。
编译但不汇编或链接编辑指定的 C 文件。汇编程序语言输出将留在后缀为 .s 的对应文件中。
从输出对象文件中删除所有符号调试信息。该选项传递给 ld(1)。该选项不能与 -g 一起指定。
与 -library=sunperf 一起使用时,-staticlib=sunperf 将与 Sun 性能库静态链接。缺省情况下,如果指定了 -library=no%sunperf,-library=sunperf 会导致动态链接 Sun 性能库。
为了与 CC 兼容,%all 和 %none 也是 -staticlib 接受的值,其中 %all 等效于 sunperf,%none 等效于 no%sunperf。
C 语言标准选择标志。
value 定义为以下几项之一:
接受的由 ISO C90 标准定义的 C 源代码语言。
接受的由 ISO C99 标准定义的 C 源代码语言。
接受的由 ISO C11 标准定义的 C 源代码语言。
第一个缺省值是 c11,表示接受由 ANSI C11 定义的 C 源代码语言与扩展。没有第二个缺省值。而不带值的 -std 规范将生成错误。
如果指定了标志 -Xc、-Xa、-Xt 或 -xtransition 中的任何一个,则 -std 的第一个缺省值不会生效,编译器缺省采用 -xc99=all,no_lib。如果指定了 -Xs,则第一个缺省值不会生效,编译器缺省采用 -xc99=none。如果指定了 -xc99,则 -std 的第一个缺省值不会生效,编译器采用的值由 -xc99 指定。
如果指定了 -std 标志,则无法使用 -Xc、-Xa、-Xt、-Xs 和 -xc99 标志。这样做会导致编译器发出错误。
如果在不同的步骤中编译和链接,则必须在两个步骤中为 -std 标志使用相同的值。
为临时文件定义目录。
该选项将 path 设置为在编译过程中生成的临时文件的目录。对于 -temp 设置的值和 TMPDIR 值,编译器优先采用前者。
另请参见:-keeptmp
如果执行中出现严重错误,将发出堆栈跟踪。
当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出堆栈跟踪、信息转储并退出。如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪。
要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,除非生成可执行二进制文件,否则将忽略此选项。使用 -traceback 和 -G 创建共享库是个错误。
禁用回溯。
指定如果生成一组常见信号(sigill、sigfpe、sigbus、sigsegv 和 sigabrt)中的任何一个,则应该发出堆栈跟踪。
指定应生成堆栈跟踪的信号名称的逗号分隔列表,采用小写形式。可以捕捉以下信号(导致生成信息转储文件的信号):sigquit、sigill、sigtrap、sigabrt、sigemt、sigfpe、sigbus、sigsegv、sigsys、sigxcpu 和 sigxfsz。
在上述任一信号前加上 no% 可以禁用信号缓存。
例如:如果生成 sigsegv 或 sigfpe,-traceback=sigsegv,sigfpe 将生成堆栈跟踪和信息转储。
如果不指定该选项,则缺省值为 -traceback=%none。
没有任何 = 号的 -traceback 表示 -traceback=common。
如果不需要信息转储,用户可以使用以下方法将 coredumpsize 限制设置为零:
% limit coredumpsize 0
-traceback 选项不影响运行时性能。
使 name 的任何定义取消定义。此选项可删除由 -D 在同一命令行上创建的预处理程序符号 name 的任何初始定义,包括由命令行驱动程序放置的那些定义。
-U 对源文件中的预处理程序指令没有任何影响。可以在命令行上提供多个 -U 选项。
如果为 -D 和 -U 指定了相同的 name,则 name 未定义,而不管选项的顺序如何。
使调用的每个工具将版本信息输出到标准错误输出。
使编译器执行更多且更严格的语义检查,并对指定的 C 文件启用某些类似 lint 的检查。
将参数 arg 传递到 c。每个参数与前一个参数之间必须仅以逗号分隔。(逗号可以是参数的一部分,方法是紧挨在逗号前面添加反斜杠 (\) 字符对其进行转义;反斜杠将从生成的参数中删除。)所有 -W 参数均在常规命令行参数之后进行传递。
c 可以是以下值之一:
汇编程序:(fbe)、(gas)
C 代码生成器:(cg)(SPARC)
cc 驱动程序 (1)
链接编辑器 (ld)
mcs
(大写字母 'O')过程间优化器
后优化器
预处理程序 (cpp)
C 代码生成器 (ube),(x86)
(数字零)编译器 (acomp)
优化器:(iropt)
(1) 注意:不能使用 -Wd 将本手册页中列出的 cc 选项传递给 C 编译器。
例如,-Wa,-o,objfile 可按相应的顺序将 -o 和 objfile 传递给汇编程序;此外,-Wl,-I,name 可使链接阶段覆盖动态链接程序 /usr/lib/ld.so.1 的缺省名称。
将参数传递给工具的顺序(相对于所指定的其他命令行选项)可能会更改。
抑制编译器警告消息。
该选项会覆盖 error_messages pragma。
(已过时)在以后的发行版中将删除 -Xs 选项。建议正确迁移需要使用 -Xs 进行构建和编译的 C 代码,以至少符合 ISO C 标准的 C99 版本 (dialect),即与 -std=c99 兼容。
如果指定了 -std 或 -xlang 标志,则无法使用 -Xc、-Xa、-Xt 和 -Xs 标志。
不使用 -std 标志时,-X 选项可指定符合 1990 和 1999 ISO C 标准的各种级别。-xc99 的值影响 -X 选项所应用的 ISO C 标准的版本。
严格符合 ISO C(不包含 K&R C 兼容性扩展)。编译器对使用非 ISO C 构造的程序发出错误和警告。如果使用 -Xc 选项,预定义的宏 __STDC__ 的值为 1。
ISO C 以及 K&R C 兼容性扩展,具有 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果 -Xa 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。如果使用 -Xa 选项,预定义的宏 __STDC__ 的值为 0。
此选项使用 ISO C plus K&R C 兼容性扩展,不带 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 K&R C 解释。如果将 -Xt 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。如果使用 -Xt 选项,预定义的宏 __STDC__ 的值为 0。
编译器会尝试对在 Oracle Solaris Studio ISO C 和 K&R C 之间具有不同行为的所有语言构造发出警告。调用 cpp 进行处理。__STDC__ 在该模式下未定义。
对于 -Xt 和 -Xa,预定义的宏 __STDC__ 的值为 0;对于 -Xc,其值为 1。(没有为 -Xs 定义。)关于不同行为的所有警告消息均可通过适当编码消除;例如,使用强制类型转换可消除整型提升更改警告。
将 arg 传递给链接程序 ld (1) 。
等效于 -Wl,arg。
(x86/x64) -xaddr32=yes 编译标志可将生成的可执行文件或共享对象限制到 32 位地址空间。
以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。
指定 -xaddr32=no 时,会生成常见的 64 位二进制文件。
如果未指定 -xaddr32 选项,则假定 -xaddr32=no。
如果仅指定了 -xaddr32,则假定 -xaddr32=yes。
此选项仅适用于 -m64 编译,并且仅在支持 SF1_SUNW_ADDR32 软件功能的 Oracle Solaris 平台上适用。
由于 Linux 内核不支持地址空间限制,此选项在 Linux 上不可用。在 Linux 上将忽略 -xaddr32 选项。
链接时,如果单个对象文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。
限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。
有关更多信息,请参阅《链接程序和库指南》中介绍的 SF1_SUNW_ADDR32 软件功能定义。
a 必须是以下几项之一:any、basic、weak、layout、strict、std、strong。使用该标志可使指定的别名级别对整个转换单元生效。换句话说,您选择的别名级别将应用于转换单元中的所有内存引用。如果未提供 -xalias_level,编译器将假定 -xalias_level=any。如果提供不带值的 -xalias_level,则编译器假定 -xalias_level=layout。
编译器假定所有内存引用都可在此级别上互为别名。没有基于类型的别名分析。
如果使用 -xalias_level=basic 选项,编译器将假定调用不同 C 基本类型的内存引用不互为别名。此外,编译器还假定对其他所有类型的引用互为别名,并可以使用任何 C 基本类型作为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。
如果使用 -xalias_level=weak 选项,编译器会假定任何结构指针都可指向任何结构类型。任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中的表达式之前进行声明。
您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。
在级别 -xalias_level=weak 上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用char *的引用使用涉及任何其他类型的内存引用作为别名。
编译器假定涉及类型的内存引用(内存中同一序列的类型)可以互为别名。编译器假定其类型在内存中看起来并不相同的两个引用并不互为别名。如果初始结构成员在内存中看起来相同,则编译器假定任何两个内存均通过不同的结构类型进行访问。然而,在此级别上,不应使用指向结构的指针来访问不同结构对象的某字段,该字段不属于这两个结构之间在内存中看起来相同的公共初始成员序列。这是因为编译器假定此类引用并不互为别名。
在 -xalias_level=layout 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用char *的引用可以使用涉及其他类型的内存引用作为别名。
编译器假定涉及结构或联合等在删除标记后相同的类型的内存引用可以互为别名。反之,编译器假定涉及那些即使在删除标记后也不相同的类型的内存引用不互为别名。然而,任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中该表达式之前进行声明。
您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。
在 -xalias_level=strict 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。
编译器假定类型和标记需要与别名相同,但是,使用 char * 的引用可以使用任何其他类型的引用作为别名。此规则与 1999 ISO C 标准中对指针解除引用的限制相同。正确使用此规则的程序将非常易于移植,而且优化之后性能大大提高。
应用的限制与在 std 级别相同,但此外,编译器还假定 char * 类型的指针只用于访问 char 类型的对象。此外,编译器还假定不存在内部指针。内部指针被定义为指向 struct 成员的指针。
另请参见:-xprefetch_auto_type
(已过时)在以后的发行版中将删除此选项。改用 -xprevise。
使用该选项编译可生成能使用代码分析器查看的源代码静态分析。
使用 -xanalyze=code 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 -xanalyze=code。
缺省值为 -xanalyze=%none。
在 Linux 上,需要指定 -xanalyze=code 和 -xannotate。
有关详细信息,请参见 Oracle Solaris Studio 代码分析器文档。
指示编译器创建可供优化和监测工具 binopt(1)、code-analyzer(1)、discover(1)、collect(1) 和 uncover(1) 以后使用的二进制文件。
在 Oracle Solaris 上的缺省值为 -xannotate=yes。在 Linux 上的缺省值为 -xannotate=no。指定不带值的 -xannotate 等效于 -xannotate=yes。
要最好地利用优化和监测工具,在编译和链接时都必须采用 -xannotate=yes。
如果不使用优化和监测工具,则使用 -xannotate=no 进行编译和链接可以生成略小的二进制文件和库。
指定目标体系结构指令集 (ISA)。
通过只允许指定的指令集,此选项可将编译器生成的代码限定于指定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用此选项会影响二进制程序的可移植性。请参见本条目结尾的“附注”和“警告”部分。
注意:分别使用 -m64 或 -m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 标志不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。
注意:编译器和链接程序会标记需要特定指令集体系结构 (instruction set architecture, ISA) 的 .o 文件和可执行文件,以便如果正在运行的系统不支持该特定 ISA,不会在运行时装入可执行文件。
如果代码使用的 _asm 语句或内联模板(.il 文件)使用了特定于体系结构的指令,则在编译时可能需要使用相应的 -xarch 值以避免出现编译错误。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
针对所有平台的值:
该选项使用大多数处理器通用的指令集。这是缺省值,等效于 -xarch=sse2。
为了在大多数 64 位平台上获得良好性能而进行编译。(仅限 Oracle Solaris)
该选项等效于
-m64 -xarch=generic
提供该选项是为了与早期的发行版兼容。使用 -m64 可指定 64 位编译而非 -xarch=generic64。
为了在此系统上获得良好性能而进行编译。
编译器为运行它的当前系统处理器选择适当的设置。
为了在此系统上获得良好性能而进行编译(仅限 Oracle Solaris)。
该选项等效于 -m64 -xarch=native,提供该选项是为了与早期的发行版兼容。
特定于 SPARC 平台的值:
针对 SPARC-V9 ISA 进行编译。
针对 V9 ISA 进行编译,但不具备可视指令集 (Visual Instruction Set, VIS),也不具备特定于其他实现的 ISA 扩展。该选项在 V9 ISA 上使编译器生成高性能代码。
针对 SPARC-V9 ISA 和 VIS 进行编译。
针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。
针对具有 UltraSPARC III 扩展的 SPARC-V9 ISA 进行编译。
此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (Visual Instruction Set, VIS) 2.0 版上生成对象代码。
针对具有 UltraSPARC III 和 VIS 3 扩展的 SPARC-V9 ISA 进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0 以及混合乘加指令和可视指令集版本 3.0 中的指令。
针对 SPARC-V9 ISA 的sparcfmaf版本进行编译。
允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。
请注意,必须将 -xarch=sparcfmaf 与 -fma=fused 以及某些优化级别结合使用,来使编译器尝试寻找机会自动使用乘加指令。
针对 SPARC-V9 ISA 的 SPARC4 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)中的指令以及混合浮点乘加指令、VIS 3.0 和 SPARC4 指令。
针对 SPARC-V9 ISA 的 SPARC4B 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
针对 SPARC-V9 ISA 的 SPARC4C 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、VIS 3.0 指令的 VIS3B 子集、SPARC T3 扩展的子集中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
针对 SPARC-V9 ISA 的 sparcace 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展以及面向 SPARCACE 浮点的 SPARC64 X 扩展中的指令。
针对 SPARC-V9 ISA 的 sparcaceplus 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、面向 SPARCACE 浮点的 SPARC64 X 扩展以及面向 SPARCACE 浮点的 SPARC64 X+ 扩展中的指令。
针对 SPARC-V9 ISA 的 sparcima 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展中的指令。
与 -m64 -xarch=sparc 等效。使用 -xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需使用 -m64。
与 -m64 -xarch=sparcvis 等效,提供该选项是为了与早期发行版兼容。
与 -m64 -xarch=sparcvis2 等效,提供该选项是为了与早期发行版兼容。
注:
使用 generic、sparc、sparcvis2、sparcvis3、sparcfmaf 和 sparcima 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行。
对于任何特定选择,生成的可执行文件在早期体系结构上运行可能会慢很多。此外,尽管这些指令集体系结构中的许多体系结构中有四精度浮点指令,但是编译器不在其生成的代码中使用这些指令。
特定于 x86 平台的值:
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES、PCLMULQDQ、AVX、FSGSBASE、RDRND、F16C、AVX2、BMI1、BMI2、LZCNT、INVPCID 和 FMA 指令。
可以使用 386、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES、PCLMULQDQ AVX、FSGSBASE、RDRND 和 F16C 指令。
可以使用 386、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES 和 PCLMULQDQ smf AVX 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES 和 PCLMULQDQ 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1 和 SSE4.2 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3 和 SSE4.1 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3 和 SSSE3 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2 和 SSE3 指令。
使用 AMD SSE4a 指令集。
可以使用 386、MMX、Pentium_pro、SSE 和 SSE2 指令。
可以使用 386、MMX、Pentium_pro、SSE、SSE2 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
传统标志,等效于 -m64 -xarch=sse2,在 -m64 标志可用之前用于获取 64 位内存模型代码。
传统标志,等效于 -m64 -xarch=sse2a,在 -m64 标志可用于 AMD 处理器之前用于获取 64 位内存模型代码。
可以使用 386、MMX、Pentium_pro 和 SEE 指令。
可以使用 386、MMX、Pentium_pro、SSE 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
可以使用 386、MMX 和 pentium_pro 指令。
可以使用 386、MMX、Pentium_pro 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
使用大多数处理器通用的指令集。
传统标志,等效于 -m64 -xarch=generic,在 -m64 标志可用之前用于获取 64 位内存模型代码。
使用编译器运行所在的当前系统处理器上可用的指令。
传统标志,等效于 -m64 -xarch=native,在 -m64 标志可用之前用于获取 64 位内存模型代码。
注:
如果在 x86 平台上使用 -m64 编译或链接了某个程序的任意部分,则该程序的所有部分也都必须使用这些选项之一进行编译。
有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel-64 和 IA-32《Intel Architecture Software Developer's Manual》
缺省值:
如果未指定 -xarch=isa,则缺省值为:-xarch=generic(对于 SPARC 平台)或 -xarch=generic(对于 x86/x64 平台)。
交互:
尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。
例如,-xtarget=ultra4 扩展到
-xarch=sparcvis2 -xcache=64/32/4:8192/128/2 -xchip=ultra4
警告:
如果此选项与优化一起使用,则在指定的体系结构上,适当的选择可以为可执行文件提供良好性能。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。
为多个处理器启用自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高,则将优化级别提高到 -xO3 并发出警告。
请注意,-xautopar 不接受 OpenMP 并行化指令。
如果要进行自己的线程管理,请勿使用 -xautopar。
为了使执行速度更快,该选项要求使用多处理器系统。在单处理器系统中,生成的二进制文件的运行速度通常较慢。
当运行由 -xautopar 编译器选项自动并行化的程序时,请使用 OMP_NUM_THREADS 环境变量指定要使用的线程数。如果未设置 OMP_NUM_THREADS,则使用的缺省线程数为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,会将 OMP_NUM_THREADS 设置为运行系统上可用的虚拟处理器数,可使用 Oracle Solaris psrinfo(1M) 命令确定该值。有关更多信息,请参见 OpenMP API 用户指南。
如果使用 -xautopar 且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的 C 运行时库包含进来。如果使用 -xautopar,而且在不同的步骤中进行编译和链接,则还必须使用 cc -xautopar 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见 C 用户指南。
(SPARC)(已过时)请参见 -xannotate。
指示编译器准备二进制文件,以便以后进行优化、转换和分析(请参见 binopt(1))。此选项可用于生成可执行文件或共享对象。此选项必须与 -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。
使用 -xbuiltin 选项可改善对调用标准库函数的代码的优化。此选项使编译器可在对性能有益时替换内函数或内联系统函数。要了解如何解读编译器注释输出来确定编译器替换了哪些函数,请参见 er_src(1) 手册页。
使用 -xbuiltin=%all 时,替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。
-xbuiltin=%default 仅内联未设置 errno 的函数。errno 的值在任何优化级别上都始终是正确的,并且可以可靠地检查。对于 -xO3 或更低级别的 -xbuiltin=%default,编译器将确定哪些调用对内联有益,并且不内联其他函数。
-xbuiltin=%none 选项可禁用库函数的所有替换。
如果没有指定 -xbuiltin,则在以优化级别 -xO1 或更高级别进行编译时缺省值为 -xbuiltin=%default,而在以 -xO0 级别进行编译时,缺省值为 -xbuiltin=%none。如果指定不带参数的 -xbuiltin,则缺省值为 -xbuiltin=%all,并且编译器会更加主动地替换内部函数或内联标准库函数。
使用 -fast 进行编译会添加 -xbuiltin=%all。
注意:-xbuiltin 选项仅内联系统头文件中定义的全局函数,而从不内联用户定义的静态函数。尝试在全局函数上进行插入的用户代码可能会导致出现不确定的行为。
指定 -std=c89 和 -xCC 时,编译器接受 C++ 样式的注释。特别是,可使用 "//" 指示注释的开始。
-xc99 标志可控制编译器对根据 C99 标准(ISO/IEC 9899:1999,编程语言-C)实现的功能的识别。
o 可以是包含以下内容的逗号分隔列表:
启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。可选的 no_ 可禁用该功能。
打开识别支持的 C99 语言功能,并启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。
关闭识别支持的 C99 语言功能,并且不启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。
如果未指定 -xc99,则编译器缺省使用 -xc99=all,no_lib。
如果指定了 -xc99,但没有指定任何值,该选项将设置为 -xc99=all。
如果已指定 -std 或 -xlang 标志,则不能使用 -xc99 标志。
定义供优化器使用的高速缓存属性。
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]
si、li、ai 和 ti 定义如下:
级别为 i 的数据高速缓存的大小(千字节)
级别为 i 的数据高速缓存的行大小(字节)
级别为 i 的数据高速缓存的关联性
在级别 i 共享高速缓存的硬件线程数。ti 参数是可选的。如果未提供值,则使用值 1。
该选项指定了优化器可以使用的缓存属性,不保证使用每个特定的缓存属性。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
-xcache 值为:
定义高速缓存属性,以便在大多数平台上获得良好性能。这是缺省值。
定义高速缓存属性,以便在此主机平台上获得良好性能。
定义 1 级高速缓存属性。
定义 1 级和 2 级高速缓存属性。
定义 1 级、2 级和 3 级缓存属性。
提供该选项的目的只是为了在 char 类型定义为无符号的系统上简化代码的迁移。如果不是从这样的系统中迁移,最好不要使用该选项。只有那些依赖字符类型符号的程序才需要重写,它们要改写成显式指定带符号或者无符号。可以将 o 替换为以下值之一:
将声明为字符的字符常量和变量视为带符号的。这会影响已编译代码的行为,而不影响库例程的行为。
等效于 signed。
将声明为字符的字符常量和变量视为无符号的。这会影响已编译代码的行为,而不影响库例程的行为。
等效于 unsigned。
如果未指定 -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 Solaris ABI 将char类型指定为带符号,并且系统库的行为也与此相适应。目前还未对系统库针对将char指定为无符号的效果进行广泛测试。可以不使用该选项,而是修改代码使其与 char 类型是否带符号没有关联。类型char的符号因编译器和操作系统而异。
通过按指定的字节顺序放置多字符字符常量的字符来生成整型常量。可以将 o 替换为以下值之一:
按由低到高的字节顺序放置多字符字符常量构成的字符。
按由高到低的字节顺序放置多字符字符常量构成的字符。
按编译模式 -X[a|c|s|t] 所确定的顺序放置多字符字符常量构成的字符。
将执行针对单线程程序中的主线程以及多线程程序中的从属线程堆栈的堆栈溢出运行时检查。如果检测到堆栈溢出,则生成SIGSEGV。如果您的应用程序需要以不同于处理其他地址空间违规的方式处理堆栈溢出导致的 SIGSEGV,请参见 sigaltstack(2)。
n 必须为以下值之一。
执行全部 -xcheck 检查。
不执行任何 -xcheck 检查。
生成代码以便在运行时检测堆栈溢出错误,可以选择指定检测到堆栈溢出错误时要执行的操作。
当设置的线程堆栈指针超过为线程分配的堆栈边界时,便会出现堆栈溢出错误。如果堆栈地址的新顶端可写入,则无法检测到错误。
如果内存访问违规作为错误的直接结果发生,从而发出关联信号(通常是 SIGSEGV),则会检测到堆栈溢出错误。我们说由此发出的信号与错误关联。
未检测到的堆栈溢出错误可能导致无提示数据损坏。防止未检测到的堆栈溢出错误需要编译器和运行时支持。
如果指定了 -xcheck=stkovf[action],当堆栈帧大于系统页面大小时,编译器会生成代码来检测堆栈溢出错误。代码包括库调用以强制内存访问违规而非将堆栈指针设置为无效但有可能映射的地址(请参见 _stack_grow(3C))。
如果指定了可选的 action,它必须是以下几项之一:
如果 action 为 :detect,则通过执行通常与错误关联的信号处理程序来处理检测到的堆栈溢出错误。
如果 action 为 :diagnose,则通过捕获关联信号并调用 stack_violation(3C) 诊断错误来处理检测到的堆栈溢出错误。这是没有指定 action 时的缺省行为。
如果内存访问违规诊断为堆栈溢出错误,则会将以下消息输出到 stderr:
ERROR: stack overflow detected: pc=<inst_addr>, sp=<sp_addr>
其中 <inst_addr> 是检测到错误处指令的地址,<sp_addr> 是检测到错误时堆栈指针的值。检查堆栈溢出并输出以上消息(如果适用)后,控制能力传递给通常与错误关联的信号处理程序。
-xcheck=stkovf:detect 可将进入时的堆栈边界检查添加到堆栈帧大于系统页面大小的例程(请参见 _stack_grow(3C))。在大多数应用程序中,额外边界检查的相对成本应该微乎其微。
-xcheck=stkovf:diagnose 可将系统调用添加到线程创建(请参见 sigaltstack(2))。额外系统调用的相对成本取决于应用程序创建和销毁新线程的频率。
-xcheck=stkovf 仅在 Oracle Solaris 上受支持。Linux 上的 C 运行时库不支持堆栈溢出检测。
关闭堆栈溢出检查。
初始化局部变量。有关编译器用于初始化变量的预定义值的列表,请参见 C 用户指南中对该选项的描述。
不初始化局部变量。
如果未指定 -xcheck,则编译器缺省使用 -xcheck=%none。如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%all。
在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。
指定供优化器使用的目标处理器。
c 必须为下列值之一。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
此选项通过指定目标处理器来指定计时属性。
部分影响如下:
指令的顺序,即调度
编译器使用分支的方法
语义上等价的其他指令可用时使用的指令
对于 SPARC 平台,-xchip 的值为:
设置在大多数 SPARC 平台体系结构上获得最佳性能的参数。这是缺省值。
设置在主机环境中最佳性能的参数。
使用 pre-SuperSPARC 处理器的计时属性。
针对 SPARC64 VI 处理器进行优化。
针对 SPARC64 VII 处理器进行优化。
针对 SPARC64 X 处理器进行优化。
针对 SPARC64 X+ 处理器进行优化。
针对 UltraSPARC(TM) 处理器进行优化。
针对 UltraSPARC II 处理器进行优化。
针对 UltraSPARC IIe 处理器进行优化。
针对 UltraSPARC IIi 处理器进行优化。
针对 UltraSPARC III 处理器进行优化。
针对 UltraSPARC IIIcu 处理器进行优化。
针对 UltraSPARC IIIi 处理器进行优化。
针对 UltraSPARC IV 处理器进行优化。
针对 UltraSPARC IVplus 处理器进行优化。
针对 UltraSPARC T1 处理器进行优化。
针对 UltraSPARC T2 处理器进行优化。
针对 UltraSPARC T2+ 处理器进行优化。
针对 SPARC T3 处理器进行优化。
针对 SPARC T4 处理器进行优化。
针对 SPARC T5 处理器进行优化。
针对 SPARC M5 处理器进行优化。
针对 SPARC64 VII plus 处理器进行优化。
注意:以下 SPARC -xchip 值已过时,在将来的发行版中可能会删除:ultra、ultra2、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4 和 ultra4plus。
对于 x86 平台,-xchip 的值为:
针对大多数 x86 平台进行优化。
针对此主机处理器进行优化。
针对 Intel Core2 处理器进行优化。
针对 Intel Nehalem 处理器进行优化。
针对 AMD Opteron 处理器进行优化。
针对 Intel Penryn 处理器进行优化。
针对 Intel Pentium 体系结构进行优化。
针对 Intel Pentium Pro 体系结构进行优化。
针对 Intel Pentium 3 式处理器进行优化
针对 Intel Pentium 4 式处理器进行优化
针对 Intel Sandy Bridge 处理器进行优化。
针对 Intel Ivy Bridge 处理器进行优化。
针对 Intel Haswell 处理器进行优化。
针对 Intel Westmere 处理器进行优化。
针对 AMD FAM10 处理器进行优化。
(SPARC)指定代码地址空间。
注意:强烈建议通过指定 -xcode=pic13 或 -xcode=pic32 来生成共享对象。可以使用 -m64 -xcode=abs64 生成可工作的共享对象,但这些对象的效率将会很低。使用 -m64 xarch=v9 -xcode=abs32 或 -m64 -xcode=abs44 生成的共享对象将不起作用。
-xcode 的值为:
这是针对 32 位系统的缺省值。生成 32 位绝对地址。代码 + 数据 + bss 的大小被限制为 2**32 字节。
这是针对 64 位系统的缺省值。生成 44 位绝对地址。代码+数据+bss 的大小不应超过 2**44 字节。只适用于 64 位架构。
生成 64 位绝对地址。只适用于 64 位架构。
生成共享库(小模型)中使用的与位置无关的代码。与 -Kpic 等效。允许在 32 位体系结构上最多引用 2**11 个唯一的外部符号,而在 64 位体系结构上可以最多引用 2**10 个。
生成共享库(大模型)中使用的与位置无关的代码。与 -KPIC 等效。允许在 32 位体系结构上最多引用 2**30 个唯一的外部符号,而在 64 位体系结构上可以最多引用 2**29 个。
对于 32 位体系结构,缺省值是 -xcode=abs32。对于 64 位体系结构,缺省值是 -xcode=abs44。
生成共享动态库时,缺省 -xcode 值 abs44(而不是 abs32)将与 64 位体系结构一起使用。改为指定 -xcode=pic13 或 -xcode=pic32。
要确定是使用 -xcode=pic13 还是 -xcode=pic32,请使用 elfdump -c(有关更多信息,请参见 elfdump(1) 手册页)来查看全局偏移表 (Global Offset Table, GOT) 的大小并查看节标题 sh_name: .got。sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13,否则指定 -xcode=pic32。
通常,应根据以下准则来确定如何使用 -xcode:
如果要生成可执行文件,则不应该使用 -xcode=pic13 或 -xcode=pic32。
如果是生成仅用于链接到可执行文件的归档库,则不应该使用 -xcode=pic13 或 -xcode=pic32。
如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,则使用 -xcode=pic32。
如果要生成用于链接到共享库的归档库,则应该使用 -xcode=pic32。
此选项允许 C 编译器接受在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。这些语言环境包括 ja_JP.PCK。
注:处理此类语言环境所需的编译器转换阶段可能导致编译时间明显延长。仅当编译的源文件包含此类语言环境中某个语言环境的源代码字符时,才应该使用此选项。
除非指定 -xcsi,否则编译器不识别在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。
如果维护的软件以 dwarf 格式读取调试信息,请指定 -xdebugformat=dwarf。此选项会导致编译器使用 dwarf 标准格式生成调试信息,这是缺省设置。
-xdebugformat=stabs 生成使用 stabs 标准格式的调试信息。
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。此选项需要一个参数。
此选项影响使用 -g 选项记录的数据的格式。即使在没有使用 -g 的情况下记录少量调试信息,此选项仍可控制其信息格式。因此,即使不使用 -g,-xdebugformat 仍会产生影响。
dbx 和性能分析器软件可识别 stabs 和 dwarf 格式,因此使用此选项对任何工具的功能都没有影响。
有关更多信息,另请参见 dumpstabs(1) 和 dwarfdump(1) 手册页。
控制发出多少调试和监测信息。
术语 tagtype 是指标记的类型:结构、联合、枚举和类。
以下列表包含子选项 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。
注意:ldst_map 需要提供 tagtype 信息。如果不满足这项要求,驱动程序会发出错误。
这些是扩展到 -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
分析循环以了解迭代间数据依赖性并执行循环重构。循环重构包括循环互换、循环熔合、标量替换,以及消除“无用”数组赋值。
在 SPARC 上,-xdepend 为 -xO3 及以上的所有优化级别启用,为较低的优化级别禁用。此外,-xdepend 的显式设置会覆盖任何隐式设置。
在 x86 上,如果优化级别不是 -xO3 或更高,编译器会将优化级别提高到 -xO3 并发出警告。
如果未指定 -xdepend,缺省值为 -xdepend=no,表示编译器不会分析数据依赖性循环。如果指定了 -xdepend 但未指定参数,则编译器会将该选项设置为 -xdepend=yes,表示编译器会分析数据依赖性循环。
-xautopar 中包括依赖性分析。依赖性分析在编译时完成。
依赖性分析在单处理器系统中可能很有用。但是,如果尝试在单处理器系统上使用 -xdepend,则不应同时指定 -xautopar,否则将针对多处理器系统执行 -xdepend 优化。
另请参见:-xprefetch_auto_type
此选项是用于 -### 的宏。
要查看宏在程序中如何工作时,请使用该选项。该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出输出到标准错误 (stderr)。-xdumpmacros 选项在文件结束前或在 dumpmacros 或 end_dumpmacros pragma 覆盖它之前都是有效的。
值:
应用于某子选项的前缀 no% 会禁用该子选项。
输出所有宏定义。
输出所有取消定义的宏。
输出关于使用的宏的信息。
另外输出定义、取消定义和使用的位置(路径名和行号)。
输出在条件指令中使用的宏的使用信息。
输出系统头文件中的宏的所有宏定义、取消定义和使用信息。
设置该选项即表示 -xdumpmacros=defs,undefs,use,loc,conds,sys。该参数最好与[no%]形式的其他参数配合使用。例如, -xdumpmacros=%all,no%sys 表示输出中不包含系统头文件宏,但仍提供所有其他宏的信息。
不输出任何宏信息。
该选项的值会累积,因此指定 -xdumpmacros=sys -xdumpmacros=undefs 与 -xdumpmacros=undefs,sys 的效果相同。
注意:子选项 loc、conds 和 sys 是 defs、undefs 和 use 选项的限定符。只使用 loc、conds 和 sys 本身没有任何作用。例如,使用 -xdumpmacros=loc,conds,sys 不会生成什么结果。
缺省值:
如果指定不带任何参数的 -xdumpmacros,则表示 -xdumpmacros=defs,undefs,sys。如果未指定 -xdumpmacros,则它缺省使用 -xdumpmacros=%none。
对源文件仅执行语法和语义检查,但不生成任何对象或可执行文件。
-xF 选项可使链接程序对函数和变量进行最佳重新排序。
该选项指示编译器将函数和/或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)可将这些段重新排序以优化程序性能。通常,该优化仅在缺页时间构成程序运行时间的一大部分时才有效。
为优化性能而对函数和变量进行重新排序时,需要执行以下操作:
使用 -xF 进行编译和链接。
按照性能分析器手册中关于如何生成函数的映射文件或《链接程序和库指南》中关于如何生成数据的映射文件的说明进行操作。
使用通过链接程序的 -M 选项生成的新映射文件重新链接。
在分析器下重新执行以验证是否增强。
v 可以为以下值之一。前缀 no% 可禁用子选项。
将函数分段到单独的段中。
将全局数据(具有外部链接的变量)分段到单独的段中。
对函数和全局数据进行分段。
不对任何内容进行分段。
如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func。
另请参见:analyzer(1)、ld(1)
控制文件静态变量的全局化,但是不控制函数的全局化。
全局化是修复并继续和过程间优化所需的一项技术,文件静态符号借以提升到全局范围,同时为名称添加前缀以使命名相同的符号不同。
缺省值为 -xglobalize=no。指定 -xglobalize 与指定 -xglobalize=yes 等效。
交互:
请参见 -xpatchpadding。
-xipo 也需要全局化,并且将覆盖 -xglobalize。
显示编译器选项的摘要。
(SPARC) 使用 -xhwcprof 选项可为数据空间分析启用编译器支持。
如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用 -g 生成的符号信息结合)。它将分析数据同对象文件的数据空间(而不是指令空间)相关联,并对行为进行洞察,而这仅从指令分析中是无法轻易获得的。
可以使用 -xhwcprof 编译指定的一组对象文件,不过将 -xhwcprof 应用于应用程序中的所有对象文件时,该选项最为有用。它能全面识别并关联分布在应用程序对象文件中的所有内存引用。
如果在不同的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。如果将来扩展为 -xhwcprof,则在链接时可能需要使用它。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求启用优化,并将调试数据格式设置为 dwarf (-xdebugformat=dwarf),这是当前 Oracle Solaris 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
有关基于硬件计数器的分析的更多信息,请参见性能分析器手册。
v 可以是 [{%auto,func_name,no%func_name}]。
-xinline 尝试只内联列表中指定的函数。该列表包含逗号分隔的函数名称列表、逗号分隔的 no%func_name 值列表或者值 %auto。如果指定 %nofunc_name,则编译器将不内联指定的函数。如果指定了 %auto,编译器将尝试自动内联源文件中的所有函数。
该列表值从左至右进行累积。因此,对于 -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[=1|2] 编译的文件中。
如果在命令行指定多个 -xinline 选项,它们将不会累积。命令行上的最后一个 -xinline 指定编译器尝试内联的函数。
另请参见:-xldscope。
使用该选项可手动更改编译器用来确定何时内联函数调用的试探式方法。
该选项仅在 -O3 或更高级别上起作用。当自动内联处于启用状态时,以下子选项仅在 -O4 或更高级别上起作用。
在以下子选项中,n 必须是正整数;a 可以是以下几项之一:
将所有子选项的值设置为缺省值。
自动内联只将小于 n 个伪指令(在编译器的内部表示中计数)的函数视为可能的内联候选函数。
在任何情况下,都不会考虑对大于该值的函数进行内联。
将内联函数的大小限制设置为 n 个伪指令(在编译器的内部表示中计数)。
有时可能会对大小大于该值的函数进行内联。
与 max_inst_hard 交互时,max_inst_soft 的值应该等于或小于 max_inst_hard 的值,即 max_inst_soft <= max_inst_hard。
一般而言,编译器的自动内联程序仅内联所调用函数的大小小于 max_inst_soft 的值的调用。在某些情况下,当函数大小大于 max_inst_soft 的值但小于 max_inst_hard 的值时,可能会内联函数。例如,当传递到函数中的参数是常量时。
当确定是否为了将一个特定调用点内联到函数中而更改 max_inst_hard 或 max_inst_soft 的值时,请使用 -xinline_report=2 报告详细的内联消息,并遵循内联消息中的建议。
允许函数因自动内联而最多增加 n 个伪指令(在编译器的内部表示中计数)。
允许自动内联程序将程序大小最多增大 n%,其中大小以伪指令数度量。
为了考虑要自动内联的函数而通过分析反馈 (-xprofile) 度量的最小调用点频率计数。
仅当使用分析反馈 (-xprofile=use) 编译应用程序时,该选项才有效。
使用该子选项可控制所应用自动内联的程度。-xinline_param=level 的设置越高,编译器内联的函数越多。
n 必须为 1、2 或 3 之一。
当未指定该选项时或者当指定不带 :n 的选项时,n 的缺省值为 2。
指定自动内联的级别
level:1 basic inlining level:2 medium inlining (default) level:3 aggressive inlining
级别决定了为以下内联参数组合指定的值:
max_growth + max_function_inst + max_inst + max_inst_call
当级别为 1 时,所有参数都是缺省值的一半。当级别为 2 时,所有参数都是缺省值。当级别为 3 时,所有参数都是缺省值的两倍。
当函数直接或间接调用自身时,我们说它进行递归调用。
该子选项可使递归调用自动内联到最高 n 级别。
指定递归函数的调用方通过执行自动递归内联可增大到的最大伪指令数(在编译器的内部表示中计数)。
max_recursive_inst 与 max_recursive_depth 之间发生交互时,直到 max_recursive_depth 个递归调用或者直到内联到的函数的大小超过 max_recursive_inst,才会内联递归函数调用。这两个参数的设置控制小型递归函数的内联程度。
如果指定了 -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。
编译器通过调用过程间分析传递来执行部分程序优化。它在链接步骤中跨所有对象文件执行优化,并且不限于编译命令上的源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。
编译时和链接时都必须指定 -xipo。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
分析和优化只限于使用 -xipo 编译的对象文件,并不扩展到对象文件或库。-xipo 分为多个阶段,所以如果要在不同的步骤中编译和链接,需要为每个步骤指定 -xipo。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的对象文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。在编译步骤中创建的对象文件具有在这些文件内编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
n 为 0、1 或 2。不带任何参数的 -xipo 等效于 -xipo=1。-xipo=0 是缺省设置,可禁用 -xipo。
在 -xipo=1 时,编译器会跨所有源文件执行内联。在 -xipo=2 时,编译器执行过程间调用别名分析同时优化内存分配和布局,以提高缓存的性能。
以下是针对 -xipo 的一些重要注意事项:
它要求优化级别最低为 -xO4。
编译时未使用 -xipo 的对象可以自由地与使用 -xipo 编译的对象链接。
在此例中,编译和链接在单个步骤中进行:
cc -xipo -xO4 -o prog part1.c part2.c part3.c
在此例中,编译和链接在不同的步骤中进行:
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 上的例程之间执行。(第一个编译可能生成有关未定义符号的警告,但仍会执行过程间优化,因为它是编译和链接的一个步骤。)
何时不使用 -xipo=2 过程间分析:
在链接步骤中使用对象文件集合时,编译器试图执行整个程序分析和优化。对于该目标文件集合中定义的任何函数或子例程 foo(),编译器做出以下两个假定:
foo() 无法在运行时被在该目标文件集合之外定义的其他例程显式调用。
来自该目标文件集合中的任何例程的 foo() 调用将不受在该目标文件集合以外定义的不同版本的 foo() 的干预。
如果假设 (1) 对于给定的应用程序不成立,请勿使用 -xipo=2 进行编译。
如果假定 (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() 中,从而导致出现错误的结果。
另请参见:-xjobs 和 -xipo_archive
-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的对象文件来优化传递给链接程序的对象文件。库中包含的在编译期间优化的任何对象文件都会替换为其优化后的版本。
a 是以下值之一:
生成可执行文件之前,编译器使用通过 -xipo 编译的对象文件(驻留在归档库 (.a) 中)来优化传递到链接程序的对象文件。库中包含的在编译期间优化的任何对象文件都会替换为优化后的版本。
对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化。
生成可执行文件之前,编译器使用通过 -xipo 编译的对象文件(驻留在归档库 (.a) 中)来优化传递到链接程序的对象文件。
选项 -xipo_archive=readonly 启用对在链接时指定的归档库中的对象文件的跨模块内联和过程间数据流分析。但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中。
要对归档库中的代码应用跨模块优化,需要使用 -xipo_archive=writeback。请注意,这样做将修改从中提取代码的归档库的内容。
缺省值。没有对归档文件的处理。编译器不会对使用 -xipo 编译和在链接时从归档库中提取的对象文件应用跨模块内联或其他跨模块优化。要执行此操作,链接时必须指定 -xipo,以及 -xipo_archive=readonly 或 -xipo_archive=writeback 中的任一个。
指定不带标志的 -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 可禁用该行为。
禁用或设置 ivdep 程序的解释。
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 的最多 3 个并行进程链接:
% 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 保留一切。
禁止对命名函数进行与堆栈相关的优化。
指定 %all 会对所有代码禁止与堆栈相关的优化。指定 %none 可允许对所有代码进行与堆栈相关的优化。
如果未在命令行上指定,则编译器假定 -xkeepframe=%none。
如果在命令行上指定了但不带值,则编译器假定 -xkeepframe=%all。
此选项是累积的,并且可以在命令行中出现多次。例如,
-xkeepframe=%all -xkeepframe=no%func1
指示应当为除 func1 以外的所有函数保留堆栈帧。而且,-xkeepframe 优先于 -xregs=frameptr。例如,
-xkeepframe=%all -xregs=frameptr
指示应保留所有函数的堆栈,但不会执行 -xregs=frameptr 的优化。
-xlang 标志可用于覆盖 -std 标志指定的缺省 libc 行为。language 必须为以下几项之一:
指定要符合 C90 标准的 libc 的运行时库行为。
指定 libc 的运行时库行为要符合 C99 标准。
等效于 c99。c99 和 c11 的 libc 的运行时库行为相同。
在未指定 -xlang 的情况下,如果指定了 -std=c99,缺省值为 c99,如果指定了 -std=c11,则缺省值为 c11。否则,缺省值为 c89。
如果指定了 -xlang 标志,则无法使用 -Xc、-Xa、-Xt、-Xs 和 -xc99 标志。这样做会导致编译器发出错误。
如果在不同的步骤中编译和链接,则必须在两个步骤中为 -xlang 使用相同的值。
要决定在混合语言链接中使用的驱动程序,请使用下列语言分层结构:
使用 CC 命令。有关详细信息,请参见 CC (1) 。
使用 f95 命令。有关详细信息,请参见 f95 (1) 。
使用 f95 -xlang=f77。有关详细信息,请参见 f95 (1) 。
使用 cc 命令。
更改外部符号定义的缺省链接程序作用域。由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。
v 必须是下列值之一:
全局链接程序作用域是限制最少的链接程序作用域。该符号的所有引用都绑定到在第一个动态模块中定义该符号的定义上。该链接程序作用域是外部符号的当前链接程序作用域。
符号链接程序作用域比全局链接程序作用域具有更多的限制。从所链接的动态模块内部对符号的所有引用都绑定到在模块内部定义的符号上。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。
隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。动态模块内部的所有引用都绑定到该模块内部的一个定义上。符号在模块外部是不可视的。
如果未指定 -xldscope,编译器将假定 -xldscope=global。指定不带任何参数的 -xldscope 是非法的。如果指定不带参数的 -xldscope,编译器会发出错误信息。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。
如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。在以下情况下,编译器将内联函数:如果使用 -xinline 指定函数名称;如果使用 #pragma inline;如果在可自动进行内联的 -xO4 或更高级别编译;如果使用内联说明符;如果使用跨文件优化。
例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:
void* ABC_allocator(size_t size) { return malloc(size); }
如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库的客户端要用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。
生成库时,用 __hidden 或 __symbolic 说明符声明的库函数可以内联生成。假定它们不被客户机覆盖。有关更多信息,请参见 C 用户指南中的第 2 章“C 编译器实施特定信息”。
用 __global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。
另请参见:
-xinline、-xO、ld(1)。
在异常情况下对于数学例程强制返回 IEEE 754 样式的值。在此类情况下,将不输出任何异常错误消息,并且不应该依赖于 errno。
内联某些库例程以便更快执行。该选项可为系统的浮点选项和平台选择适当的汇编语言内联模板。无论函数的任何规范作为 -xinline 标志的一部分,-xlibmil 都会内联函数。
但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。有关更多信息,请参见本手册页结尾的“附注”部分。
使编译器使用优化数学例程的库。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
数学例程库优化了性能,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。
但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。有关更多信息,请参见本手册页结尾的“附注”部分。
该库选项在命令行上的顺序并不重要。
交互:
-fast 选项隐含了该选项。
另请参见:
-fast、-xnolibmopt
(已过时)使用 -library=sunperf 可与 Sun 性能库链接。
编译器忽略此选项且不显示任何提示。
指示编译器对可重定位对象文件执行链接时优化。
后优化器在链接时对二进制对象代码执行一些高级性能优化。可以使用值 level 来设置执行的优化级别,且必须为 0、1 或 2。
优化级别为:
禁用后优化器。(这是缺省情况。)
在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化。
在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化。
指定不带 level 参数的 -xlinkopt 表示 -xlinkopt=1。
这些优化在链接时通过分析二进制对象代码来执行。虽然未重写对象文件,但生成的可执行代码可能与初始对象代码不同。
当编译整个程序并且使用分析反馈时,该选项才最有效。
如果在不同的步骤中编译,-xbinopt 必须同时出现在编译和链接步骤中:
example% cc -c -xlinkopt a.c b.c example% cc -o myprog -xlinkopt=2 a.o
有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
请注意,仅当编译器链接时才使用 level 参数。在上述示例中,即使二进制对象代码是用隐含级别 1 编译的,使用的后优化级别仍然是 2。
使用 -xlinkopt 编译时,请不要使用 -zcombreloc 链接程序选项。
必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制对象文件执行部分受限的优化。
-xlinkopt 优化出现在编译器命令行上的静态库代码,但会跳过出现在命令行上的共享(动态)库代码而不对其进行优化。生成共享库时(使用 -G 进行编译),也可以使用 -xlinkopt。
与运行时分析反馈一起使用时,链接时后优化器最有效。分析功能会展示代码中最常用和最不常用的部分,并指示优化器相应地进行处理。这对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。通常,会按照以下方式进行编译:
example% cc -o progt -xO5 -xprofile=collect:profdir file.c example% progt example% cc -o prog -xO5 -xprofile=use:profdir -xlinkopt file.c
有关使用分析反馈的详细信息,请参见 -xprofile。
注意,使用该选项编译会略微延长链接的时间,对象文件的大小也会增加,但可执行文件的大小保持不变。使用 -xlinkopt 和 -g 编译会将调试信息包括在内,从而增加了可执行文件的大小。
显示哪些循环进行了并行化处理,哪些循环没有进行并行化处理。该选项通常与 -xautopar 选项一起使用。
仅对指定的 C 程序运行预处理程序,请求生成 makefile 依赖性并将结果发送到标准输出(有关 makefile 和依赖性的详细信息,请参见 make (1))。
与 -xM 相同,只是 -xM1 在 -Xs 模式下不受支持,/usr/include 头文件的 -xM1 报告依赖性也不受支持。例如:
example% more hello.c #include <stdio.h> main() { (void) printf ("hello\n"); } example% cc -xM hello.c hello.o: hello.c hello.o: /usr/include/stdio.h
使用 -xM1 编译不会报告头文件的依赖性:
example% cc -xM1 hello.c hello.o: hello.c
像 -xM 一样生成 makefile 依赖性,但编译继续。-xMD 为从 -o 输出文件名(如果指定)或输入源文件名派生的 makefile 依赖性信息生成一个输出文件,替换(或添加)后缀为 .d 的文件名。如果指定 -xMD 和 -xMF,预处理程序会将所有 makefile 依赖性信息写入到使用 -xMF 指定的文件中。不允许使用 -xMD -xMF 或 -xMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
使用该选项可指定 makefile 依赖性输出的文件。无法在一个命令行上使用 -xMF 为多个输入文件指定单独的文件名。不允许使用 -xMD -xMF 或 -xMMD -xMF 编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
此选项无法与 -xM 或 -xM1 一起使用。
此选项用于生成不包含系统头文件的 makefile 依赖性。这一功能与 -xM1 的功能相同,但是编译会继续。-xMMD 为从 -o 输出文件名(如果指定)或输入源文件名派生的 makefile 相关项信息生成一个输出文件,替换(或添加)后缀为 .d 的文件名。如果您指定 -xMF,则编译器将改用您提供的文件名。不允许使用 -xMMD -xMF 或 -xMMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
指示 cc 将数据段和文本段合并。在此编译所生成的对象文件中初始化的数据是只读数据,并可在进程间共享(除非用 ld -N 链接)。
-xMerge、-ztext 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
该命令可将 pragma 优化的级别限制到指定的级别。缺省值为 -xmaxopt=off,表示忽略 pragma 优化。指定未提供参数的 -xmaxopt 等效于指定 -xmaxopt=5。
如果同时指定了 -xO 和 -xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。
(SPARC) 使用 -xmemalign 选项可控制编译器对数据对齐所做的假定。通过控制可能会出现非对齐内存访问的代码和出现非对齐内存访问时的处理程序,可以更轻松的将程序移植到 SPARC。
指定假定的最大内存对齐以及未对齐的数据访问的行为。必须同时为 a(对齐)和 b(行为)提供值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应如下所示:
操作系统将陷阱转换为 SIGBUS 信号。如果程序无法捕捉到信号,则程序终止。即使程序捕捉到信号,未对齐的访问尝试仍将无法成功。
操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱。
a 接受的值为:
假定最多 1 字节对齐。
假定最多 2 字节对齐。
假定最多 4 字节对齐。
假定最多 8 字节对齐。
假定最多 16 字节对齐。
b 接受的值为:
解释访问并继续执行。
产生信号 SIGBUS。
仅适用于 64 位 SPARC 程序 (-m64)。针对少于或等于 4 的对齐产生信号 SIGBUS,否则将解释访问并继续执行。对于 32 位程序,f 标志与 i 等效。
如果要链接到某个已编译的对象文件,并且编译该对象文件时 b 的值设置为 i 或 f,就必须指定 -xmemalign。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
缺省值:
针对 64 位 SPARC 程序 (-m64) 的缺省值为 -xmemalign=8s。
针对 32 位 SPARC 程序 (-m32) 的缺省值为 -xmemalign=8i。
如果指定了 -xmemalign 但未提供值,则针对所有平台的缺省值均为 -xmemalign=1i。
(x86) -xmodel 选项可确定 Oracle Solaris x64 平台上共享对象的数据地址模型,并且只应为此类对象的编译指定。
仅当启用了 64 位的 x64 处理器上还指定了 -m64 时,该选项才有效。
a 是以下值之一:
此选项可为小模型生成代码,其中执行代码的虚拟地址在链接时已知,并且已知在 0 到 2^31 - 2^24 - 1 的虚拟地址范围内可以找到所有符号。
按内核模型生成代码,在该模型中, 所有符号都定义在 2^64 - 2^31 到 2^64 - 2^24 范围内。
按中等模型生成代码,在该模型中,不对数据段的符号引用范围进行假定。文本段的大小和地址的限制与小型代码模型的限制相同。使用 -m64 编译含有大量静态数据的应用程序时,可能需要使用 -xmodel=medium。
此选项不累积,因此编译器根据命令行最右侧的 -xmodel 实例设置模型值。
如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。
不是编译所有转换单元时都需要使用此选项。只有可以确保访问的对象在可访问范围之内,才可编译选择的文件。
您应了解,不是所有的 Linux 系统都支持中等模型。
缺省情况下不链接任何库;即不将任何 -l 选项传递给链接程序 ld。通常,cc 驱动程序将 -lc 传递给 ld。
使用 -xnolib 时,必须自己显式传递所有 -l 选项。
不内联数学库例程。在 -fast 选项后面使用 -xnolibmil,如下所示:
cc -fast -xnolibmil ...
通过禁用先前指定的任何 -xlibmopt 选项不与优化数学例程库链接。
在命令行上 -fast 选项后面使用该选项,如下所示:
example% cc -fast -xnolibmopt ...
不将共享库的运行时搜索路径生成到可执行文件中。
通常,cc 不会将任何 -R 路径传递给链接程序。有几个选项会将 -R 路径传递给链接程序,例如 -xliclib=sunperf 和 -xopenmp。-xnorunpath 选项可用于防止这一问题。
建议用该选项生成提交到客户(这些客户的程序使用的共享库可能具有不同路径)的可执行文件。
指定优化级别 (n)。(请注意,大写字母 O,后跟数字 1、2、3、4 或 5)
通常,编译程序时使用的优化级别越高,获得的运行时性能也越高。但是,优化级别越高,编译时间会越长,可执行文件也越大。
有五个级别可与 -xOn 一起使用。编译器在每个级别执行的实际优化可能会随各个编译器发行版发生变化。此处只是做了概述。
如果优化器内存不足,则它尝试在较低优化级别上再次进行,即继续在原始级别上对后续例程进行编译。
值:
只执行基本局部优化。
执行基本局部和全局优化。通常,此级别产生的代码大小是最小的。
在函数级别添加全局优化。一般而言,与 -xspace 选项一起使用时,这一级别和 -xO4 通常会使代码大小最小。
在同一文件中增加函数的自动内联。一般而言,除非与 -xspace 结合使用,否则 -xO4 会使代码较大。
要控制内联的例程,请参见 -inline。
执行最高级别的优化,只适用于占用最大一部分计算机时间的小部分程序。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。如果使用分析反馈执行该级别上的优化,则更容易提高性能。请参见 -xprofile=collect|use。
缺省为不优化。不过,只有不指定优化级别时才可能使用缺省设置。如果指定了优化级别,则没有任何选项可用来关闭优化。
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会发出优化已设置的警告消息。不使用任何优化来编译的方法是从命令行删除所有选项或创建指定优化级别的文件。
如果使用 -g 并且优化级别为 -xO3 或更低,编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化和后端内联被禁用。
如果使用 -g 并且优化级别为 -xO4 或更高,编译器会为完全优化提供尽可能多的符号信息。
使用 -g 进行调试不会抑制 -xOn,但 -xOn 会在某些方面限制 -g。例如,优化选项会降低调试的效用,以致您无法显示 dbx 中的变量,但您仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见使用 dbx 调试程序。
如果同时指定了 -xO 和 -xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。
另请参见:
-xldscope、-fast、-xprofile=p、csh(1) 手册页
性能分析器说明了对分析器的数据进行不同级别优化的影响。
启用通过 OpenMP 指令进行的显式并行化。
下面详述了 -xopenmp 值:
启用 OpenMP pragma 的识别。-xopenmp=parallel 时的优化级别为 -xO3。如有必要,编译器会将优化级别提高到 -xO3 并发出警告。
此标志还定义处理器宏 _OPENMP。_OPENMP 宏定义为具有十进制值 yyyymm,其中 yyyy 和 mm 是实现所支持的 OpenMP API 版本的年份和月份标示。有关特定发行版的 _OPENMP 宏的值,请参阅《Oracle Solaris Studio OpenMP API 用户指南》。
启用 OpenMP pragma 的识别。如果优化级别低于 -xO3,则编译器不提升它。如果将优化级别显式设置为低于 -xO3,如同在 cc -xO2 -xopenmp=noopt 中一样,编译器会发出错误。如果没有使用 -xopenmp=noopt 指定优化级别,则会识别 OpenMP Pragma,并相应地对程序进行并行处理,但不进行优化。此标志还定义处理器宏 _OPENMP。
不启用对 OpenMP pragma 的识别,不更改程序的优化级别并且不定义任何预处理程序宏。在未指定 -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) 命令确定此数量。在 Linux 系统上,可以检查 /proc/cpuinfo 文件来确定此数量。有关更多信息,请参见 OpenMP API 用户指南。
缺省情况下,禁用嵌套并行操作。要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。有关详细信息,请参见 OpenMP API 用户指南。
如果在不同的步骤中进行编译和链接,请在编译步骤和链接步骤中都指定 -xopenmp。与链接步骤配合使用时,-xopenmp 选项将与 OpenMP 运行时支持库 libmtsk.so 链接。
为了获得最新功能和性能,请确保系统上安装了 OpenMP 运行时库 libmtsk.so 的最新修补程序。
有关用于生成多线程应用程序的 OpenMP Fortran 95、C 和 C++ 应用程序接口 (application program interface, API) 的更多信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
有关特定于 OpenMP 的 C 实现的信息,请参见《Oracle Solaris Studio C 用户指南》。
仅对源文件执行语法和语义检查,以便输出所有 K&R C 函数的原型。此选项不生成任何对象代码或可执行代码。
设置堆栈和堆的首选页面大小。
n 值必须是以下项之一:
在 SPARC 上:4K、8K、64K、512K、2M、4M、32M、256M、2G、16G 或 default。
在 x86/x64 上:4K、2M、4M、1G 或 default。
必须指定适于目标平台的有效页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
使用 pagesize (1) Oracle Solaris 命令可以确定页面中的字节数。操作系统不保证支持页面大小请求。但是,可以使用适当段对齐来增加获取请求的页面大小的可能性。有关如何设置段对齐,请参见 -xsegment_align 选项。可以使用 pmap (1) 或 meminfo (2) 来确定目标平台的页面大小。
除非在编译和链接时使用,否则 -xpagesize 选项不会生效。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
如果指定 -xpagesize=default,操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见 Oracle Solaris 手册页。
此选项是用于 -xpagesize_heap 和 -xpagesize_stack 的宏。这两个选项与 -xpagesize 接受相同的参数。可以通过指定 -xpagesize=n 来为二者设置相同的值,或分别为它们指定不同的值。
为堆设置内存中的页面大小。
n 值与 -xpagesize 值相同。
必须指定适于目标平台的有效页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
有关详细信息,请参见 -xpagesize。
为堆栈设置内存中的页面大小。
n 值与所述的 -xpagesize 值相同。
必须为目标平台上的 Oracle Solaris 操作系统指定有效的页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
有关详细信息,请参见 -xpagesize。
在各个函数启动之前保留内存区域。如果指定了 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 选项可以创建预编译头文件并减少编译时间。预编译头文件目的在于减少源文件共享一组通用的包含文件(包含大量源代码)的应用程序的编译时间。预编译头文件的工作机理是,首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者编译其他有同样头文件顺序的源文件时就可以使用这些收集到的信息。
您可以允许编译器为您自动生成预编译头文件。可以选择以下两种方式之一来执行该操作。一种方法是让编译器从在源文件找到的第一个包含文件创建预编译头文件。另一种方法是让编译器从在源文件中找到的包含文件集合中选择,选择范围从第一个包含文件开始,直到已经定义好的确定哪个包含文件是最后一个的点结束。使用以下两个标志之一可以确定编译器用于自动生成预编译头文件的方法:
预编译头文件的内容基于编译器在源文件中找到的最长活前缀(有关如何识别活前缀的说明,请参见下面的部分)。此标志生成的预编译头文件可能包含最多的头文件。
此标志生成的预编译头文件仅包含在源文件中找到的第一个头文件。
如果决定手动创建预编译头文件,必须首先使用 -xpch,并指定 collect 模式。指定 -xpch=collect 的编译命令只能指定一个源文件。在以下示例中,-xpch 选项根据源文件 a.c 创建名为 header.cpch 的预编译头文件:
cc -xpch=collect:myheader a.cc
有效的预编译头文件名总是有后缀 .cpch。在指定 pch_filename 时,您可以自己添加后缀,也可以让编译器为您添加。例如,如果指定 cc -xpch=collect:foo a.c,则预编译头文件称为 foo.cpch。
如果编译器无法在 -xpch=auto 且 -xpch=autofirst 的情况下使用预编译头文件,则会生成新的预编译头文件。如果编译器在 -xpch=use 的情况下无法使用预编译头文件,则会发出警告并使用实际的头文件来完成编译。
您还可以指示编译器使用特定的预编译头。为此,可以指定 -xpch=use:pch_filename。您可以将包含文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件。例如,在使用模式下命令可能如下所示:
cc -xpch=use:foo.cpch foo.c bar.c foobar.c
如果以下条件都成立,则只能使用现有的预编译的头文件。如果以下任一条件不成立,则应重新创建预编译头文件:
用于访问预编译头文件的编译器与创建预编译头文件的编译器相同。由某一版本的编译器创建的预编译头文件可能无法供其他版本的编译器使用。
除 -xpch 选项之外,用 -xpch=use 指定的编译器选项必须与创建预编译头文件时指定的选项相匹配。
用 -xpch=use 指定的包含头文件的集合与创建预编译头文件时指定的头文件集合是相同的。
用 -xpch=use 指定的包含头文件的内容与创建预编译头文件时指定的包含头文件的内容是相同的。
当前目录(即发生编译并尝试使用给定预编译头文件的目录)与创建预编译头文件所在的目录相同。
在用 -xpch=collect 指定的文件中预处理指令(包括 #include 指令)的初始序列,与在用 -xpch=use 指定的文件中预处理指令的序列相同。
要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的包含文件(按其初始标记序列)。标记是指关键字、名称或标点符号。被 #if 指令排除的注释和代码不能被编译器识别为标记。该初始标记序列称为活前缀。也就是说,活前缀是源文件中通用于所有源文件的最靠前的部分。创建预编译头文件并进而确定源文件中哪些头文件是预编译的时,编译器使用此活前缀作为整个操作的依据。
编译器在当前编译期间找到的活前缀必须与用于创建预编译头文件的活前缀匹配。也就是说,编译器必须在使用相同预编译头文件的所有源文件中对活前缀给出一致的解释。
活前缀包括以下任何预处理程序指令:
#include
#if/ifdef/ifndef/else/elif/endif
#define/undef
#ident
#pragma
以上任何指令都可以引用宏。#else、#elif 和 #endif 指令必须在活前缀内匹配。注释被忽略。
指定 -xpch=auto 或 -xpch=autofirst 时,编译器会自动确定活前缀的终点,定义如下。对于 -xpch=collect 或 -xpch=use,活前缀以 #pragma hdrstop 结尾。
第一个声明/定义语句
第一个 #line 指令
#pragma hdrstop 指令
在指定的包含文件之后(如果您指定 -xpch=auto 和 -xpchstop)
第一个包含文件(如果您指定 -xpch=autofirst)
注意:条件语句中的终点会生成一个警告,并禁止自动创建预编译头文件。另外,如果同时指定 #pragma hdrstop 和 -xpchstop 选项,编译器将使用两个停止点中较早的那一个来终止活前缀。
在共享预编译头文件的每个文件的活前缀中,每个相应的 #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=collect 时,编译器会生成预编译头文件的依赖性信息。需要在 make 文件中创建适当的规则,以利用这些依赖性。考虑下面的 make 文件样例:
%.o : %.cc 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 $(c) foo.o bar.o foobar.o clean : rm -f *.o shared.cpch .make.state a.out
这些 make 规则以及编译器生成的依赖性,会在与 -xpch=collect 一起使用的任何源文件或属于预编译头文件的一部分的任何头文件发生更改时,强制重新创建手动创建的预编译头文件。此约束可防止使用过期的预编译头文件。
对于 -xpch=auto 或 -xpch=autofirst,无需在 makefile 中创建任何其他 make 规则。
Warnings:
不要在命令行上指定冲突的 -xpch 标志。例如,同时指定 -xpch=collect 和 -xpch=auto 或同时指定 -xpch=autofirst 和 -xpchstop=<include> 会产生错误。
如果指定 -xpch=autofirst,或指定不带 -xpchstop 的 -xpch=auto,则出现在第一个包含文件之前或出现在使用用于 -xpch=auto 的 -xpchstop 指定的包含文件之前的任何声明、定义或 #line 指令都会生成警告,并禁止自动生成预编译头文件。
-xpch=autofirst 或 -xpch=auto 时的第一个包含文件之前的 #pragma hdrstop 会禁止自动生成预编译头文件。
另请参见:-xpchstop
file 是创建预编译头文件时要考虑的最后一个包含文件。在命令行上使用 -xpchstop 等效于将 hdrstop pragma(请参见 C 用户指南)置于第一个包含指令之后,该包含指令在您使用 cc 命令指定的每个源文件中引用 file。
结合使用 -xpchstop=<include> 和 -xpch=auto 可以创建基于从其往上并包括 <include> 的头文件的预编译头文件。此标志覆盖缺省的 -xpch=auto 行为(使用整个活前缀中包含的所有头文件的行为)。
另请参见:-xpch
(Oracle Solaris) 生成可移植的可执行代码 (Portable Executable Code, PEC) 二进制文件。此选项将程序中间表示置于对象文件和二进制文件中。该二进制文件可在以后用于调整和故障排除。
使用 -xpec 生成的二进制文件通常会比未使用 -xpec 生成的二进制文件大五到十倍。
如果未指定 -xpec,编译器会将其设置为 -xpec=no。如果您指定 -xpec,但不提供标志,则编译器会将其设置为 -xpec=yes。
(x86) 为 Pentium 处理器生成代码。
准备对象代码,以收集用 gprof(1) 进行分析所需的数据。调用在正常终止情况下产生 gmon.out 文件的运行时记录机制。
注意:如果指定了 -xpg,则 -xprofile 并无优势。两者不能准备或使用对方提供的数据。
使用 prof 或 gprof(在 64 位 Oracle Solaris 平台上)或者仅使用 gprof(在 32 位 Oracle Solaris 平台上)生成的分析中包括大致的用户 CPU 时间。这些时间来自主可执行文件中的例程以及共享库中例程(链接可执行文件时将共享库指定为链接程序参数)的 PC 样例数据(请参见 pcsample (2) )。其他共享库(在进程启动后使用 dlopen (3C) 打开的库)不进行分析。
在 32 位 Oracle Solaris 系统中,使用 prof (1) 生成的分析仅限于可执行文件中的例程。通过使用 -xpg 链接可执行文件并使用 gprof (1) ,可以对 32 位共享库进行分析。
当前的 Oracle Solaris 发行版不包括使用 -p 编译的系统库。因此,在当前 Oracle Solaris 平台上收集的分析不包含系统库例程的调用计数。
注意:在 x86 系统上,-xpg 与 -xregs=frameptr 不兼容,因为 gprof 运行时库需要有效的帧指针来确定分析的例程的返回地址。另请注意,在 x86 系统上使用 -fast 进行编译将调用 -xregs=frameptr。请改用以下命令进行编译:
-fast -xregs=no%frameptr -xpg
如果在编译时指定 -xpg,则还必须在链接时指定它。有关在编译时和链接时都必须指定的选项的完整列表,请参见 C 用户指南。
注意:使用 -xpg 编译以便进行 gprof 分析的二进制文件不应与 binopt(1) 一起使用,因为它们不兼容并可能导致内部错误。
在支持预取的体系结构上启用预取指令。必须使用该选项在优化级别 3 或更高级别进行编译。
val 必须是以下值之一:
启用预取指令的自动生成。
禁用自动生成。
启用显式预取宏。
显式预取只应在度量支持的特殊环境下使用。
禁用显式预取宏。
(SPARC) 只能将该选项与 -xprefetch=auto 结合使用。根据指定的因子,调整编译器假定的“预取到装入”和“预取到存储”延迟。该因子必须是形式为 n.n 的正数。
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。
在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。
注意:在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。
编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加值,请使用大于 1(一)的 factor。介于 .5 和 2.0 之间的值最有可能提供最佳性能。
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小此值,请使用小于一的 factor。
要使用 latx:factor 子选项,请首先使用接近 1.0 的 factor 值并对应用程序运行性能测试。然后适当增加或减小该因子,并再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几步中不会看到性能差异,之后会突然出现差异,然后再趋于稳定。
(已过时)不使用。改用 -xprefetch=auto,explicit。
(已过时)不使用。改用 -xprefetch=no%auto,no%explicit。
缺省值:
如果未指定 -xprefetch,现在缺省值为 -xprefetch=auto,explicit,而非 -xprefetch=yes。如果指定不带值的 -xprefetch,也等效于 -xprefetch=auto,explicit。此更改会对实质上具有非线性内存访问模式的应用程序造成负面影响。要禁用这项变化,请指定 -xprefetch=no%auto,no%explicit。
sun_prefetch.h 头文件提供了您可用来指定显式预取指令的宏。这些预取可能位于对应于宏出现位置的可执行文件中。
a 是 [no%]indirect_array_access。
使用此选项可以确定编译器是否以为直接内存访问生成预取的方式,为由选项 -xprefetch_level 指示的循环生成间接预取。
如果不指定 -xprefetch_auto_type 的设置,编译器会将其设置为 -xprefetch_auto_type=no%indirect_array_access。
-xdepend、-xrestrict 和 -xalias_level 等选项会影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而自动插入间接预取的主动性。
使用该选项可控制由 -xprefetch=auto 确定的自动插入预取指令的主动性。
l 必须为 1、2 或 3。
在早期的 SPARC 和 x86 平台上,预取级别 2 和 3 可能不会生效。
-xprefetch_level=1 启用预取指令自动生成。-xprefetch_level=2 启用级别 1 之外的额外生成,-xprefetch=3 启用级别 2 之外的额外生成。
必须在优化级别 3 或更高级别进行编译,并为支持预取的平台生成代码。
指定了 -xprefetch=auto 时,缺省值为 -xprefetch_level=1。
使用该选项编译可生成能使用代码分析器查看的源代码静态分析。
使用 -xprevise=yes 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 -xprevise=yes。
缺省值为 -xprevise=no。
在 Linux 上,需要指定 -xprevise=yes 和 -xannotate。
有关详细信息,请参见 Oracle Solaris Studio 代码分析器文档。
收集用于分析的数据或使用分析进行优化。
p 必须为 collect[:profdir]、use[:profdir] 或 tcov[:profdir]
此选项可在执行期间收集并保存执行频率数据,然后在后续运行中可以使用该数据来改进性能。对多线程应用程序来讲,分析收集 (Profile collection) 是一种安全的方法。也就是说,对执行其自己的多任务处理 (-mt) 的程序进行分析可产生准确的结果。只有指定 -xO2 或更高的优化级别时,此选项才有效。
如果分别执行编译和链接,则编译步骤和链接步骤中必须都出现同一 -xprofile 选项。有关在编译时和链接时都必须指定的选项的完整列表,请参见 C 用户指南。
在 -xprofile=use 时优化器收集并保存执行频率,以供将来使用。编译器生成可测量语句执行频率的代码。
-xMerge、-ztext 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
分析目录名 profdir(如果指定)是包含已分析的对象代码的程序或共享库在执行时用来存储分析数据的目录路径名。如果路径名不是绝对路径,在使用选项 -xprofile=use:profdir 编译程序时将相对于当前工作目录来解释该路径。
如果未使用 -xprofile=collect:prof_dir 或 -xprofile=tcov:prof_dir 指定任何分析目录名,则分析数据在运行时将存储在名为 program.profile 的目录中,其中程序是已分析进程的主程序的基名。在这种情况下,可以使用环境变量 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 目录中;也就是说,以前执行的输出不会丢失。
示例 [1]:在目录 myprof.profile(位于生成程序所在的目录中)中收集分析数据,并使用这些分析数据:
cc -xprofile=collect:myprof.profile -xO5 prog.c -o prog ./prog cc -xprofile=use:myprof.profile -xO5 prog.c -o prog
示例 [2]:在目录 /bench/myprof.profile 中收集分析数据,然后在优化级别为 -xO5 的反馈编译中使用收集的分析数据:
cc -xprofile=collect:/bench/myprof.profile -xO5 prog.c -o prog ...run prog from multiple locations... cc -xprofile=use:/bench/myprof.profile -xO5 prog.c -o prog
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何对象文件也使用 -xprofile=collect 进行链接。
有关控制异步分析收集的环境变量的描述,另请参见本手册页下文的“环境变量”部分。
使用从通过 -xprofile=collect[:profdir] 或 -xprofile=tcov[:profdir] 编译的代码中收集的执行频率数据针对在执行已分析代码时执行的工作进行优化。profdir 是包含通过运行使用 -xprofile=collect[:profdir] 或 -xprofile=tcov[:profdir] 编译的程序收集的分析数据的目录的路径名。
要生成 tcov 和 -xprofile=use[:profdir] 都能使用的数据,必须在编译时使用选项 -xprofile=tcov[:profdir] 指定相同的分析目录。为最大限度地减少混淆情况,请将 profdir 指定为绝对路径名。
profdir 是可选的。如果未指定 profdir,将使用可执行二进制文件的名称。如果未指定 -o,将使用 a.out。如果未指定 profdir,编译器将查找 profdir.profile/feedback 或 a.out.profile/feedback。例如:
cc -xprofile=collect -o myexe prog.c 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 阶段之间的编译的说明。
使用 tcov(1) 检测对象文件以进行基本块覆盖分析。
如果指定了可选的 :profdir 参数,则编译器将在指定位置创建分析目录。分析目录中存储的数据可通过 tcov (1) 或设置了 -xprofile=use:profdir 的编译器使用。
如果省略可选的 :profdir 参数,执行已进行分析的程序时将创建分析目录。只能通过 tcov(1) 使用该分析目录中存储的数据。使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 可以控制分析目录的位置。请参见下文的“环境”部分。
如果 :profdir 指定的位置不是绝对位置,则在编译程序时会相对于当前工作目录来解释该位置。
如果为任何对象文件指定了 :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 一起使用可通过重新使用收集阶段保存的编译数据,缩短使用阶段的编译时间。
在编译大程序时,由于中间数据的保存,使得use阶段的编译时间大大减少。注意,所保存的数据会占用相当大的磁盘空间。
在使用 -xprofile_ircache[=path] 时,path 会覆盖保存缓存文件的位置。缺省情况下,这些文件会作为对象文件保存在同一目录下。当收集阶段和使用阶段出现在两个不同的目录时,指定路径便十分有用。
典型的命令序列如下所示:
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 选项。以下两个条件都成立且编译器无法找到使用 -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 时,此选项才有效。否则,编译器会发出警告。
当启用了约简识别时,编译器会并行化约简,例如 dot 积、最大与最小查找。这些约简产生的舍入与通过非并行化代码获得的舍入不同。
为生成的代码指定寄存器用法。
r 是一个逗号分隔列表,它包含下面的一个或多个子选项:appl、float、frameptr。
用 no% 作为子选项的前缀会禁用该子选项。
示例:-xregs=appl,no%float
请注意,-xregs 子选项仅限于特定的硬件平台。
允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是 g2、g3 和 g4(对于 32 位平台)以及 g2 和 g3(对于 64 位平台)。
强烈建议使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。
在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。由于需要更少的装入和存储指令,因此使用这些寄存器可提高性能。但是,这样使用可能与某些用汇编代码编写的旧库程序冲突。
有关 SPARC 指令集的更多信息,请参见 -xarch。
允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。无论此选项如何,浮点值都可以使用这些寄存器。要生成对浮点寄存器没有任何引用的二进制代码,请使用 -xregs=no%float 并确保源代码未以任何方式使用浮点类型。
允许编译器通过将浮点寄存器用作临时寄存器来生成代码。无论此选项如何,浮点值都可以使用这些寄存器。要生成对浮点寄存器没有任何引用的二进制代码,请使用 -xregs=no%float 并确保源代码未以任何方式使用浮点类型。在代码生成期间,编译器将尝试诊断导致使用浮点、simd 或 x87 指令的代码。
允许编译器将帧指针寄存器(在 IA32 上为 %ebp,在 x86 64 位平台上为 %rbp)用作通用寄存器。
缺省值为 -xregs=no%frameptr。
除非也用 -features=no%except 禁用了异常,否则 C++ 编译器将忽略 -xregs=frameptr。另请注意,-xregs=frameptr 是 -fast 的一部分,但除非同时指定 -features=no%except,否则 C++ 编译器将忽略此设置。
通过 -xregs=frameptr,编译器可以自由使用帧指针寄存器来改进程序性能。但是,这可能会限制调试器和性能测量工具的某些功能。堆栈跟踪、调试器和性能分析器不能对通过 -xregs=frameptr 编译的函数生成报告。
此外,对 Posix pthread_cancel() 的 C++ 调用将无法尝试查找清除处理程序。
如果直接调用或从 C 或 Fortran 函数间接调用的 C++ 函数会引发异常,不应该用 -xregs=frameptr 编译 C、Fortran 和 C++ 混合代码。如果使用 -fast 编译此类混合源代码,请在命令行中的 -fast 选项后添加 -xregs=no%frameptr。
由于 64 位平台上的可用寄存器更多,因此与 64 位代码相比,使用 -xregs=frameptr 编译更容易改进 32 位代码的性能。
注意:如果同时指定了 -xpg,编译器会忽略 -xregs=frameptr 并发出警告。
而且,-xkeepframe 优先于 -xregs=frameptr。
SPARC 缺省值为 -xregs=appl,float。x86 缺省值为 -xregs=no%frameptr,float。在 x86 上 -xregs=frameptr 包含在 -fast 的扩展中。
强烈推荐您用 -xregs=no%appl,float 编译那些用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。
将赋值为指针的函数参数视为受限指针。f 是 %all、%none 或者一个或多个函数名称的逗号分隔列表。该命令行选项可单独使用,但是最好与 -xO3 或更高级别的优化一起使用。
如果使用该选项指定了函数列表,则指定的函数中的指针参数将被视为限定的;如果指定了 -xrestrict=%all,整个 C 文件中的所有指针参数均被视为限定的。
缺省值为 %none。指定 -xrestrict 与指定 -xrestrict=%all 等效。
另请参见:C 用户指南中的“受限指针”。
(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 进行编译。
Linux 编译器接受但是忽略 -xs。Linux 编译器不接受 -xs={yes|no}。
(SPARC)允许编译器假定未发生违反内存保护的情况。
该选项允许编译器使用 64 位 SPARC 体系结构中的无故障装入指令。
由于在发生诸如地址未对齐或段违规的故障时,无故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项。因为只有很少的程序会导致基于内存的陷阱,所以您可以安全地将该选项用于大多数程序。对于显式依赖基于内存的自陷来处理异常情况的程序,请勿使用该选项。
仅当与优化级别 -xO5 及以下 -xarch 值中的一个一起使用时,此选项才能有效:sparc、sparcvis、sparcvis2 或 sparcvis3(用于 -m32 和 -m64)。
(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 一起使用无效。
不执行增加代码大小的优化。如果增大代码大小,不会并行化循环。示例:不解开循环。
在以后的发行版中可能会废弃此选项。改用 -features=[no%]conststrings。
-xstrconst 选项可将文本字符串插入到文本段的只读数据部分而不是缺省数据段。将消除重复字符串,剩余副本在代码中的引用之间共享。
为指令集和优化指定目标系统。
t 必须是以下值之一:native、native64、generic、generic64 和 system-name。
-xtarget 选项允许简便快捷地指定发生在实际系统上的 -xarch、-xchip 和 -xcache 组合。-xtarget 的唯一含义在其扩展中。有关如何查看 -xtarget 等宏选项的扩展的详细信息,请参见 -xdryrun 说明。
-xtarget=native 等效于 -m32、-xarch=native、-xchip=native、-xcache=native。
-xtarget=native64 等效于 -m64、-xarch=native64、-xchip=native64、-xcache=native。
-xtarget=generic 等效于 -m32、-xarch=generic、-xchip=generic、-xcache=generic。
-xtarget=generic64 等效于 -m64、-xarch=generic64、-xchip=generic64、-xcache=generic。
-fast 宏选项在其扩展中包括 -xtarger=native。
-xtarget 命令本身是一个宏选项,其作用与命令行上 -xarch -xchip 和 -xcache 选项的宏扩展相同。因此,您可以通过在 -xtarget 后面附加所需选项来覆盖任何扩展选项。使用 -xdryrun 选项可在运行的系统上确定 -xtarget=native 的扩展。
注意:-xtarget 在特定主机平台上的扩展在该平台上编译时扩展到的 -xarch、-xchip 或 -xcache 设置可能与 -xtarget=native 不同。
在 SPARC 平台上:
在 64 位 SPARC 体系结构上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果指定带有 native64 或 generic64 之外的标志的 -xtarget,还必须指定 -m64 选项,如下所示:
-xtarget=ultra4 ... -m64
否则,编译器将使用 32 位内存模型。
设置在主机环境(假定采用 32 位体系结构)中获得最佳性能的参数。
设置在主机环境(假定采用 64 位体系结构)中获得最佳性能的参数。
这是缺省值,可设置在大多数 32 位平台体系结构上获得最佳性能的参数。
设置在大多数 64 位平台体系结构上获得最佳性能的参数。
获取指定系统的最佳性能。
有效的 SPARC 平台名称如下所示。
常用平台名称:ultra、ultra2、ultra2i、ultra1/140、ultra1/170、ultra1/200、ultra2/1170、ultra2/1200、ultra2/1300、ultra2/2170、ultra2/2200、ultra2/2300、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4、ultra4plus、ultraT1、ultraT2、ultraT2plus、T3、T4、T5、M5、sparc64vi、sparc64vii、sparc64viiplus、sparc64x、sparc64xplus。
注意:以下 SPARC 平台名称已过时,在将来的发行版中可能会删除:ultra、ultra2、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4 和 ultra4plus。
在 x86 平台上:
在 64 位 x86 平台上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果指定带有 native64 或 generic64 之外的标志的 -xtarget,还必须指定 -m64 选项,如下所示:
-xtarget=opteron ... -m64
否则,编译器将使用 32 位内存模型。
这是缺省值,可使大多数 32 位系统上的通用体系结构、芯片和高速缓存实现最佳性能。
可使大多数 64 位系统上的通用体系结构、芯片和高速缓存实现最佳性能。
编译器将生成用于在主机系统上获得最佳性能的代码。该标志可确定编译器运行所在的计算机上可用的体系结构、芯片和高速缓存属性,并假定采用 32 位体系结构。
设置在主机系统中获取最佳性能的参数。该标志可确定编译器运行所在的计算机上可用的体系结构、芯片和高速缓存属性,并假定采用 64 位体系结构。
生成用于在指定 x86 processor-name 上获得最佳性能的代码。将识别以下处理器:barcelona、haswell、ivybridge、nehalem、opteron, pentium、pentium_pro、pentium3、pentium4、penryn、sandybridge、westmere、woodcrest。
-xtarget 子选项的实际扩展可能会随各个编译器发行版发生变化和改进。使用 -dryrun 选项可查看实际扩展:
cc -dryrun -xtarget=ultra4 |& grep ### ### command line files and options (expanded): ### -dryrun -xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2
等效于 -temp=path。
与 __thread 声明说明符结合使用,可利用编译器的线程局部存储工具。使用 __thread 声明线程变量后,请使用 -xthreadvar,以便能够将线程局部存储用于动态(共享)库中的位置相关的代码(非 PIC 代码)。有关如何使用 __thread 的更多信息,请参见 C 用户指南。
o 必须为以下值:
编译动态装入的变量。前缀 no% 可禁用该选项。使用 -xthreadvar=no%dynamic 时对线程变量的访问明显加快,但是不能在动态库中使用对象文件。也就是说,只能在可执行文件中使用对象文件。
如果未指定 -xthreadvar,则编译器所用的缺省设置取决于是否启用与位置无关的代码。如果启用了与位置无关的代码,则该选项设置为 -xthreadvar=dynamic。如果禁用了与位置无关的代码,则该选项设置为 -xthreadvar=no%dynamic。
如果指定了 -xthreadvar 但未指定任何参数,则该选项设置为 -xthreadvar=dynamic。
如果动态库包含与位置有关的代码,则必须指定 -xthreadvar。
链接程序不支持在动态库中与非 PIC 代码等效的线程变量。由于非 PIC 线程变量要快很多,所以应将其用作可执行文件的缺省设置。
如果动态库包含与位置有关的代码,则必须指定 -xthreadvar。
对不同版本的 Oracle Solaris 软件使用线程变量需要在命令行上输入不同选项。
另请参见:-xcode、-KPIC、-Kpic
-xthroughput 选项可告知编译器当多个进程同时在系统上运行时应用程序将会运行。
如果 -xthroughput=yes,编译器首选这样的优化:会稍微降低单个进程的性能,同时提高系统上所有进程完成的工作量。例如,编译器可能会选择在预取数据时不太主动。这样的选择会减少该进程消耗的内存带宽,由此该进程运行速度可能会减慢,但是也会留出更多内存带宽供其他进程共享。
缺省值为 -xthroughput=no。
报告每个编译使用的时间和资源。
针对 K&R C 与 ISO C 之间的差异发出警告。-xtransition 选项与 -Xa 和 -Xt 选项一起使用时将发出消息。通过适当编码,可以消除关于不同行为的所有警告消息。
启用或禁用 ISO C 标准定义的三字母序列的识别。
-xtrigraphs=yes 启用源代码中三字母序列的识别。
-xtrigraphs=no 禁用源代码中三字母序列的识别。
缺省值:
如果未指定 -xtrigraphs 选项,则假定 -xtrigraphs=no。
如果仅指定了 -xtrigraphs,则假定 -xtrigraphs=yes。
指定程序是否包含对动态绑定符号的引用。
-xunboundsym=yes 表示程序包含对动态绑定符号的引用。
-xunboundsym=no 表示程序不包含对动态绑定符号的引用。
缺省值为 -xunboundsym=no。
指定编译器是否优化(解开)循环。n 是正整数。当 n 为 1 时,它是一个命令,编译器不解开任何循环。n 大于 1 时,-xunroll=n 将使编译器解开循环 n 次。
如果需要支持使用 ISO10646 UTF-16 文本字符串的国际化应用程序,请指定 -xustr=ascii_utf16_ushort。换句话说,如果代码中包含您希望在对象文件中由编译器转换成 UTF-16 字符串的文本字符串,请使用该选项。如果不指定该选项,编译器既不生成、也不识别 16 位的文本字符串。使用该选项时,U"ASCII_string" 字符串文字会识别为无符号短整型数组。由于此类字符串还不属于任何标准,因此此选项启用对非标准 C 的识别。
通过指定 -xustr=no,可以关闭编译器识别 U"ASCII_string" 文本字符串。该选项在命令行上最右侧的实例覆盖了先前的所有实例。
缺省值为 -xustr=no。如果指定了没有参数的 -xustr,编译器将不接受该选项,而是发出一个警告。如果 C 或 C++ 标准定义了语法的含义,那么缺省设置是可以更改的。
指定 -xustr=ascii_ustf16_ushort 而不同时指定 U"ASCII_string" 文本字符串不是一个错误。
如果 -std=c11(包括缺省值)已生效,则指定标志 -xustr=ascii_utf16_ushort 会导致错误。如果指定了 -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 example% cc -xustr=ascii_utf16_ushort file.c -c
启用向量库调用自动生成,或在支持 SIMD(Single Instruction Multiple Data,单指令多数据)的 x86 处理器上启用 SIMD 指令生成。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
-xvector 选项需要 -xO3 或更高的优化级别。如果优化级别未指定或低于 -xO3,编译将不会继续,同时会发出消息。
a 等效于以下值。前缀 no% 可禁用子选项。
(Oracle Solaris) 允许编译器将循环内的数学库调用转换为对等效向量数学例程的单个调用(如果能够进行此类转换)。此类转换可提高那些循环计数较大的循环的性能。使用 no%lib 可以禁用此选项。
(SPARC) 对于 -xarch=sparcace 和 -xarch=sparcaceplus,指示编译器使用浮点和整数 SIMD 指令来提高某些循环的性能。与其他 SPARC 平台的该项相对,-xvector=simd 在指定了任何 -xvector 选项(-xvector=none 和 -xvector=no%simd 除外)的 -xarch=sparcace 和 -xarch=sparcaceplus 下始终有效。此外,对于 -xvector=simd,-O 需要大于 3,否则会被跳过而不显示任何警告。
对于所有其他 -xarch 值,指示编译器使用可视化指令集 [VIS1、VIS2、ViS3 等] SIMD 指令来提高某些循环的性能。从根本上来说,使用显式 -xvector=simd 选项,编译器将执行循环转换,从而允许生成特殊向量化的 SIMD 指令以减少循环迭代数。仅当 -O 大于 3 并且 -xarch 为 sparcvis3 及以上时,-xvector=simd 选项才有效。否则,将跳过 -xvector=simd 而不显示任何警告。
(x86) 指示编译器使用本机 x86 SSE SIMD 指令来提高某些循环的性能。在 x86 中,缺省情况下以可产生有利结果的优化级别 3 和更高级别使用流扩展。使用 no%simd 可以禁用该选项。
仅当目标体系结构中存在流扩展(即目标 ISA 至少为 SSE2)时,编译器才会使用 SIMD。例如,可在现代平台中指定 -xtarget=woodcrest、-xarch=generic64、-xarch=sse2、-xarch=sse3 或 -fast 来使用它。如果目标 ISA 没有流扩展,子选项将无效。
完全禁用该选项。
此选项已过时,改为指定 -xvector=lib。
此选项已过时,改为指定 -xvector=%none。
在 x86 平台上的缺省值为 -xvector=simd,在 SPARC 平台上的缺省值为 -xvector=%none。如果指定不带子选项的 -xvector,在 x86 Oracle Solaris、SPARC Solaris 和 Linux 平台上,编译器将分别采用 -xvector=simd,lib、-xvector=lib 和 -xvector=simd。
该选项会覆盖之前的实例,所以 -xvector=%none 会撤消之前指定的 -xvector=lib。
在装入步骤中,编译器包含 libmvec 库。
Note: -xvector=%none 适用于:编译 x86 平台的 Oracle Solaris 内核代码时。
如果使用单独的命令进行编译和链接,要确保为编译和链接使用相同的选项。
(SPARC) 当包括 <vis.h> 头文件以生成 VIS 指令或者当使用汇编程序内联代码 (.il)(使用 VIS 指令)时,应使用 -xvis=yes 进行编译。缺省值为 -xvis=no。指定 -xvis 与指定 -xvis=yes 等效。
VIS[tm] 指令集是 SPARC V9 指令集的扩展。尽管 UltraSPARC 是 64 位处理器,但在很多情况下数据都限制在 8 位或 16 位范围内,特别是多媒体应用程序中。VIS 指令可以用一条指令处理 4 个 16 位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高。
发出有关可能存在的并行编程相关问题的警告,这些问题可能导致在使用 OpenMP 时出现错误的结果。与 -xopenmp 和 OpenMP API 指令一起使用。
编译器在检测到下列情形时会发出警告。
循环是使用 MP 指令并行化的,而这些指令中的不同循环迭代之间存在数据依赖性
OpenMP 数据共享属性子句存在问题。例如,声明在 OpenMP 并行区域中的访问可能导致数据争用的变量 "shared",或者声明其在并行区域中的值在并行区域之后使用的变量 "private"。
如果所有并行化指令在处理期间均未出现问题,则不显示警告。
示例:
cc -xopenmp -xvpara any.c
为组件 c 的位置指定新目录 dir。c 可包括表示 -W 选项下所列工具的任何字符。
如果要指定工具的位置,则工具的新路径名将为 dir/tool。如果对任何一项应用了多个 -Y 选项,则保留最后一个选项。
指定目录 dir 以搜索所有编译器组件。如果 dir 中找不到组件,搜索将转至安装编译器的目录。
更改搜索 include 文件的缺省目录。
更改查找库文件的缺省目录。
更改启动对象文件的缺省目录。
为 lock_lint 创建程序数据库,但不生成可执行文件代码。
cc 可以识别 -a、-e、-r、-t、-u 和 -z 并将这些选项及其参数传递给 ld。cc 还会将所有无法识别的选项都传递给 ld,并显示警告。
某些浮点数学库例程会使用 errno 变量(在 errno.h 中定义)返回错误状态。使用选项 -fast、-xbuiltin、-xlibmieee、-xlibmil 和 -xlibmopt,编译器可以用不设置 errno 变量的等效优化代码自由替换对浮点函数的调用。此外,-fast 还定义宏 __MATHERR_ERRNO_DONTCARE,允许编译器假定数学函数无需设置 errno。因此,依赖于 errno 的值或者浮点函数调用之后引起浮点异常的用户代码会产生不一致的结果。
解决此问题的一种方法是避免使用 -fast 编译此类代码。
但是,如果需要 -fast 优化并且代码依赖于正确设置的 errno 的值或者浮点库调用后出现的相应浮点异常,则应使用以下选项进行编译
-xbuiltin=none -U__MATHERR_ERRNO_DONTCARE \ -xnolibmopt -xnolibmil
以上选项在命令行上用在 -fast 后面,以禁止编译器优化此类库调用,并确保对数学函数的调用将 errno 设置为记录的值。
新的共享库对于 Solaris 发行版 10,要使用 -xprofile 选项,必须安装新的共享库 libxprof.so.1、libxprof_audit.so.1 和 libtdf.so.1。这些库预安装在最新的 Oracle Solaris 发行版上。
编译系统可识别以下 #pragmas:
#pragma align #pragma c99 #pragma does_not_read_global_data #pragma does_not_return #pragma does_not_write_global_data #pragma error_messages #pragma fini #pragma hdrstop #pragma ident #pragma init #pragma [no_]inline #pragma [no_]warn_missing_parameter #pragma int_to_unsigned #pragma opt #pragma pack #pragma rarely_called #pragma redefine_extname #pragma returns_new_memory #pragma struct_align #pragma unknown_control_flow #pragma weak #pragma does_not_read_global_data #pragma does_not_write_global_data #pragma no_side_effect
另请参见OpenMP API User's Guide以获得受支持 OpenMP 2.5 指令的列表。
仅适用于 SPARC:
#pragma nomemorydepend #pragma no_side_effect #pragma pipeloop #pragma unroll
有关这些 pragma 的更多信息,请参阅 C 用户指南。
下面是可以设置的环境变量列表以及对其功能的简短描述。
lint 的一组缺省选项。LINT_OPTIONS 由 lint 解释,就好像已在命令行上设置其值,紧跟在用来调用 lint 的名称后,如下所示:
lint $LINT_OPTIONS ... other-arguments ...
启用或禁用动态调整线程数。
启用或禁用嵌套并行操作。请参见 OpenMP API 用户指南。
该变量告知运行时系统程序可创建的最大线程数。缺省值为 2。请参见 OpenMP API 用户指南。
设置运行时调度类型和块大小。请参见 OpenMP API 用户指南。
与 OMP_NUM_THREADS 相同。
执行的程序为主线程维护主内存堆栈,为每个从属线程维护不同的堆栈。堆栈是临时内存地址空间,用来存储子程序调用中的参数和自动变量。主堆栈的缺省大小约为八兆字节。使用 limit (1) 命令显示当前主堆栈大小并对其进行设置。
多线程程序的每个从属线程均具有其自身的线程堆栈。该堆栈与主线程的主堆栈相似,但对该线程是唯一的。线程的私有数组和变量(对于线程是局部的)在线程堆栈中进行分配。
所有从属线程的堆栈大小都相同,缺省情况下,对于 32 位应用程序为四兆字节,对于 64 位应用程序为八兆字节。可以用环境变量 STACKSIZE 来设置该大小。
对于某些已并行的代码,可能需要将线程堆栈大小设置为比缺省值大的值。
STACKSIZE 环境变量的语法接受表示从属线程堆栈大小的关键字:B 表示字节;K 表示千字节;M 表示兆字节;G 表示千兆字节。
例如,setenv STACKSIZE 8192 可将从属线程堆栈大小设置为 8 MB。1235B 可将从属线程堆栈大小设置为 1235 字节。1235G 可将其设置为 1235 千兆字节。不带后缀字母的整数值的缺省单位仍为千字节。
有时,编译器可能会生成一条警告消息,指出需要更大的堆栈大小。但是,无法得知要将其设置为多大,除非通过反复试验得出,特别是在涉及私有/本地数组的情况下。如果堆栈大小太小而使线程无法运行,程序会因段故障而中止。
cc 通常在 tmp 目录中创建临时文件。您可以通过将环境变量 TMPDIR 设置为选择的目录来指定其他目录。(如果 TMPDIR 不是有效的目录,则 cc 将使用 tmp)。-xtemp 选项优先于 TMPDIR 环境变量。
(已过时)不再支持源代码浏览器功能。
如果已设置,会在使用 -xprofile=collect 编译的程序执行时将从中收集的分析数据存储在当前工作目录中名为 profdir 的目录中。如果编译时在 -xprofile=collect[:profdir] 中指定了可选参数 :profdir,则 SUN_PROFDATA 没有任何作用。
如果已设置,会将从使用 -xprofile=collect 编译的程序中收集的分析数据存储在 UNIX 目录名为 dirname 的目录中。如果 dirname 不是绝对位置,则在程序执行时会相对于当前工作目录来解释该位置。如果编译时在 -xprofile=collect[:profdir] 中指定了可选参数 :profdir,则 SUN_PROFDATA_DIR 没有任何作用。
控制每个辅助线程的任务结束状态,可以设置为 spin 或 sleep ns。缺省值为 sleep。有关详细信息,请参见 OpenMP API 用户指南。
如果将该环境变量设置为 TRUE,可从 OpenMP 及其他并行化运行时系统输出警告消息。如果使用 sunw_mp_register_warn() 注册了一个函数来处理警告消息,则即使设置为 TRUE,SUNW_MP_WARN 也不会输出任何警告消息。如果未注册函数且将 SUNW_MP_WARN 设置为 TRUE,则 SUNW_MP_WARN 会将警告消息输出到 stderr。如果未注册函数且未设置 SUNW_MP_WARN,则不发出任何警告消息。有关 sunw_mp_register_warn() 的更多信息,请参见 C 用户指南。
环境变量 SUN_PROFDATA_REPLACE 的值指明了在运行时检测到对象文件的更改版本时要重置的分析数据范围。使用 SUN_PROFDATA_REPLACE 可确保分析数据与指定程序单元范围内分析的程序保持一致。
SUN_PROFDATA_REPLACE 的值及其含义如下所示:
重置已更改对象文件的分析数据。
重置包含已更改对象文件的程序中所有对象文件的分析数据。
如有任何对象文件发生更改均重置分析目录的全部内容。
SUN_PROFDATA_REPLACE 的缺省设置为 SUN_PROFDATA_REPLACE=objfile。
示例:
% setenv SUN_PROFDATA_REPLACE program (csh) $ export SUN_PROFDATA_REPLACE=program (ksh)
如果采用该设置,当执行包含已更改对象文件的程序时,程序中所有对象文件的分析数据都会重置。相关选项包括 -xOn 和 -xipo=n。
设置该环境变量可启用异步分析收集。在异步分析收集模式下,每隔一定时间(持续时间以秒为单位指定)从正在运行的进程收集分析数据。
SUN_PROFDATA_ASYNC_INTERVAL 没有任何作用,除非环境变量 LD_AUDIT、LD_AUDIT_32 或 LD_AUDIT_64 之一设置为 /usr/lib/{,64}/libxprof_audit.so.1。
异步分析收集需要 MT 安全且基于 mmap 的内存分配器,例如 libumem (3LIB) ,通过将 UMEM_OPTIONS 设置为 backend=mmap 指定基于 mmap 的分配。
示例:要从 64 位进程启用时间间隔为 1 分钟的异步分析收集,请指定以下环境变量:
$ env LD_AUDIT_64=/usr/lib/64/libxprof_audit.so.1 \ SUN_PROFDATA_ASYNC_INTERVAL=60 UMEM_OPTIONS=backend=mmap \ 64-bit-program [program-args]
如果设置为非零值,可将来自异步收集器的详细消息输出到 stderr。除非启用异步分析收集,否则 SUN_PROFDATA_ASYNC_VERBOSE 没有任何作用。
如果设置为 1,可使分析器清除进程调用 exit() 与进程退出完成期间的数据结构。如果设置为 0,可避免在应用程序调用 exit() 之前尚未终止的应用程序线程破坏性干扰分析收集。有关详细信息,请参见 exit (3C) 。缺省设置为 SUN_PROFDATA_CLEANUP_AFTER_EXIT=0。
可执行输出文件
tcov 支持
对象文件库
C 源文件
tcov (1) 测试覆盖输入文件
预处理后的 C 源文件
inline (1) 扩展文件
lock_lint 数据库
对象文件
-xprofile 所用数据的目录
汇编程序源文件
动态库
tcov (1) 的输出
编译器前端
编译器命令行驱动程序
代码生成器 (SPARC)
运行时启动代码
运行时启动代码
运行时启动代码
汇编程序
使用 gprof (1) 进行分析的启动代码
-xpg 的缺省分析文件
过程间优化器 (SPARC)
全局优化器
bids 支持
使用 prof (1) 和 intro (3) 进行分析的启动代码
未对齐数据支持 (SPARC)
-p 的缺省分析文件
后优化器 (SPARC)
静态同步错误检测(Oracle Solaris 操作环境)
堆栈溢出检查 (SPARC)
使用 -xpch 选项时用于存储数据的目录。
优化器、代码生成器 (x86)
过程间分析器 (x86)
-Xa 支持
-Xc 支持
xpg4 支持
SUSv3 支持
-Xs 支持
-Xt 支持
使用 -xprofile=collect 编译的程序的初始化和终结化处理程序
analyzer (1) 、 as (1) 、 c89 (1) 、 c99 (1) 、 cflow (1) 、 cscope (1) 、 ctags (1) 、 ctrace (1) 、 dbx (1) 、 er_src (1) 、 indent (1) 、 inline (4) 、 ld (1) 、 lint (1) 、 lock_lint (1) 、 prof (1) 、 sunstudio (1) 、 tmpnam (3C) 、 version (1)
C 用户指南
OpenMP API 用户指南
ISO/IEC 9899-1990 编程语言-C 标准
ISO/IEC 9899-1999 编程语言-C 标准