JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

B.1 选项语法

B.2 cc 选项

B.2.1 -#

B.2.2 -###

B.2.3 -Aname[ (tokens)]

B.2.4 -B[static| dynamic]

B.2.5 -C

B.2.6 -c

B.2.7 -Dname[( arg[,arg])][= expansion]

B.2.8 -d[y| n]

B.2.9 -dalign

B.2.10 -E

B.2.11 -errfmt[=[ no%]error]

B.2.12 -errhdr[=h]

B.2.13 -erroff[= t]

B.2.14 -errshort[= i]

B.2.15 -errtags[= a]

B.2.16 -errwarn[= t]

B.2.17 -fast

B.2.18 -fd

B.2.19 -features=[v]

B.2.19.1 --features=typeof 示例

B.2.20 -flags

B.2.21 -flteval[={ any|2}]

B.2.22 -fma[={ none|fused}]

B.2.23 -fnonstd

B.2.24 -fns[={no |yes}]

B.2.25 -fPIC

B.2.26 -fpic

B.2.27 -fprecision=p

B.2.28 -fround=r

B.2.29 -fsimple[= n]

B.2.30 -fsingle

B.2.31 -fstore

B.2.32 -ftrap=t[ ,t...]

B.2.33 -G

B.2.34 -g

B.2.35 -g3

B.2.36 -H

B.2.37 -h name

B.2.38 -I[-| dir]

B.2.39 -i

B.2.40 -include filename

B.2.41 -KPIC

B.2.42 -Kpic

B.2.43 -keeptmp

B.2.44 -Ldir

B.2.45 -lname

B.2.46 -library=sunperf

B.2.47 -m32|-m64

B.2.48 -mc

B.2.49 -misalign

B.2.50 -misalign2

B.2.51 -mr[, string]

B.2.52 -mt[={yes |no}]

B.2.53 -native

B.2.54 -nofstore

B.2.55 -O

B.2.56 -o filename

B.2.57 -P

B.2.58 -p

B.2.59 -Qoption phase option[,option..]

B.2.60 -Q[y| n]

B.2.61 -qp

B.2.62 -Rdir[ :dir]

B.2.63 -S

B.2.64 -s

B.2.65 -traceback[={ %none|common|signals_list}]

B.2.66 -Uname

B.2.67 -V

B.2.68 -v

B.2.69 -Wc ,arg

B.2.70 -w

B.2.71 -X[c| a|t|s]

B.2.72 -x386

B.2.73 -x486

B.2.74 -Xlinker arg

B.2.75 -xaddr32[=yes| no]

B.2.76 -xalias_level[= l]

B.2.77 -xanalyze={code| no}

B.2.78 -xannotate[=yes| no]

B.2.79 -xarch=isa

B.2.79.1 用于 SPARC 和 x86 的 -xarch 标志

B.2.79.2 用于 SPARC 的 -xarch 标志

B.2.79.3 用于 x86 的 -xarch 标志

B.2.79.4 交互

B.2.79.5 警告

B.2.80 -xautopar

B.2.81 -xbinopt={prepare| off}

B.2.82 -xbuiltin[=( %all|%default|%none)]

B.2.83 -xCC

B.2.84 -xc99[= o]

B.2.85 -xcache[= c]

B.2.86 -xcg[89| 92]

B.2.87 -xchar[= o]

B.2.88 -xchar_byte_order[ =o]

B.2.89 -xcheck[= o]

B.2.89.1 -xcheck=init_local 的初始化值

基本类型

初始化结构、联合和数组

B.2.90 -xchip[= c]

B.2.91 -xcode[= v]

B.2.92 -xcrossfile

B.2.93 -xcsi

B.2.94 -xdebugformat=[stabs|dwarf ]

B.2.95 -xdepend=[yes| no]

B.2.96 -xdryrun

B.2.97 -xdumpmacros[= value[,value...]]

B.2.98 -xe

B.2.99 -xF[= v[,v...]]

B.2.99.1 值

B.2.100 -xhelp=flags

B.2.101 -xhwcprof

B.2.102 -xinline=list

B.2.103 -xinstrument=[ no%]datarace

B.2.104 -xipo[= a]

B.2.104.1 -xipo 示例

B.2.104.2 何时不使用 -xipo=2 过程间分析

B.2.105 -xipo_archive=[ a]

B.2.106 -xivdep[= p]

B.2.107 -xjobs=n

B.2.108 -xkeepframe[=[ %all,%none,name,no% name]]

B.2.109 -xldscope={v}

B.2.110 -xlibmieee

B.2.111 -xlibmil

B.2.112 -xlibmopt

B.2.113 -xlic_lib=sunperf

B.2.114 -xlicinfo

B.2.115 -xlinkopt[= level]

B.2.116 -xloopinfo

B.2.117 -xM

B.2.118 -xM1

B.2.119 -xMD

B.2.120 -xMF filename

B.2.121 -xMMD

B.2.122 -xMerge

B.2.123 -xmaxopt[=v]

B.2.124 -xmemalign=ab

B.2.125 -xmodel=[a]

B.2.126 -xnolib

B.2.127 -xnolibmil

B.2.128 -xnolibmopt

B.2.129 -xnorunpath

B.2.130 -xO[1|2| 3|4|5]

B.2.130.1 SPARC 优化

B.2.130.2 x86 优化级别

B.2.131 -xopenmp[= i]

B.2.132 -xP

B.2.133 -xpagesize=n

B.2.134 -xpagesize_heap=n

B.2.135 -xpagesize_stack=n

B.2.136 -xpch=v

B.2.136.1 自动创建预编译头文件

B.2.136.2 手动创建预编译头文件

B.2.136.3 编译器如何处理现有的预编译头文件

B.2.136.4 指示编译器使用特定的预编译头文件

B.2.136.5 活前缀

B.2.136.6 浏览头文件以查找问题

B.2.136.7 预编译头文件高速缓存

B.2.136.8 忠告

B.2.136.9 预编译头文件依赖性和 make 文件

B.2.137 -xpchstop=[file |<include>]

B.2.138 -xpec[={yes|no}]

B.2.139 -xpentium

B.2.140 -xpg

B.2.141 -xprefetch[= val[,val]]

B.2.141.1 预取延迟比率

B.2.142 -xprefetch_auto_type= a

B.2.143 -xprefetch_level= l

B.2.144 -xprofile= p

B.2.145 -xprofile_ircache[ =path]

B.2.146 -xprofile_pathmap

B.2.147 -xreduction

B.2.148 -xregs=r[, r...]

B.2.149 -xrestrict[= f]

B.2.150 -xs

B.2.151 -xsafe=mem

B.2.152 -xsfpconst

B.2.153 -xspace

B.2.154 -xstrconst

B.2.155 -xtarget=t

B.2.155.1 -xtarget 值(SPARC 平台)

B.2.155.2 -xtarget 值(x86 平台)

B.2.156 -xtemp=dir

B.2.157 -xthreadvar[= o]

B.2.158 -xtime

B.2.159 -xtransition

B.2.160 -xtrigraphs[={ yes|no}]

B.2.161 -xunroll=n

B.2.162 -xustr={ascii_utf16_ushort |no}

B.2.163 -xvector[= a]

B.2.164 -xvis

B.2.165 -xvpara

B.2.166 -Yc , dir

B.2.167 -YA, dir

B.2.168 -YI, dir

B.2.169 -YP, dir

B.2.170 -YS, dir

B.2.171 -Zll

B.3 传递给链接程序的选项

B.4 用户提供的缺省选项文件

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO C 之间的差异

索引

B.2 cc 选项

本节按字母顺序介绍 cc 选项。cc(1) 手册页中也提供了这些说明。使用 cc -flags 选项可获得一行有关这些说明的摘要。

注明特定于一个或多个平台的选项可被接受,且不会出现错误,但在其他所有平台上会被忽略。

B.2.1 -#

启用详细模式,显示命令选项的展开方式。显示调用的每个组件。

B.2.2 -###

在调用每个组件时显示该组件,但不实际执行它。还显示命令选项扩展的过程。

B.2.3 -Aname[ (tokens)]

name 作为谓词与指定的 tokens 关联,如同使用 #assert 预处理指令一样。预断言:

这些预断言在 -Xc 模式下无效。

后面仅跟随一个短划线 (-) 的 -A 将导致所有预定义宏(以 __ 开头的宏除外)和预定义断言被忽略。

B.2.4 -B[static| dynamic]

指定用于链接的库绑定static 类型还是 dynamic 类型,可分别指明库是非共享的还是共享的。

如果给定 -lx 选项,则 -Bdynamic 使链接编辑器查找名称为 libx.so 的文件,然后查找名称为 libx.a 的文件。

–Bstatic 使链接编辑器仅查找名称为 libx.a 的文件。此选项可作为一个切换开关在命令行中多次指定。此选项及其参数将传递给 ld(1)。


注 - 在 Oracle Solaris 64 位编译环境中,许多系统库(例如 libc)只能作为动态库使用。因此,请勿在命令行上将 -Bstatic 用作最后一个切换开关。


此选项及其参数传递给链接程序。

B.2.5 -C

防止 C 预处理程序删除注释,位于预处理指令行中的注释除外。

B.2.6 -c

指示 C 编译器ld(1) 抑制链接并为每个源文件生成一个 .o 文件。您可使用 -o 选项显式指定单个目标文件。当编译器生成每个 i 或 . c 输入文件的目标代码时,总是会在当前的工作目录中创建一个对象 (.o) 文件。如果抑制链接步骤,将会同时抑制删除目标文件。

B.2.7 -Dname[( arg[,arg])][= expansion]

使用可选参数定义宏,如同使用 #define 预处理指令定义宏一样。如果未指定 =expansion,则编译器假定为 1

有关编译器预定义宏的列表,请参见 cc(1) 手册页。

B.2.8 -d[y| n]

-dy 指定动态链接,这是链接编辑器中的缺省链接。

-dn 指定链接编辑器中的静态链接。

此选项及其参数将传递给 ld(1)。


注 - 如果将此选项与动态库结合使用,将导致致命错误。大多数系统库仅作为动态库可用。


B.2.9 -dalign

(SPARC) 已废弃。您不该使用此选项。改用 -xmemalign=8s。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项。在 x86 平台上会在无提示的情况下忽略此选项。

B.2.10 -E

仅通过预处理程序运行源文件,并将输出发送给 stdout。预处理程序直接构建到编译器中,但 -Xs 模式除外,因为该模式会调用 /usr/ccs/lib/cpp。包含预处理程序行号信息。另请参见 -P 选项的描述。

B.2.11 -errfmt[=[ no%]error]

如果要将字符串 "error:" 作为前缀添加到错误消息开头以将错误消息与警告消息相区分,可使用此选项。此前缀也可附加到通过 -errwarn 转换成错误的警告。

表 B-1 -errfmt 标志

标志
含义
error
向所有错误消息添加前缀 "error: "。
no%error
不向任何错误消息添加前缀 "error: "。

如果不指定此选项,则编译器将其设置为 -errfmt=no%error。如果指定了 -errfmt 但未提供值,则编译器会将其设置为 -errfmt=error

B.2.12 -errhdr[=h]

将来自头文件的警告限制为由下表中的标志所指示的头文件组:

表 B-2 —errhdr 选项

含义
%all
检查使用的所有头文件。
%none
不检查头文件。
%user
检查所有用户头文件,但 /usr/include 及其子目录中的头文件除外。此外,还检查编译器提供的所有头文件。这是缺省值。

B.2.13 -erroff[= t]

此命令抑制 C 编译器警告消息,但对错误消息没有影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。

t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tagno% tag%all%none。顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。下表列出了 -erroff 值。

表 B-3 -erroff 标志

标志
含义
tag
抑制由 tag 指定的警告消息。可通过 -errtags=yes 选项来显示消息的标记。
no%tag
启用由 tag 指定的警告消息。
%all
禁止所有警告消息。
%none
启用所有警告消息(缺省)。

缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。

-erroff 选项只能抑制来自 C 编译器前端并在使用 -errtags 选项时显示标记的警告消息。您可以更好地控制错误消息抑制。请参见2.11.8 error_messages

B.2.14 -errshort[= i]

使用此选项可在编译器发现类型不匹配时控制所生成错误消息的详细程度。当编译器发现涉及到大聚集的类型不匹配时,此选项特别有用。

i 可以为下表中所列出的值之一。

表 B-4 -errshort 标志

标志
含义
short
以短形式输出错误消息,且不会出现类型扩展。不扩展聚集成员、函数参数和返回类型。
full
以完全详细形式输出错误消息,并显示不匹配类型的完全扩展。
tags
对于具有标记名称的类型,输出错误消息的标记名称。无标记名称的类型将以扩展形式显示。

如果不指定 -errshort,编译器会将该选项设置为 -errshort=full。如果指定了 -errshort 但未提供值,则编译器会将该选项设置为 -errshort=tags

该选项不会累积。它接受命令行中指定的最后一个值。

B.2.15 -errtags[= a]

C 编译器前端的每条警告消息显示消息标志,可以使用 -erroff 选项抑制该消息,或使用 -errwarn 选项将其设置为致命错误。来自 C 编译器驱动程序以及 C 编译系统其他组件的消息不带错误标记,使用 -errof 选项并不能抑制这些消息,而使用 -errwarn 选项也不会产生致命错误。

a 可以是 yesno。缺省值为 -errtags=no。指定 -errtags 与指定 -errtags=yes 等效。

B.2.16 -errwarn[= t]

使用 -errwarn 选项可以在出现指定的警告消息时使 C 编译器退出,并指示故障状态。

t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tagno% tag%all%none。顺序很重要,例如如果出现除 tag 之外的任何警告,%all,no%tag 会使 cc 以致命状态退出。

由于编译器错误检查的改善和功能的增加,C 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版中编译时也可能出现错误。

只有来自 C 编译器前端在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C 编译器以失败状态退出。

下表详细列出了 -errwarn 值:

表 B-5 -errwarn 标志

标志
含义
tag
tag 指定的消息作为警告消息发出时使 cc 以致命状态退出。如果未出现 tag,则没有影响。
no%tag
tag 指定的消息仅作为警告消息发出时防止 cc 以致命状态退出。如果未发出 tag 指定的消息,则不会产生任何影响。为了避免在发出警告消息时导致 cc 以致命状态退出,可使用该选项来还原以前用该选项和 tag%all 指定的警告消息。
%all
在发出任何警告消息时导致编译器以致命状态退出。%all 可以后跟 no%tag,以避免该行为的特定警告消息。
%none
在发出任何警告消息时防止警告消息导致编译器以致命状态退出。

缺省值为 -errwarn=%none。单独指定 -errwarn-errwarn=%all 等效。

B.2.17 -fast

此选项是一个宏,可有效用作调整可执行文件以实现最佳运行时性能的起点。-fast 选项宏随编译器发行版的升级而变化,并扩展为目标平台特定的多个选项。可使用 -# 选项或 -xdryrun 检查 -fast 的扩展选项,并将 -fast 的相应选项结合到正在进行的可执行文件优化过程中。

-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见B.2.112 -xlibmopt

-fast 选项会影响 errno 的值。有关更多信息,请参见2.13 保留 errno 的值

-fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见A.1.2 编译时选项和链接时选项

–fast 选项不适于计划在编译机器之外的其他目标机器上运行的程序。在这种情况下,请在 -fast 后附带相应的 -xtarget 选项。例如:

cc -fast -xtarget=generic ...

对于依赖于 SUID 指定的异常处理的 C 模块,请在 -fast 后附带 -xnolibmil

% cc -fast -xnolibmil

使用 -xlibmil 时,通过设置 errno 或调用 matherr(3m) 无法标记异常。

–fast 选项不适于要求与 IEEE 754 标准严格一致的程序。

下表列出了 -fast 在各平台中选择的选项集。

表 B-6 -fast 扩展选项标志

选项
SPARC
x86
-fns
X
X
-fsimple=2
X
X
-fsingle
X
X
-nofstore
-
X
-xalias_level=basic
X
X
-xbuiltin=%all
X
X
-xlibmil
X
X
-xlibmopt
X
X
-xmemalign=8s
X
-
-xO5
X
X
-xregs=frameptr
-
X
-xtarget=native
X
X

注 - 有些优化对程序行为进行特定假定。如果程序不符合这些假定,应用程序可能会失败或产生错误结果。请参阅各个选项的描述,以确定您的程序是否适合用 -fast 编译。


由这些选项执行的优化可能会改变由 ISO C 和 IEEE 标准定义的程序的行为。有关详细信息,请参见特定选项的描述。

-fast 标志的作用与命令行上的宏扩展相同。因此,您可以通过在 -fast 后附带预期的优化级别或代码生成选项来覆盖优化级别和代码生成选项。使用 -fast -xO4 对进行编译类似于使用 -xO2 -xO4 对进行编译。后者优先。

在 x86 上,-fast 选项包括 -xregs=frameptr。有关详细信息,特别是编译混合 C、Fortran 和 C++ 源代码时,请参见该选项的介绍。

请勿对依赖于 IEEE 标准异常处理的程序使用此选项;否则会产生不同的数值结果、程序提前终止或意外的 SIGFPE 信号。

要在运行的平台上查看 —fast 的实际扩展,请使用以下命令:

% cc -fast -xdryrun |& grep ###

B.2.18 -fd

报告 K&R 样式的函数定义和声明。

B.2.19 -features=[v]

下表列出了 v 的可接收值。

表 B-7 -features 标志

含义
[no%]conststrings
启用将文本字符串放置在只读内存中。缺省值为 -features=conststrings,这会将文本字符串放在只读的数据段中。请注意,现在,使用此选项进行编译时,编译尝试写入文本字符串内存位置的程序会导致段故障。no% 前缀可禁用此子选项。
extensions
允许零大小的结构/联合声明以及返回语句返回一个值的 void 函数起作用。
extinl
将外部内联函数生成为全局函数。这是缺省值,符合 1999 C 标准。
no%extinl
将外部内联函数生成为静态函数。使用 -features=no%extinl 编译新代码可获得与旧版的 C 和 C++ 编译器相同的 extern 内联函数处理方式。
[no%]typeof
启用/禁用 typeof 运算符的识别。typeof 运算符返回其参数(表达式或类型)的类型。它在语法上的指定类似 sizeof 运算符,但在语义上的行为类似通过 typedef 定义的类型。

因此,可以将其用在可使用 typedef 的任意位置。例如,可将其用在声明、转换中,也可用在 sizeoftypeof 的内部。缺省值为 -features=typeof

no% 前缀可禁用此功能。

%none
此选项被禁用。

旧的 C 和 C++ 对象(使用本发行版之前的 Solaris Studio 编译器创建的对象)可以与新的 C 和 C++ 对象链接,而不会更改旧对象的行为。要获得标准的符合规范的行为,您必须使用当前编译器重新编译旧代码。

B.2.19.1 —features=typeof 示例

          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; }

B.2.20 -flags

输出每个可用编译器选项的简短摘要。

B.2.21 -flteval[={ any|2}]

(x86) 使用此选项可以控制浮点表达式的求值方式。

表 B-8 -flteval 标志

标志
含义
2
浮点表达式求值为 long double
any
根据构成表达式的变量和常量类型的组合来对浮点表达式进行求值。

如果未指定 -flteval,编译器会将其设置为 -flteval=any。如果指定了 -flteval 但未提供值,则编译器会将其设置为 -flteval=2

-flteval=2 只能与 -xarch=ssepentium_prosseapentium_proa 一起使用。此外,-flteval=2 还与 -fprecision-nofstore 选项组合不兼容。

另请参见D.1.1 浮点计算器的精度

B.2.22 -fma[={ none|fused}]

(SPARC) 允许自动生成浮点混合乘加指令。-fma=none 表示禁止生成这些指令。-fma=fused 表示允许编译器通过使用浮点混合乘加指令,尝试寻找改进代码性能的机会。

缺省值是 -fma=none

要使编译器生成乘加指令,最低要求是 -xarch=sparcfmaf 且优先级别至少为 -xO2。如果生成了乘加指令,编译器会标记此二进制程序,以防止该程序在不受支持的平台上执行。

乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 -fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。

B.2.23 -fnonstd

此选项是用于 -fns-ftrap=common 的宏。

B.2.24 -fns[={no |yes}]

在 SPARC 平台上,此选项用于启用非标准浮点模式。

对于 x86 平台,此选项用于选择 SSE 刷新为零模式以及非正规数为零模式(如果可用),从而导致将次正规结果刷新为零;如果可用的话,此选项还会导致将次正规操作数视为零。此选项对不使用 SSE 或 SSE2 指令集的传统 x86 浮点运算没有影响。

缺省值为 -fns=no,即标准浮点模式。-fns -fns=yes 相同。

可以选择使用 =yes=no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。

在一些 SPARC 系统上,使用非标准浮点模式会禁用“渐进下溢”,导致将微小的结果刷新为零,而不是产生非正规数。它还导致次正规操作数被替换为零而无提示。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。

在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。有关详细信息,请参见《数值计算指南》。

在 SPARC 系统上,只有编译主程序时此选项才有效。

B.2.25 -fPIC

-KPIC 等效

B.2.26 -fpic

-Kpic 等效

B.2.27 -fprecision=p

(x86) -fprecision={single, double, extended}

将浮点控制字中的舍入精度模式位分别初始化为 single(24 位)、double(53 位)或 extended(64 位)。缺省的浮点舍入精度模式为 extended。

注意,在 x86 中,浮点舍入精度模式的设置只影响精度,不影响指数、范围。

该选项仅在 x86 系统上且仅在编译主程序时才有效,但如果编译 64 位 (-m64) 或 SSE2 启动的 (-xarch=sse2) 处理器,忽略此选项。在 SPARC 系统上也忽略此选项。

B.2.28 -fround=r

设置程序初始化期间在运行时建立的 IEEE 754 舍入模式。

r 必须是以下值之一: nearest tozeronegativepositive

缺省值为 -fround=nearest

含义与 ieee_flags 子例程的含义相同。

如果 rtozeronegativepositive,此标志将在程序开始执行时分别将舍入方向模式设置为舍入到零、舍入到负无穷大或舍入到正无穷大。当 rnearest 或未使用 -fround 标志时,舍入方向模式将保留其初始值不变(缺省为舍入到最接近的值)。

只有编译主程序时该选项才有效。

B.2.29 -fsimple[= n]

使优化器能够进行有关浮点运算的简化假定。

编译器缺省采用 -fsimple=0。指定 -fsimple 与指定 -fsimple=1 等效。

如果存在 n,它必须是 0、1 或 2。

表 B-9 -fsimple 标志

含义
-fsimple=0
允许无简化假定。保持严格的 IEEE 754 一致性。
-fsimple=1
允许保守简化。产生的代码与 IEEE 754 不完全一致,但多数程序所产生的数值结果没有更改。

-fsimple=1 的情况下,优化器可假定:

  • 在进程初始化之后,IEEE 754 缺省舍入/捕获模式不发生改变。

  • 除产生潜在浮点异常的计算不能删除外,产生不可视结果的计算都可以删除。

  • 使用无穷大或 NaN 作为操作数的计算不需要将 NaN 传送到它们的结果中。例如,x*0 可以用 0 替换。

  • 计算不依赖于零的符号。

    如果使用 -fsimple=1,则允许优化器进行完全优化,而不考虑舍入或异常。特别是,在运行时舍入模式包含常量的情况下,浮点计算不能由产生不同结果的计算替换。

-fsimple=2
包含 -fsimple=1 的所有功能,当 -xvector=simd 生效时,还允许使用 SIMD 指令计算约简。

编译器尝试主动浮点优化,这可能导致很多程序因舍入更改而产生不同数值结果。例如,-fsimple=2 允许优化器将给定循环中 x/y 的所有计算都替换为 x*z,其中保证在循环中至少对 x/y 进行一次求值,z=1/y,并且已知 yz 的值在循环执行期间具有常量值。

即使使用 -fsimple=2,也不允许优化器在不产生任何内容的程序中引入浮点异常。

有关优化对精度的影响的更详细说明,请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance Computing》。

B.2.30 -fsingle

(仅限 -Xt-Xs 模式)使编译器按单精度而非双精度对 float 表达式求值。由于已按单精度对 float 表达式进行求值,因此如果在 -Xa-Xc 模式下使用编译器,此选项将无效。

B.2.31 -fstore

(x86) 将表达式或函数赋值给一个变量时或将表达式强制转换为短浮点类型时,该命令可使编译器将浮点表达式或函数的值转换为赋值语句左侧的类型,而不是在寄存器中保留值。由于舍入和截尾,结果可能会与使用寄存器值生成的结果不同。这是缺省模式。

使用 -nofstore 标志可以禁用此选项。

B.2.32 -ftrap=t[ ,t...]

设置启动时生效的 IEEE 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。

t 可以为下表中所列出的值之一。

表 B-10 -ftrap 标志

标志
含义
[no%]division
在除以零时自陷。
[no%]inexact
在结果不精确时自陷。
[no%]invalid
在操作无效时自陷。
[no%]overflow
在溢出时自陷。
[no%]underflow
在下溢时自陷。
%all
在所有以上内容中自陷。
%none
不在以上任何内容中自陷。
common
在无效、除以零和溢出时自陷。

请注意,no% 前缀仅用于修改 %allcommon 值的含义,且必须与其中的一个值一起使用,如以下示例所示。no% 前缀不会显式导致禁用特定的陷阱。

如果未指定 –ftrap,则编译器假定 –ftrap=%none

示例:–ftrap=%all,no%inexact 会设置所有陷阱,但 inexact 除外。

如果使用 -ftrap=t 编译一个例程,则应使用同一选项编译该程序的所有例程,以免出现意外结果。

使用 -ftrap=inexact 陷阱时务必谨慎。只要浮点值不能精确表示,使用 – ftrap=inexact 便会产生自陷。例如,以下语句就会产生这种情况:

x = 1.0 / 3.0;

只有编译主程序时该选项才有效。请小心使用该选项。要启用 IEEE 陷阱,请使用 -ftrap=common

B.2.33 -G

生成共享对象而非动态链接的可执行文件。此选项将传递给 ld(1),并且不能与 -dn 选项一起使用。

使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 选项。

如果通过指定 -G 以及其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在与生成的共享对象链接时也指定这些选项。

创建共享对象时,用 -m64 编译的所有 64 位 SPARC 目标文件还必须用显式 -xcode 值(如B.2.91 -xcode[= v]中所述)进行编译。

B.2.34 -g

生成附加的符号表信息,以供使用 dbx(1) 和性能分析器 analyzer(1) 进行调试。

如果指定 -g,并且优化级别为 -xO3 或更低,则编译器提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。

如果指定 -g,并且优化级别为 -xO4,则编译器提供进行全面优化的最佳效果符号信息。

使用 -g 选项进行编译,以使用性能分析器的全部功能。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和性能分析器手册。

使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。


注 - 如果在不同的步骤中编译和链接程序,则在一个步骤中使用 —g 选项而在另一个步骤中不使用该选项不会影响程序的正确性,但会影响调试程序的能力。没有使用 —g(或 —g0)编译但使用 —g(或 —g0)链接的任何模块都将不能正常进行调试。请注意,要进行调试,通查需要使用 —g 选项(或 —g0 选项)对包含函数 main 的模块进行编译。


有关调试的更多信息,请参见《使用 dbx 调试程序》手册。

B.2.35 -g3

生成附加调试信息。

—g3 选项与 —g 相同,其中带有附加调试符号表信息,可以使 dbx 显示源代码中的宏的扩展。与使用 —g 进行编译相比,此附加符号表信息可能会增加生成的 .o 和可执行文件的大小。

B.2.36 -H

输出到标准错误,每行一个错误,包含当前编译期间每个文件的路径名。这样输出的目的是显示包含在其他文件中的文件。

在以下示例中,程序 sample.c 包含文件 stdio.hmath.hmath.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

B.2.37 -h name

共享动态库分配一个名称,从而可以获得不同版本的库。name 应与 -o 选项提供的文件名相同。-hname 之间的空格是可选的。

链接程序会为该库分配指定的 name,并在库文件中将该名称记录为库的内在名称。如果 -hname 选项不存在,则库文件中不记录任何内在名称。

当运行时链接程序将库装入可执行文件时,会将内部名称从库文件复制到可执行文件的所需共享库文件列表中。每个可执行文件都有这样的列表。如果未提供共享文件的内部名称,链接程序就会复制共享库文件的路径。

B.2.38 -I[-| dir]

-I dir dir 添加到在其中搜索 #include 文件(/usr/include 前是相对文件名)的目录列表中,也就是说,这些目录路径不以 /(斜线)开头。

以指定的顺序搜索多个 -I 选项的目录。

有关编译器搜索模式的更多信息,请参见2.16.1 使用 -I- 选项更改搜索算法

B.2.39 -i

选项传递给链接程序,以忽略任何 LD_LIBRARY_PATHLD_LIBRARY_PATH_64 设置。

B.2.40 -include filename

此选项使编译器将 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 选项,则文件的包括顺序与它们在命令行中的显示顺序相同。

B.2.41 -KPIC

(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic32

有关更多信息,请参见B.2.91 -xcode[= v]。有关废弃选项的完整列表,请参见A.1.14 已过时选项

(x86) -KPIC -Kpic 相同。

B.2.42 -Kpic

(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic13。有关更多信息,请参见B.2.91 -xcode[= v]。有关废弃选项的完整列表,请参见A.1.14 已过时选项

(x86) 生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。

B.2.43 -keeptmp

保留编译期间创建的临时文件,而不自动将其删除。

B.2.44 -Ldir

dir 添加到通过 ld(1) 在其中搜索库的目录列表中。此选项及其参数将传递给 ld(1)。


注 - 任何时候都不要将编译器安装目录(/usr/include/lib/usr/lib)指定为搜索目录。


B.2.45 -lname

目标库 libname.solibname.a 链接。库在命令中的顺序很重要,因为符号是从左向右进行解析。

此选项必须位于 sourcefile 参数之后。

B.2.46 -library=sunperf

与 Oracle Solaris Studio 性能库进行链接。

B.2.47 -m32|-m64

指定编译的二进制对象的内存模型。

使用 -m32 来创建 32 位可执行文件和共享库。使用 -m64 来创建 64 位可执行文件和共享库。

在所有 Oracle Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、指针数据类型)为缺省值。在支持 64 位的 Linux 平台上,LP64 内存模型(64 位 long、指针数据类型)为缺省值。-m64 仅允许在支持 LP64 模型的平台上使用。

使用 -m32 编译的目标文件或库无法与使用 -m64 编译的目标文件或库链接。

使用 -m32|-m64 编译的模块必须还使用 -m32 |-m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见A.1.2 编译时选项和链接时选项

在 x86/x64 平台上使用 -m64 编译具有大量静态数据的应用程序时,可能还需要 -xmodel=medium。请注意,部分 Linux 平台不支持中等模型。

请注意,在早期的编译器发行版中,由 -xarch 选项中选择的指令集来指定内存模型(ILP32 或 LP64)。从 Oracle Solaris Studio 12 编译器开始,此缺省值就不再是这样了。在大多数平台上,仅需将 -m64 添加到命令行便可以创建 64 位对象。

在 Oracle Solaris 上,-m32 为缺省值。在支持 64 位程序的 Linux 系统上,-m64 -xarch=sse2 是缺省选项。

另请参见 -xarch 的描述。

B.2.48 -mc

目标文件的 .comment 部分中删除重复字符串。使用 -mc 标志时,会调用 mcs -c

B.2.49 -misalign

(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=1i 选项。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项

B.2.50 -misalign2

(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=2i 选项。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项

B.2.51 -mr[, string]

-mr 可从 .comment 部分中删除所有字符串。使用此标志时,会调用 mcs -d -a

-mr,string 可从 .comment 部分中删除所有字符串,并在目标文件的该部分插入 string。如果 string 包含嵌入空白,则必须将其括入引号。空 string 将导致 .comment 部分为空。此选项将作为 -d -astring 传递给 mcs

B.2.52 -mt[={yes |no}]

使用此选项,可以通过 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 进行编译时,-lthread-lpthread 均不会自动包括在 -mt=yes 内。生成共享库时,您需要显式列出这些库。

-xopenmp 选项(用于使用 OpenMP 共享内存并行化 API)自动包含 -mt=yes

如果使用 -mt=yes 进行编译并在单独的步骤中进行链接,则除了在编译步骤中外,还必须在链接步骤中使用 mt=yes 选项。如果使用 -mt=yes 编译和链接一个转换单元,则必须使用 -mt=yes 编译和链接该程序的所有单元。

-mt=yes 是编译器的缺省行为。如果不需要此行为,请使用 -mt=no 进行编译。

选项 -mt-mt=yes 等效。

另请参见B.2.126 -xnolib、Oracle Solaris《多线程编程指南》和《链接程序和库指南

B.2.53 -native

此选项与 -xtarget=native 意义相同。

B.2.54 -nofstore

(x86)将浮点表达式或函数赋值给一个变量或转换为短浮点类型时,不将该表达式或函数的值转换为赋值左侧的类型,而将该值保留在寄存器中。另请参见B.2.31 -fstore

B.2.55 -O

使用缺省优化级别 -xO3-O 宏扩展为 -xO3

-xO3 优化级别会提高运行时性能。但是,对于依赖于被自动视为 volatile 的所有变量的程序,这可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的旧版多线程应用程序。解决方法是用 -xO2 而不是 -O 进行编译。

B.2.56 -o filename

将输出文件命名为 filename 而非缺省的 a.outfilename 不能与输入源文件相同,因为编译器不会覆盖源文件。

filename 必须具有合适的后缀。在与 —c 一起使用时,filename 指定目标 .o 目标文件;在与 —G 一起使用时,它指定目标 .so 库文件。此选项及其参数传递给链接程序 ld

B.2.57 -P

运行 通过 C 预处理程序运行源文件。然后将输出放在带有 .i 后缀的文件中。与 -E 不同,此选项不在输出中包括预处理程序类型的行号信息。另请参见 -E 选项。

B.2.58 -p

此选项现在已过时。请改用B.2.140 -xpg

B.2.59 –Qoption phase option[,option..]

option 传递到编译阶段

要传递多个选项,按照逗号分隔列表的顺序指定它们。可以对使用 -Qopton 传递给组件的选项进行重新排序。驱动程序识别的选项将按正确顺序排列。对于驱动程序已识别的选项,请勿使用 -Qoption

phase 可以为以下列表中的值之一。

acomp

编译器

cg

代码生成器 (SPARC)

cpp

预处理程序

driver

cc 驱动程序

fbe

汇编程序

ipo

过程间优化器

ir2hf

中间代码翻译者 (x86)

iropt

优化器

ld

链接编辑器 (ld)

mcs

mcs-在指定了 —mc—mr 时处理目标文件的注释部分。

postopt

后优化器

ssbd

lock_lint 的编译器阶段

ube

代码生成器 (x86)

另请参见可提供等效功能的 —Wc, arg。提供 —Qoption 是为了与其他编译器兼容。

B.2.60 -Q[y| n]

确定是否向输出文件发出标识信息。-Qy 为缺省值。

如果使用 -Qy,则将关于每个调用的编译工具的标识信息添加到输出文件的 .comment 部分,使用 mcs 可访问这部分文件。此选项对软件管理十分有用。

-Qn 可抑制此信息。

B.2.61 -qp

-p 相同。

B.2.62 -Rdir[ :dir]

将用来指定库搜索目录的、冒号分隔的目录列表传递给运行时链接程序。如果该目录列表存在且非空,则会将其记录在输出目标文件中并传递给运行时链接程序。

如果同时指定了 LD_RUN_PATH-R 选项,则 -R 选项优先。

B.2.63 -S

指示 cc 生成汇编源文件,而不汇编或链接程序。汇编程序语言输出将写入后缀为 .s 的对应文件。

B.2.64 -s

从输出目标文件中删除所有符号调试信息。此选项不能与 -g 一同指定。

传递给 ld(1)。

B.2.65 -traceback[={ %none|common|signals_list}]

在执行中出现严重错误时发出堆栈跟踪。

当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出堆栈跟踪、转储信息并退出。如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪。

要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,但除非生成可执行二进制文件,否则将忽略该选项。使用 -traceback -G 创建共享库是个错误。

表 B-11 -traceback 选项

选项
含义
common
指定应在出现以下任意一组常见信号时发出堆栈跟踪:sigillsigfpesigbussigsegvsigabrt
signals_list
指定应生成堆栈跟踪的信号名称的逗号分隔列表,采用小写形式。可以捕捉以下导致生成信息转储文件的信号:sigquitsigillsigtrapsigabrtsigemtsigfpesigbussigsegvsigsyssigxcpusigxfsz

可在上述任一信号前加上 no% 以禁止捕获该信号。

例如:如果发生 sigsegvsigfpe-traceback=sigsegv,sigfpe 将生成堆栈跟踪和信息转储。

%nonenone
禁用回溯。

如果不指定该选项,则缺省值为 -traceback=%none

只使用 -traceback 而不使用 = 信号表示 -traceback=common

如果您不需要信息转储,请将 coredumpsize 限制设置为零,如下所示:

% limit coredumpsize 0            

-traceback 选项不影响运行时性能。

B.2.66 -Uname

取消定义预处理程序符号 name。此选项可删除由 -D 在同一命令行上创建的预处理程序符号 name 的任何初始定义,包括由命令行驱动程序放置在此的定义。

-U 对源文件中的预处理程序指令没有任何影响。可以在命令行上指定多个 -U 选项。

如果在命令行中为 -D-U 指定了相同的 name,则会取消定义 name,而不管这些选项出现的顺序如何。在以下示例中,-U 取消定义 __sun

cc -U__sun text.c

由于已取消定义 __sun,因此在 test.c 中采用以下形式的预处理程序语句将不会生效。

#ifdef(__sun)

有关预定义符号的列表,请参见B.2.7 -Dname[( arg[,arg])][= expansion]

B.2.67 -V

指示 cc 在编译器执行时输出每个组件的名称和版本 ID。

B.2.68 -v

指示编译器执行更严格的语义检查并启用其他与 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 运行以上示例来了解差异。

B.2.69 -Wc ,arg

参数 arg 传递给指定的组件 c。有关组件的列表,请参见表 1-1

前后参数之间只能用逗号分隔。所有 -W 参数均在其余的命令行参数之后进行传递。要在参数中包括逗号,请在紧靠逗号之前使用转义符 \(反斜杠)。所有 -W 参数均在常规命令行参数之后进行传递。

例如,-Wa,-o,objfile 按该顺序将 -oobjfile 传递给汇编程序。此外,-Wl,-I,name 将导致链接阶段覆盖动态链接程序的缺省名称 /usr/lib/ld.so.1

这些参数相对于其他指定的命令行选项传递给工具的顺序可能会更改后续的编译器发行版。

下表列出了 c 的可能值

表 B-12 -W 标志

标志
含义
a
汇编程序: (fbe); (gas)
c
C 代码生成器: (cg) (SPARC) ;
d
cc 驱动程序
h
中间代码翻译者 (ir2hf)(x86)
l
链接编辑器 (ld)
m
mcs
O(大写的 o)
过程间优化器
o(小写的 o)
后优化器
p
预处理程序 (cpp)
u
C 代码生成器 (ube) (x86)
0 (Zero)
编译器 (acomp)
2
优化器:(iropt)

请注意,您不能使用 -Wdcc 选项传递给 c 编译器。

B.2.70 -w

抑制编译器警告消息。

此选项会覆盖 error_messages pragma。

B.2.71 -X[c| a|t|s]

-X(注意大写X)选项指定符合 ISO C 标准的各种级别。-xc99 的值影响 -X 选项所应用的 ISO C 标准的版本。-xc99 选项的缺省值为支持 1999 ISO/IEC C 标准的 -xc99=all-xc99=none 支持 1990 ISO/IEC C 标准。有关对 1999 ISO/IEC 支持功能的讨论,请参见表 C-6。有关 ISO/IEC C 与 K&R C 的不同点的讨论,请参见G.1 libfast.a 库 (SPARC)

缺省模式是 -Xa

-Xc

c =一致性)对使用非 ISO C 构造的程序发出错误和警告。此选项与 ISO C 严格一致,没有 K&R C 兼容性扩展。如果使用 -Xc 选项,预定义的宏 __STDC__ 的值为 1

-Xa

缺省编译器模式。ISO C 以及 K&R C 兼容性扩展,具有 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果 -Xa 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。如果使用 -Xa 选项,预定义的宏 __STDC__ 的值为 -0

-Xt

(t = transition) 该选项使用 ISO C 以及 K&R C 兼容性扩展,不具有 ISO C 要求的语义更改。 如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果将 -Xt 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。使用 -Xt 选项时,预定义的宏 __STDC__ 的值为 0

-Xs

(s = K&R C) 尝试发出有关在 ISO C 和 K&R C 之间具有不同行为的所有语言构造的警告。编译器语言包含与 K&R C 兼容的所有功能。此选项会调用 cpp 进行预处理。该模式中未定义 __STDC__

B.2.72 -x386

(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见A.1.14 已过时选项

B.2.73 -x486

(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见A.1.14 已过时选项

B.2.74 -Xlinker arg

arg 传递给链接程序 ld(1)。与 —z arg 等效

B.2.75 -xaddr32[=yes| no]

(仅限 Solaris x86/x64-xaddr32=yes 编译标志将生成的可执行文件或共享对象限定为 32 位地址空间。

以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。

指定 -xaddr32=no 时,会生成常见的 64 位二进制文件。

如果未指定 -xaddr32 选项,则假定 -xaddr32=no

如果仅指定了 -xaddr32,则假定 -xaddr32=yes

此选项仅适用于 -m64 编译,并且仅在支持 SF1_SUNW_ADDR32 软件功能的 Oracle Solaris 平台上适用。由于 Linux 内核不支持地址空间限制,此选项在 Linux 上不可用。

链接时,如果单个目标文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。

限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。

有关更多信息,请参阅《链接程序和库指南》中介绍的 SF1_SUNW_ADDR32 软件功能定义。

B.2.76 -xalias_level[= l]

编译器使用 -xalias_level 选项确定为了使用基于类型的别名分析执行优化可以进行何种假设。此选项使指定的别名级别对正在编译的转换单元生效。

如果不指定 -xalias_level 命令,编译器将假定 -xalias_level=any。如果指定不带值的 -xalias_level,则缺省值为 -xalias_level=layout

-xalias_level 选项要求的优化级别为 -xO3 或更高。如果优化级别设置较低,则发出警告并忽略 -xalias_level 选项。

切记,如果使用 -xalias_level 选项,但无法坚持为任何别名级别描述的关于别名的所有假定和约束,则程序的行为未定义。

l 替换为下表中的某一术语。

表 B-13 别名歧义消除级别

标志
含义
any
编译器假定所有内存引用都可在此级别上互为别名。在级别 -xalias_level=any 上,不存在基于类型的别名分析。
basic
如果使用 -xalias_level=basic 选项,编译器将假定调用不同 C 基本类型的内存引用不互为别名。此外,编译器还假定对其他所有类型的引用互为别名,并可以使用任何 C 基本类型作为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。

例如,在 -xalias_level=basic 级别上,编译器假定类型为 int * 的指针变量不会访问浮点对象。因此,编译器可安全执行优化,该优化假定类型为 float * 的指针不会使用 int * 类型指针引用的相同内存作为别名。

weak
如果使用 -xalias_level=weak 选项,编译器会假定任何结构指针都可指向任何结构类型。

任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中的表达式之前进行声明。

您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。

在级别 -xalias_level=weak 上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用使用涉及任何其他类型的内存引用作为别名。

layout
如果使用 -xalias_level=layout 选项,编译器将假定所涉及类型与内存中类型具有相同顺序的内存引用可以互为别名。

编译器假定其类型在内存中看起来并不相同的两个引用并不互为别名。如果初始结构成员在内存中看起来相同,则编译器假定任何两个内存均通过不同的结构类型进行访问。然而,在此级别上,不应使用指向结构的指针来访问不同结构对象的某字段,该字段不属于这两个结构之间在内存中看起来相同的公共初始成员序列。编译器假定此类引用并不互为别名。

-xalias_level=layout 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用涉及其他类型的内存引用作为别名。

strict
如果使用 -xalias_level=strict 选项,编译器将假定涉及结构或联合等类型并且在删除标记后相同的内存引用可以互为别名。反之,编译器假定涉及那些即使在删除标记后也不相同的类型的内存引用不互为别名。

然而,任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中该表达式之前进行声明。

您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。在 -xalias_level=strict 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。

std
如果使用 -xalias_level=std 选项,编译器将假定类型和标记必须相同才能作为别名,但是,使用 char * 的引用可以使用涉及其他任何类型的引用作为别名。此规则与 1999 ISO C 标准中对指针解除引用的限制相同。正确使用此规则的程序将非常易于移植,而且优化之后性能大大提高。
strong
如果使用 -xalias_level=strong 选项,则与 std 级别应用相同限制,但此外,编译器还假定类型 char * 的指针只用来访问类型为 char 的对象。此外,编译器还假定不存在内部指针。内部指针被定义为指向结构成员的指针。

B.2.77 -xanalyze={code| no}

为可使用 Oracle Solaris Studio 代码分析器查看的源代码生成静态分析。

使用 —xanalyze=code 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 —xanalyze=code

缺省值为 —xanalyze=no。有关更多信息,请参见 Oracle Solaris Studio 代码分析器文档。

B.2.78 -xannotate[=yes| no]

仅限 Solaris)创建可供优化和监测工具 binopt(1)、code-analyzer(1)、discover(1)、collect(1) 和 uncover(1) 以后使用的二进制文件。

缺省值为 -xannotate=yes。指定不带值的 -xannotate 等效于 -xannotate=yes

为优化使用优化和监测工具,-xannotate=yes 必须在编译时和链接时均有效。如果不使用优化和监测工具,则使用 -xannotate=no 进行编译和链接可以生成略小的二进制文件和库。

此选项在 Linux 系统上不可用。

B.2.79 –xarch=isa

指定目标指令集体系结构 (instruction set architecture, ISA)

该选项将编译器生成的代码限制为特定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用此选项可能会影响二进制程序的可移植性。


注 - 分别使用 -m64-m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 选项不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。


如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。

指定 _asm 语句或通过 .il 内联模板文件(使用特定于体系结构的指令)进行编译时,可能需要指定合适的 -xarch 值以免出现编译错误。

B.2.79.1 用于 SPARC 和 x86 的 -xarch 标志

下表列出了 SPARC 和 x86 平台通用的 -xarch 关键字。

表 B-14 SPARC 和 x86 平台的通用标志

标志
含义
generic
使用大多数处理器通用的指令集。这是缺省值。
generic64
为了在大多数 64 位平台上获得良好性能而进行编译。此选项与 -m64 -xarch=generic 等效,用于与早期的发行版兼容。
native
为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。
native64
为了在此系统上获得良好性能而进行编译。此选项与 -m64 -xarch=native 等效,用于与早期的发行版兼容。

B.2.79.2 用于 SPARC 的 -xarch 标志

下表介绍了 SPARC 平台上的 -xarch 关键字。

表 B-15 用于 SPARC 平台的 -xarch 标志

标志
含义
sparc
针对 SPARC-V9 ISA (但不带有可视化指令集 (Visual Instruction Set, VIS),也不带有其他特定于实现的 ISA 扩展)进行编译。该选项在 V9 ISA 上使编译器生成高性能代码。
sparcvis
针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。
sparcvis2
此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (VIS) 2.0 版上生成目标代码。
sparcvis3
针对 SPARC-V 9 ISA 的 SPARC VIS 版本 3 进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0 以及混合乘加指令和可视指令集版本 3.0 中的指令。
sparcfmaf
允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。

必须将 -xarch=sparcfmaf fma=fused 结合使用,并具有某个优化级别,以使编译器尝试查找机会来自动使用乘加指令。

sparcima
针对 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 扩展(用于整数乘加)。
sparc4
针对 SPARC-V9 ISA 的 SPARC4 版本进行编译。允许编译器使用 SPARC-V9 指令集以及扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0、混合浮点乘加指令、VIS 3.0 和 SPARC4 指令)中的指令。
v9
等效于 -m64 -xarch=sparc。使用 -xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需使用 -m64
v9a
等效于 -m64 -xarch=sparcvis,用于与早期发行版兼容。
v9b
等效于 -m64 -xarch=sparcvis2,用于与早期发行版兼容。

另请注意:

B.2.79.3 用于 x86 的 -xarch 标志

下表列出了 x86 平台上的 -xarch 标志。

表 B-16 x86 上的 -xarch 标志

标志
含义
amd64
(仅限 Solaris)等效于 -m64 -xarch=sse2。使用 -xarch=amd64 来获取 64 位内存模型的传统 makefile 和脚本仅需要使用 -m64
amd64a
(仅限 Solaris)等效于 -m64 -xarch=sse2a
pentium_pro
使指令集限于 32 位 Pentium Pro 体系结构。
pentium_proa
将 AMD 扩展(3DNow!、3DNow!扩展和 MMX 扩展)添加到 32 位 pentium_pro 体系结构中。
sse
SSE 指令集添加到 pentium_pro 体系结构。
ssea
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。
sse2
SSE2 指令集添加到 pentium_pro 体系结构。
sse2a
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。
sse3
将 SSE3 指令集添加到 SSE2 指令集中。
sse3a
将 AMD 扩展指令(包括 3dnow)添加到 SSE3 指令集。
ssse3
使用 SSSE3 指令集补充 pentium_pro、SSE、SSE2 和 SSE3 指令集。
sse4_1
使用 SSE4.1 指令集补充 pentium_pro、SSE、SSE2、SSE3 和 SSSE3 指令集。
sse4_2
使用 SSE4.2 指令集补充 pentium_pro、SSE、SSE2、SSE3、SSSE3 和 SSE4.1 指令集。
amdsse4a
使用 AMD SSE4a 指令集。
aes
使用 Intel 高级加密标准指令集。
avx
使用 Intel 高级向量扩展指令集。

如果在 x86 平台上使用 —m64 编译或链接程序的任一部分,则也必须使用这些选项之一编译程序的所有部分。有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel-64 和 IA-32《Intel Architecture Software Developer's Manual

另请参见1.2 x86 特殊注意事项1.3 二进制兼容验证

B.2.79.4 交互

尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。例如,-xtarget=ultra2 可扩展为 -xarch=sparcvis -xchip=ultra2 -xcache=16/32/1:512/64/1。在以下命令中, -xarch=generic 覆盖了由 -xtarget=ultra2 的扩展设置的 -xarch=sparcvis

example% cc -xtarget=ultra2 -xarch=generic foo.c

B.2.79.5 警告

如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。

如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。

B.2.80 -xautopar


注 - 此选项不能启动 OpenMP 并行化指令。


为多个处理器启用自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高,则将优化级别提高到 -xO3 并发出警告。

如果要进行自己的线程管理,请勿使用 -xautopar

为了使执行速度更快,该选项要求使用多处理器系统。在单处理器系统中,生成的二进制文件的运行速度通常较慢。

要在多线程环境中运行已并行化的程序,必须在执行之前将环境变量 OMP_NUM_THREADS 设置为大于 1 的值。如果未设置,则缺省值为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,应将 OMP_NUM_THREADS 设置为正在运行的系统中的可用虚拟处理器数,该值可使用 Oracle Solaris psrinfo(1) 命令确定。

如果使用 -xautopar 且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的 C 运行时库包含进来。如果使用 -xautopar,而且在不同的步骤中进行编译和链接,则还必须使用 -xautopar 进行链接。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

B.2.81 -xbinopt={prepare| off}

(SPARC) 此选项现在已废弃,将在以后的编译器发行版中删除。请参见B.2.78 -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) 手册页。

B.2.82 -xbuiltin[=( %all|%default|%none)]

使用 -xbuiltin 选项可改进调用标准库函数的代码的优化。很多标准库函数(例如在 math.hstdio.h 中定义的函数)通常由多个程序使用。-xbuiltin 选项使编译器可在对性能有益时替换内部函数或内联系统函数。有关如何读取目标文件中的编译器注释来确定编译器实际对哪些函数进行替换的说明,请参见 er_src(1) 手册页。

请注意,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。另请参见2.13 保留 errno 的值

-xbuiltin=%default 仅内联未设置 errno 的函数。errno 的值在任何优化级别上都始终是正确的,并且可以可靠地检查。对于 -xO3 或更低级别的 -xbuiltin=%default,编译器将确定哪些调用对内联有益,并且不内联其他函数。-xbuiltin=%none 选项可禁用库函数的所有替换。

如果未指定 -xbuiltin,则在使用 -xO1 和更高的优化级别编译时,缺省值为 -xbuiltin=%default;在使用 -xO0 的优化级别编译时,缺省值为 -xbuiltin=%none。如果指定不带参数的 -xbuiltin,则缺省值为 -xbuiltin=%all,并且编译器会更加主动地替换内部函数或内联标准库函数。

如果使用 -fast 进行编译,则 -xbuiltin 设置为 %all


注 - -xbuiltin 仅内联系统头文件中定义的全局函数,而不会内联用户定义的静态函数。


B.2.83 -xCC

当指定 -xc99=none-xCC 时,编译器将接受 C++ 样式注释。特别是,可使用 // 指示注释的开始。

B.2.84 -xc99[= o]

-xc99 选项可控制编译器对根据 C99 标准(ISO/IEC 9899:1999,编程语言 - C)实现的功能的识别。

下表列出了 o 的可接受值。可以用逗号分隔多个值。

表 B-17 -xc99 标志

标志
含义
lib
启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。no_lib 可禁用这些语义的识别。
all
打开识别支持的 C99 语言功能,并启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。
none
关闭识别支持的 C99 语言功能,并且不启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。

如果未指定 -xc99,编译器缺省采用 -xc99=all,no_lib。如果指定了 -xc99,但没有指定任何值,该选项将设置为 -xc99=all

B.2.85 -xcache[= c]

定义可供优化器使用的缓存属性。此选项不保证使用每个特定的缓存属性。


注 - 尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。


可选属性 [/ti ] 用于设置可以共享高速缓存的线程数。如果没有为 t 指定值,则缺省值为 1。

c 必须是以下值之一:

s/l /a/t 属性定义如下:

si

级别为 i 的数据高速缓存的大小,以千字节为单位

li

级别为 i 的数据高速缓存的行大小,以字节为单位

ai

级别为 i 的数据高速缓存的关联性

ti

共享级别为 i 的高速缓存的硬件线程数

下表列出了 -xcache 值。

表 B-18 -xcache 标志

标志
含义
generic
这是缺省值。该值指示编译器在多数 x86 和 SPARC 处理器上使用高速缓存属性来获得高性能,而不会使任何处理器的性能明显下降。

如果需要,在每个新的发行版本中都会调整最佳定时属性。

native
设置在主机环境中最佳性能的参数。
s1/l1 /a1[/t1]
定义 1 级高速缓存属性。
s1/l1/a1[/t1]:s2/l2/a2[/t2]
定义 1 级和 2 级高速缓存属性。
s1/l1 /a1[/t1] :s2/l2 /a2[/t 2]: s3/l3/ a3[/t3]
定义 1 级、2 级和 3 级缓存属性。

示例: -xcache=16/32/4:1024/32/1 指定以下内容:

B.2.86 –xcg[89| 92]

(SPARC) 已废弃。您不该使用此选项。使用此选项编译生成的代码在当前的 SPARC 平台中运行较慢。应改用 -O,并利用 -xarch-xchip-xcache 的编译器缺省值。

B.2.87 -xchar[= o]

提供此选项只是为了方便从 char 类型定义为 unsigned 的系统中迁移代码。如果不是从这样的系统中迁移,最好不要使用该选项。只有依赖 char 类型符号的代码才需要重写,以便显式指定 signedunsigned

下表列出了 o 的可接受值:

表 B-19 -xchar 标志

标志
含义
signed
将声明为字符的字符常量和变量视为带符号的。此选项会影响已编译代码的行为,而不会影响库例程的行为。
s
signed 等效
unsigned
将声明为字符的字符常量和变量视为无符号的。此选项会影响已编译代码的行为,而不会影响库例程的行为。
u
unsigned 等效。

如果未指定 -xchar,编译器将假定 -xchar=s

如果指定了 -xchar 但未指定值,编译器将假定 -xchar=s

-xchar 选项仅会更改使用 -xchar 编译的代码中 char 类型的值范围。该选项不会更改任何系统例程或头文件中 char 类型的值范围。具体来讲,指定选项时不更改 limits.h 定义的 CHAR_MAXCHAR_MIN 的值。因此,CHAR_MAXCHAR_MIN 不再表示无格式 char 中可编码的值的范围。

如果使用 -xchar,则在将 char 与预定义的系统宏进行比较时要特别小心,原因是宏中的值可能带符号。对于返回可通过宏访问的错误代码的任何例程,这种情况很常见。错误代码一般是负值,因此在将 char 与此类宏中的值进行比较时,结果始终为假。负数永远不等于无符号类型的值。

请勿使用 -xchar 为通过库导出的任何接口编译例程。Oracle Solaris Studio 的所有目标平台的 ABI 将 char 类型指定为 signed,并且系统库的行为也与此相适应。目前还未对系统库针对将 char 指定为无符号的效果进行广泛测试。可以不使用该选项,而是修改代码使其与 char 类型是否带符号没有关联。类型 char 的符号因编译器和操作系统而异。

B.2.88 -xchar_byte_order[ =o]

以指定的字节顺序放置多字符字符常量构成的字符,以生成一个整型常量。使用以下值之一作为 o

B.2.89 -xcheck[= o]

添加针对堆栈溢出的运行时检查并初始化局部变量。

下表列出了 o 的值。

表 B-20 -xcheck 标志

标志
含义
%none
不执行任何 -xcheck 检查。
%all
执行全部 -xcheck 检查。
stkovf
启用堆栈溢出检查。-xcheck=stkovf 将添加针对单线程程序中的主线程以及多线程程序中的从属线程堆栈的堆栈溢出运行时检查。如果检测到堆栈溢出,则生成 SIGSEGV。如果您的应用程序需要以不同于处理其他地址空间违规的方式处理堆栈溢出导致的 SIGSEGV,请参见 sigaltstack(2)
no%stkovf
禁用堆栈溢出检查。
init_local
初始化局部变量。
no%init_local
不初始化局部变量。

如果未指定 -xcheck,则编译器缺省使用 -xcheck=%none。如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%all

在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。

B.2.89.1 -xcheck=init_local 的初始化值

使用 -xcheck=init_local,编译器可在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值。(请注意,这些值可能会发生更改,因此不应该依赖它们。)

基本类型

表 B-21 基本类型的 init_local 初始化

类型
初始化值
Char, __Bool
0x85
short
0x8001
int, long, enum     (-m32)
0xff80002b
long    (-m64)
0xfff00031ff800033
long long
0xfff00031ff800033
pointer
0x00000001 (-m32)

0x0000000000000001 (-m64)

float, float _Imaginary
0xff800001
float _Complex
0xff80000fff800011
double
SPARC: 0xfff00003ff800005

x86: 0xfff00005ff800003

double _Imaginary
0xfff00013ff800015
long double, long double _Imaginary
SPARC: 0xffff0007ff800009 / 0xfff0000bff80000d

x86: 12 bytes (-m32): 0x80000009ff800005 / 0x0000ffff

x86: 16 bytes (-m64): 0x80000009ff800005 / 0x0000ffff00000000

double _Complex
0xfff00013ff800015 / 0xfff00017ff800019
long double _Complex
SPARC: 0xffff001bff80001d / 0xfff0001fff800021 / 0xffff0023ff800025 / 0xfff00027ff800029

x86: 12 bytes (-m32): 0x7fffb01bff80001d / 0x00007fff / 0x7fffb023ff800025 / 0x00007fff

x86: 16 bytes (-m64): 0x00007fff00080000 / 0x1b1d1f2100000000 / 0x00007fff00080000 / 0x2927252300000000

为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中的指针说明进行初始化。

永远不会初始化以下局部变量类型:限定的 constregister、计算的 goto 的标签号、局部标签。

初始化结构、联合和数组

struct 中属于基本类型的字段将按照上表所述进行初始化(与 union 中第一个声明的 pointerfloat 字段相同),以便最大限度地增加未初始化的引用生成可见错误的可能性。

数组元素也按上表所述进行初始化。

嵌套的 structunion 和数组字段可按照上表所述进行初始化,但以下情况除外:struct 包含位字段、union 没有 pointerfloat 字段,或者数组类型无法进行完整的初始化。这些例外情况将使用用于 double 类型的局部变量的值进行初始化。

B.2.90 -xchip[= c]

指定供优化器使用的目标处理器。

尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分。其主要用途是覆盖 -xtarget 选项提供的值。

此选项通过指定目标处理器来指定计时属性。其部分影响表现在以下方面:

下表列出了 SPARC 平台的 c-xchip 值:

表 B-22 SPARC -xchip 标志

标志
含义
generic
使用计时属性,以便在大多数 SPARC 体系结构上获得良好性能。

这是缺省值。该值指示编译器在多数处理器上使用最佳计时属性来获得高性能,而不会使任何处理器的性能明显下降。

native
设置用于在主机环境中实现最佳性能的参数。
sparc64vi
针对 SPARC64 VI 处理器进行优化。
sparc64vii
针对 SPARC64 VII 处理器进行优化
sparc64viiplus
针对 SPARC64 VII+ 处理器进行优化
ultra
使用 UltraSPARC 处理器的计时属性。
ultra2
使用 UltraSPARC II 处理器的计时属性。
ultra2e
使用 UltraSPARC IIe 处理器的计时属性。
ultra2i
使用 UltraSPARC IIi 处理器的计时属性。
ultra3
使用 UltraSPARC III 处理器的计时属性。
ultra3cu
使用 UltraSPARC III Cu 处理器的计时属性。
ultra3i
使用 UltraSPARC IIIi 处理器的计时属性。
ultra4
使用 UltraSPARC IV 处理器的计时属性。
ultra4plus
使用 UltraSPARC IVplus 处理器的计时属性。
ultraT1
使用 UltraSPARC T1 处理器的计时属性。
ultraT2
使用 UltraSPARC T2 处理器的计时属性。
ultraT2plus
使用 UltraSPARC T2+ 处理器的计时属性。
T3
使用 SPARC T3 处理器的计时属性。
T4
使用 SPARC T4 处理器的计时属性。

下表列出了用于 x86 平台的 -xchip 值:

表 B-23 x86 -xchip 标志

标志
含义
generic
使用计时属性,以便在大多数 x86 体系结构上获得良好性能。

这是缺省值。该值指示编译器在多数处理器上使用最佳计时属性来获得高性能,而不会使任何处理器的性能明显下降。

native
设置在主机环境中最佳性能的参数。
core2
针对 Intel Core2 处理器进行优化。
nehalem
针对 Intel Nehalem 处理器进行优化。
opteron
针对 AMD Opteron 处理器进行优化。
penryn
针对 Intel Penryn 处理器进行优化。
pentium
使用 x86 Pentium 体系结构的计时属性
pentium_pro
使用 x86 Pentium Pro 体系结构的计时属性
pentium3
使用 x86 Pentium 3 体系结构的计时属性。
pentium4
使用 x86 Pentium 4 体系结构的计时属性。
amdfam10
针对 AMD AMDFAM10 处理器进行优化。
sandybridge
Intel Sandy Bridge 处理器
westmere
Intel Westmere 处理器

B.2.91 -xcode[= v]

(SPARC) 指定代码地址空间。


注 - 应通过指定 -xcode=pic13-xcode=pic32 生成共享对象。尽管您可以通过 -m64 -xcode=abs64 生成可工作的共享对象,但这些对象的效率将会很低。使用 -m64, -xcode=abs32-m64, -xcode=abs44 生成的共享对象将不起作用。


下表列出了 v 的值。

表 B-24 -xcode 标志

含义
abs32
这是 32 位体系结构的缺省值。生成 32 位绝对地址。代码 + 数据 + BSS 的大小不超过 2**32 字节。
abs44
这是 64 位体系结构的缺省值。生成 44 位绝对地址。代码 + 数据 + BSS 的大小不超过 2**44 字节。只适用于 64 位体系结构。
abs64
生成 64 位绝对地址。只适用于 64 位架构。
pic13
生成共享库(小模型)中使用的与位置无关的代码。与 -Kpic 等效。允许在 32 位体系结构中最多引用 2**11 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**10 个。
pic32
生成共享库(大模型)中使用的与位置无关的代码。与 -KPIC 等效。允许在 32 位体系结构中最多引用 2**30 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**29 个。

对于 32 位体系结构,缺省值是 -xcode=abs32。64 位体系结构的缺省值是 -xcode=abs44

生成共享动态库时,缺省 -xcodeabs44abs32 将与 64 位体系结构一起使用。但指定 -xcode=pic13-xcode=pic32。在 SPARC 上使用 -xcode=pic13-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: .gotsh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13。否则,请指定 -xcode=pic32。有关更多信息,请参见 elfdump(1) 手册页。

按照以下准则来确定应如何使用 -xcode

B.2.92 -xcrossfile

已废弃,不使用。改用 -xipo-xcrossfile—xipo=1 的别名。

B.2.93 -xcsi

允许 C 编译器接受在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。这些语言环境包括 ja_JP.PCK

处理此类语言环境所需的编译器转换阶段可能导致编译时间明显延长。仅当编译的源文件包含此类语言环境中某个语言环境的源代码字符时,才应该使用此选项。

除非指定 -xcsi,否则编译器不识别在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。

B.2.94 -xdebugformat=[stabs|dwarf ]

如果您维护会读取 DWARF 格式的调试信息的软件,请指定 -xdebugformat=dwarf。此选项会导致编译器使用 DWARF 标准格式生成调试信息,这是缺省设置。

表 B-25 -xdebugformat 标志

含义
stabs
-xdebugformat=stabs 使用 STABS 标准格式生成调试信息。
dwarf
-xdebugformat=dwarf 使用 DWARF 标准格式(缺省设置)生成调试信息。

如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。此选项需要一个参数。

此选项影响使用 -g 选项记录的数据的格式。即使在没有使用 -g 的情况下记录少量调试信息,此选项仍可控制其信息格式。因此,即使不使用 -g-xdebugformat 也会有影响。

dbx 和性能分析器软件可识别 STABS 和 DWARF 格式,因此使用此选项对任何工具的功能都没有影响。

有关更多信息,请参见 dumpstabs(1) 和 dwarfdump(1) 手册页。

B.2.95 -xdepend=[yes| no]

分析循环以了解迭代间数据依赖性并执行循环重构,包括循环交换、循环熔合以及标量替换。

对于所有优化级别 -xO3 以及更高级别,-xdepend 缺省为 -xdepend=on。指定 -xdepend 的显式设置会覆盖任何缺省设置。

指定不带参数的 -xdepend 等效于 -xdepend=yes

依赖性分析在单处理器系统中可能很有用。但是,如果您在单处理器系统上使用 -xdepend,则不应同时指定 -xautopar,因为将针对多处理器系统执行 -xdepend 优化。

B.2.96 -xdryrun

选项是用于 -### 的宏。

B.2.97 -xdumpmacros[= value[,value...]]

要查看宏在程序中如何工作时,请使用该选项。该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出信息输出到标准错误 (stderr)。-xdumpmacros 选项在整个文件中或在 dumpmacrosend_dumpmacros pragma 覆盖它之前都是有效的。请参见2.11.6 dumpmacros

下表列出了 value 的有效参数。前缀 no% 可禁用关联的值。

表 B-26 -xdumpmacros

含义
[no%]defs
输出所有宏定义。
[no%]undefs
输出所有取消定义的宏。
[no%]use
输出关于使用的宏的信息。
[no%]loc
另外输出 defsundefsuse 的位置(路径名和行号)。
[no%]conds
输出在条件指令中使用的宏的使用信息。
[no%]sys
输出系统头文件中的宏的所有宏定义、取消定义和使用信息。
%all
设置该选项即表示 -xdumpmacros=defs,undefs,use,loc,conds,sys。该参数最好与 [no%] 形式的其他参数配合使用。例如, -xdumpmacros=%all,no%sys 表示输出中不包含系统头文件宏,但仍提供所有其他宏的信息。
%none
不输出任何宏信息。

该选项的值会累积,因此指定 -xdumpmacros=sys -xdumpmacros=undefs-xdumpmacros=undefs,sys 的效果相同。


注 - 子选项 loccondssysdefsundefsuse 选项的限定符。使用 loccondssys 本身并不会生成任何结果。例如,使用 -xdumpmacros=loc,conds,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

以下示例显示了使用 defsundefssysloc 参数时文件 t.c 的输出。

example% cc -c -xdumpmacros -DFOO t.c
#define __SunOS_5_9 1
#define __SUNPRO_C 0x512
#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 0x512
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

以下示例说明了 uselocconds 参数如何报告文件 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 命令行选项的作用域。

B.2.98 -xe

源文件执行语法和语义检查,但不生成任何对象或可执行代码。

B.2.99 -xF[= v[,v...]]

由链接程序对函数和变量进行最优的重新排序。

该选项指示编译器将函数或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)可将这些段重新排序以优化程序性能。该优化在缺页时间构成程序运行时的一大部分时最有效。

对变量重新排序有助于解决对运行时性能产生负面影响的以下问题:

为优化性能而对变量和函数进行重新排序时,需要执行以下操作:

  1. 使用 -xF 进行编译和链接。

  2. 按照 Oracle Solaris Studio 性能分析器手册和《Oracle Solaris 链接程序和库指南》中有关为函数或数据生成映射文件的说明操作。

  3. 使用通过链接程序的 -M 选项生成的新映射文件重新链接。

  4. 在分析器下重新执行以验证是否增强。

B.2.99.1 值

下表列出了 v 的值。

表 B-27 -xF

含义
func
将函数分段到单独的段中。
gbldata
将全局数据(具有外部链接的变量)分段到单独的段中。
lcldata
将局部数据(具有内部链接的变量)分段到单独的段中。
%all
分段函数、全局数据和局部数据。
%none
不分段。

在这些值(%all%none 除外)前面添加 no% 可禁用子选项。例如 no%func

如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func

使用 -xF=lcldata 会限制某些地址计算优化,因此,只应在必要时才使用该标志。

请参见 analyzer(1) 和 ld(1) 手册页。

B.2.100 -xhelp=flags

显示联机帮助信息。

-xhelp=flags 显示编译器选项汇总信息。

B.2.101 -xhwcprof

(SPARC) 使编译器支持基于硬件计数器的分析。

如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用 -g 生成的符号信息结合)。它将分析数据与目标的数据空间而非指令空间进行关联,可以对行为进行深入洞察,单独通过指令分析难以做到这一点。

可使用 -xhwcprof 编译一组指定的目标文件。但是,-xhwcprof 在应用于应用程序中的所有目标文件时非常有用,可识别并关联分布在应用程序的目标文件中的所有内存引用。

如果在不同的步骤中进行编译和链接,最好在链接时使用 -xhwcprof-xhwcprof 的未来扩展可能需要在链接时使用它。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

-xhwcprof=enable-xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。

在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof-xhwcprof=enable 等效。

-xhwcprof 要求启用优化并将调试数据的格式设置为 DWARF (-xdebugformat=dwarf)。

-xhwcprof-g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof-g 所引起的增加总量还多。

下列命令可编译 example.c,并可为硬件计数器分析以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:

example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c

有关基于硬件计数器的分析的更多信息,请参见 Oracle Solaris Studio 性能分析器手册。

B.2.102 -xinline=list

用于 -xinlinelist 的格式如下所示:[{%auto,func_name ,no%func_name}[,{%auto ,func_name,no%func_name}]...]

-xinline 尝试只内联可选列表中指定的函数。该列表可为空,或者包含由逗号分隔的 func_nameno% func_name> 或 %auto 列表,其中 func_name 是函数名称。-xinline 仅在 -xO3 或更高级别上起作用。

表 B-28 -xinline 标志

标志
含义
%auto
指定编译器将尝试自动内联源文件中的所有函数。%auto 仅在 -xO4 或更高优化级别上起作用。在 -xO3 或更低优化级别上,%auto 将被忽略而无提示。
func_name
指定编译器内联已命名的函数。
no%func_name
指定编译器不内联已命名的函数。

该列表值从左至右进行累积。对于 -xinline=%auto,no%foo 的规范,编译器将尝试内联除 foo 之外的所有函数。对于 -xinline=%bar,%myfunc,no%bar 的规范,编译器仅尝试内联 myfunc

在优化级别为 -xO4 或更高级别上编译时,编译器通常尝试内联源文件中定义的对函数的所有引用。通过指定 -xinline 选项,您可以限定编译器试图内联的函数集。如果仅指定 -xinline= 而不指定任何函数或 %auto,则表示不内联源文件中的任何例程。如果您指定了 func_nameno%func_name 而未指定 %auto,则编译器将仅尝试内联列表中指定的函数。如果在优化级别设置为 -xO4 或更高时用 -xinline 选项在值列表中指定 %auto,编译器将尝试内联所有未被 no% func_name 显式排除的函数。

如果以下任何条件适用,则不内联函数。且不发出任何警告。

如果在命令行指定多个 -xinline 选项,它们将不会累积。命令行上的最后一个 -xinline 指定编译器尝试内联的函数。

另请参见 -xldscope

B.2.103 -xinstrument=[ no%]datarace

指定此选项编译并检测您的程序,以供线程分析器进行分析。有关线程分析器的更多详细信息,请参见 tha(1) 手册页。

然后可使用性能分析器以 collect -r races 来运行此检测过的程序,从而创建数据争用检测实验。如果您单独运行检测过的代码,其运行速度将非常缓慢。

可指定 -xinstrument=no%datarace 来关闭线程分析器的源代码准备。这是缺省值。

您必须为 -xinstrument= 指定参数。

如果在不同的步骤中进行编译和链接,则在编译和链接步骤都必须指定 -xinstrument=datarace

此选项定义了预处理程序令牌 __THA_NOTIFY。可指定 #ifdef __THA_NOTIFY 来保护对 libtha(3) 例程的调用。

该选项也设置 -g

B.2.104 -xipo[= a]

012 替换 a。没有任何参数的 -xipo 等效于 -xipo=1-xipo=0 是缺省设置,表示禁用 -xipo。在 -xipo=1 时,编译器会跨所有源文件执行内联。

-xipo=2 时,编译器执行过程间调用别名分析同时优化内存分配和布局,以提高缓存的性能。

编译器可通过调用过程间分析组件执行部分程序优化。它在链接步骤中跨所有目标文件执行优化,并且不限于编译命令的源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。

编译时和链接时都必须指定 -xipo。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的目标文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。在编译步骤中创建的目标文件具有在这些文件内编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。

在编译和链接大型多文件应用程序时,-xipo 特别有用。用该标志编译的对象目标文件具有在这些文件内编译的分析信息,这些信息实现了在源代码和预编译的程序文件中的过程间分析。

分析和优化只限于使用 -xipo 编译的目标文件,并不扩展到目标文件或库。

-xipo 是多阶段的,因此如果要在不同的步骤中进行编译和链接,需要为每一步指定 -xipo

关于 -xipo 的其他重要信息:

B.2.104.1 -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.ctwo.cthree.c 之间,main.cfour.c 之间,但不在 main.cfour.cmylib.a 上的例程之间执行。(第一次编译可能会生成有关未定义符号的警告,但仍可执行过程间优化,因为它是一个编译和链接步骤。)

B.2.104.2 何时不使用 -xipo=2 过程间分析

在链接步骤中使用目标文件集合时,编译器试图执行整个程序分析和优化。对于该目标文件集合中定义的任何函数或子例程 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() 中,从而导致出现错误的结果。

B.2.105 -xipo_archive=[ a]

-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的目标文件来优化传递给链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为其优化后的版本。

下表列出了 a 的值。

表 B-29 -xipo_archive 标志

含义
writeback
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为优化后的版本。

对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化。

readonly
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。

通过 -xipo_archive=readonly 选项,可在链接时指定的归档库中进行目标文件的跨模块内联和程序间数据流分析。但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中。

要对归档库内的代码应用跨模块优化,要求 -xipo_archive=writeback。请注意,此选项会修改从中提取代码的归档库的内容。

none
这是缺省值。没有对归档文件的处理。编译器不对使用 -xipo 编译和在链接时从归档库中提取的目标文件应用跨模块内联或其他跨模块优化。要执行此操作,链接时必须指定 -xipo,以及 -xipo_archive=readonly-xipo_archive=writeback 中的任一个。

如果不为 -xipo_archive 指定设置,编译器会将其设置为 -xipo_archive=none

您必须为 -xipo_archive= 指定值。

B.2.106 -xivdep[= p]

禁用或设置 #pragma ivdep pragma 的解释(忽略向量依赖性)。

ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这将使编译器能够执行各种循环优化(例如微向量化、分发、软件流水线等),而以其他方式可能无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。

#pragma ivdep 指令的解释依赖于 —xivdep 选项的值。

以下列表列出了 p 的值及其含义。

loop

忽略假定的循环附带依赖性

loop_any

忽略所有循环附带向量依赖性

back

忽略假定的向后循环附带向量依赖性

back_any

忽略所有向后循环附带向量依赖性

none

不忽略任何依赖性(禁用 ivdep pragma)

提供这些解释是为了与另一个供应商对 ivdep pragma 的解释兼容。

B.2.107 -xjobs=n

指定 -xjobs 选项可设置编译器为完成工作需要创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。目前,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。

通常,n 的安全值等于 1.5 乘以可用处理器数。如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。

指定 -xjobs 时务必要指定值。否则,将会发出错误诊断并使编译停止。

出现最合适的实例之前,-xjobs 的多重实例在命令行上会互相覆盖。

以下示例在有两个处理器的系统上进行的编译,速度比使用相同命令但没有 -xjobs 选项时进行的编译快。

 example% cc -xipo -xO4 -xjobs=3 t1.c t2.c t3.c

您必须为 -xipo_archive= 指定值。

B.2.108 -xkeepframe[=[ %all,%none,name,no% name]]

禁止对命名函数 ( name) 进行与堆栈相关的优化。

%all

禁止对所有代码进行与堆栈相关的优化。

%none

允许对所有代码进行与堆栈相关的优化。

此选项是累积性的,可以多次出现在命令行中。例如,—xkeepframe=%all —xkeepframe=no%func1 表示应保留 func1 以外的所有函数的堆栈帧。而且,—xkeepframe 优先于 —xregs=frameptr。例如,—xkeepframe=%all —xregs=frameptr 表示应保留所有函数的堆栈,但会忽略 —xregs=frameptr 的优化。

如果命令行中未指定,编译器将采用 -xkeepframe=%none 作为缺省值。如果指定了但没有值,编译器将采用 -xkeepframe=%all

B.2.109 -xldscope={v}

指定 -xldscope 选项,以更改用于外部符号定义的缺省链接程序作用域。由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。

v 必须是下列值之一:

表 B-30 -xldscope 标志

标志
含义
global
全局链接程序作用域是限制最少的链接程序作用域。该符号的所有引用都绑定到在第一个动态模块中定义该符号的定义上。该链接程序作用域是外部符号的当前链接程序作用域。
symbolic
符号链接程序作用域比全局链接程序作用域具有更多的限制。从所链接的动态模块内部对符号的所有引用都绑定到在模块内部定义的符号上。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。有关链接程序的更多信息,请参见 ld(1) 手册页。
hidden
隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。动态模块内部的所有引用都绑定到该模块内部的一个定义上。符号在模块外部是不可视的。

如果未指定 -xldscope,编译器将假定 -xldscope=global。如果指定不带参数的 -xldscope,编译器会发出错误信息。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。

如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。编译器在以下情况下会内联函数:

例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:

void* ABC_allocator(size_t size) { return malloc(size); }

如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库用户尝试用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。

生成库时,用 __hidden__symbolic 说明符声明的库函数可以内联生成。假定这些函数不被用户覆盖。有关更多信息,请参见2.2 链接程序作用域说明符

__global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。

另请参见 -xinline-xO-xipo#pragmainline

B.2.110 -xlibmieee

强制为异常类中的数学例程返回 IEEE 754 样式的值。在此情况下,不输出异常消息,并且不应依赖 errno

B.2.111 -xlibmil

内联一些库例程,以加快执行速度。此选项可为浮点选项和系统平台选择合适的汇编语言内联模板。

无论将函数的任何规范作为 -xlibmil 标记的一部分,-xlibmil 都会内联函数。

但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请尽量不要使用此选项。另请参见2.13 保留 errno 的值

B.2.112 -xlibmopt

使编译器可以使用优化数学例程的库。使用此选项时,必须通过指定 -fround=nearest 来使用缺省舍入模式。

数学例程库优化了性能,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。

请注意,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。有关更多信息,请参见2.13 保留 errno 的值

该库选项在命令行上的顺序并不重要。

此选项由 -fast 选项设置。

另请参见 -fast-xnolibmopt

B.2.113 -xlic_lib=sunperf

(已废弃)使用 -library=sunperf 可与 Sun 性能库链接。

B.2.114 -xlicinfo

编译器忽略此选项且不显示任何提示。

B.2.115 -xlinkopt[= level]

(SPARC) 指示编译器对可重定位的目标文件执行链接时优化。这些优化在链接时通过分析二进制目标代码来执行。虽然未重写目标文件,但生成的可执行代码可能与初始目标代码不同。

必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制目标文件执行部分受限的优化。

-xlinkopt 优化出现在编译器命令行上的静态库代码,但会跳过出现在命令行上的共享(动态)库代码而不对其进行优化。您还可以在生成共享库(用 -G 编译)时使用 -xlinkopt

级别设置执行的优化级别,必须为 0、1 或 2。下表列出了优化级别:

表 B-31 -xlinkopt 标志

标志
含义
0
禁用后优化器。(这是缺省情况。)
1
在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化。
2
在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化。

如果在不同的步骤中编译,-xbinopt 必须同时出现在编译和链接步骤中。

example% cc -c -xlinkopt a.c b.c
example% cc -o myprog -xlinkopt=2 a.o

有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

请注意,仅当编译器链接时才使用级别参数。在该示例中,即使二进制目标代码是用隐含级别 1 编译的,使用的后优化级别仍然是 2。

指定 -xlinkopt 时若不带级别参数,则表示 -xlinkopt=1

当编译整个程序并且使用分析反馈时,该选项才最有效。分析会显示代码中最常用和最不常用的部分,并且生成操作会指示优化器相应地进行处理。此选项对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。通常,请按如下所示使用此选项:

example% cc -o progt -xO5 -xprofile=collect:prog file.c
example% progt
example% cc -o prog -xO5 -xprofile=use:prog -xlinkopt file.c

有关使用分析反馈的详细信息,请参见B.2.144 -xprofile= p

使用 -xlinkopt 编译时,请不要使用 -zcombreloc 链接程序选项。

注意,使用该选项编译会略微延长链接的时间,目标文件的大小也会增加,但可执行文件的大小保持不变。使用 -xlinkopt-g 编译会将调试信息包括在内,从而增加了可执行文件的大小。

B.2.116 -xloopinfo

显示哪些循环已并行化。提供未并行化循环的简要原因。仅当指定了 -xautopar 时,-xloopinfo 选项才有效,否则,编译器将发出警告。

要达到更快的执行速度,则该选项需要多处理器系统。在单处理器系统中,生成的代码通常运行得较慢。

B.2.117 -xM

只对指定的 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 指定的文件中。

B.2.118 -xM1

生成 makefile 依赖性类似 -xM,但不包括 /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 指定的文件中。

B.2.119 -xMD

-xM 一样生成 makefile 依赖性,但编译继续。-xMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .dfilename。如果指定 -xMD-xMF,预处理程序会将所有 makefile 依赖性信息写入到使用 -xMF 指定的文件中。不允许使用 -xMD -xMF-xMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。

B.2.120 -xMF filename

使用此选项可为 makefile 依赖性输出指定一个文件。您无法在一个命令行上使用 -xMF 为多个输入文件指定单独的 filename。不允许使用 -xMD -xMF-xMMD -xMF 编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。

B.2.121 -xMMD

使用此选项可生成不包括系统头文件的 makefile 依赖性。此选项与 -xM1 提供的功能相同,但是编译继续。-xMMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .dfilename。如果您指定 -xMF,则编译器将改用您提供的文件名。不允许使用 -xMMD -xMF-xMMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。

B.2.122 -xMerge

将数据段合并为文本段。在此编译所生成的目标文件中初始化的数据是只读数据,并可(除非用 ld-N 链接)在进程间共享。

三个选项 -xMerge -ztext -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。

B.2.123 -xmaxopt[=v]

选项可将 pragma opt 的级别限制为指定级别。voff12345 之一。缺省值为 -xmaxopt=off ,表示忽略 pragma opt。指定未提供参数的 -xmaxopt 等效于指定 -xmaxopt=5

如果同时指定了 -xO-xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。

B.2.124 -xmemalign=ab

(SPARC) 使用 -xmemalign 选项可控制编译器对数据对齐所做的假定。通过控制因可能出现的未对齐内存访问而生成的代码以及出现未对齐内存访问时的程序行为,可以更轻松地将代码移植到 SPARC 平台。

指定最大假定内存对齐和未对齐数据访问行为。您必须同时为 a(对齐)和 b(行为)提供值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。下表列出了 -xmemalign 的对齐值和行为值。

表 B-32 -xmemalign 对齐和行为标志

a
b
1
假定最多 1 字节对齐。
i
解释访问并继续执行。
2
假定最多 2 字节对齐。
s
产生信号 SIGBUS。
4
假定最多 4 字节对齐。
f
仅限 64 位 SPARC (-m64):

为小于或等于 4 的对齐产生信号 SIGBUS。否则,解释访问并继续执行。对于 32 位程序,f 标志与 i 等效。

8
假定最多 8 字节对齐。
16
假定最多 16 字节对齐。

如果要链接到某个已编译的目标文件,并且编译该目标文件时 b 的值设置为 if,就必须指定 -xmemalign。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。

对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。-xmemalign 选项允许您在这些情况下指定编译器要假定的数据最大内存对齐。它还指定在运行时发生未对齐内存访问时要执行的错误行为。

如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应是

以下缺省值仅适用于未使用 -xmemalign 选项时:

对于所有平台,使用了 -xmemalign 选项但未提供值时的缺省值为 -xmemalign=1i

下表介绍了如何使用 -xmemalign 来处理不同的对齐情况。

表 B-33 -xmemalign 示例

命令
情况
-xmemalign=1s
大量未对齐访问导致了自陷处理非常缓慢。
-xmemalign=8i
在发生错误的代码中存在偶然的、有目的的、未对齐访问。
-xmemalign=8s
程序中应该没有任何未对齐访问。
-xmemalign=2s
要检查可能存在的奇字节访问。
-xmemalign=2i
要检查可能存在的奇字节访问并要使程序工作。

B.2.125 -xmodel=[a]

(x86) -xmodel 选项使编译器可针对 Oracle Solaris x86 平台修改 64 位对象的格式;只应为此类对象的编译指定该选项。

仅当启用了 64 位的 x64 处理器上还指定了 -m64 时,该选项才有效。

下表列出了 a 的值。

表 B-34 -xmodel 标志

含义
small
此选项可为小模型生成代码,其中执行代码的虚拟地址在链接时已知,并且已知在 0 到 2^31 - 2^24 - 1 的虚拟地址范围内可以找到所有符号。
kernel
按内核模型生成代码,在该模型中, 所有符号都定义在 2^64 - 2^31 到 2^64 - 2^24 范围内。
medium
按中等模型生成代码,在该模型中,不对数据段的符号引用范围进行假定。文本段的大小和地址的限制与小型代码模型的限制相同。使用 -m64 编译时,具有大量静态数据的应用程序可能会要求 -xmodel=medium

此选项不累积,因此编译器根据命令行最右侧的 -xmodel 实例设置模型值。

如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。

您不必使用此选项编译所有转换单元。只有可以确保访问的对象在可访问范围之内,才可编译选择的文件。

请注意,并非所有 Linux 系统都支持中等模型。

B.2.126 -xnolib

缺省情况下不链接任何库;即不向 ld(1) 传递任何 -l 选项。通常,cc 驱动程序将 -lc 传递给 ld

在您使用 -xnolib 时,必须自己传递所有 -l 选项。

B.2.127 -xnolibmil

内联数学库例程。例如,在 –fast 选项后面使用该选项:

% cc– fast– xnolibmil....

B.2.128 -xnolibmopt

通过禁用以前指定的所有 -xlibmopt 选项,禁止编译器使用优化的数学库。例如,在 -fast 后面使用该选项,这将启用 -xlibmopt

% cc -fast -xnolibmopt ...

B.2.129 -xnorunpath

不将共享库的运行时搜索路径生成到可执行文件中。

建议用该选项生成提交到客户(这些客户的程序使用的共享库可能具有不同路径)的可执行文件。

B.2.130 -xO[1|2| 3|4|5]

设置编译器优化级别。请注意,大写字母 O 后跟数字 12345。一般说来,优化级别越高,运行时性能越好。不过,较高的优化级别会延长编译时间并生成较大的可执行文件。

在少数情况下,-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 级别上优化非常大的程序(在同一程序中有数千行代码),优化器可能需要大量虚拟内存。在此类情况下,机器性能可能会降低。

B.2.130.1 SPARC 优化

下表列出了 SPARC 平台上的优化级别。

表 B-35 SPARC 平台上的 -xO 标志

含义
-xO1
执行基本局部优化(窥孔优化)。
-xO2
执行基本局部和全局优化。其中包括感应变量排除、局部和全局常用子表达式排除、代数简化、 副本传播、常量传播、循环不可变优化、寄存器分配、基本块合并、尾部循环排除、死代码排除、尾部调用排除和复杂表达式扩展。

-xO2 级别不会将全局、外部或间接引用或定义分配给寄存器。它将这些引用和定义视为被声明为 volatile。一般说来,-xO2 级别产生的代码最小。

-xO3
类似于执行 -xO2,但还会优化外部变量的引用或定义。还执行循环解开和软件流水线作业。该级别不跟踪指针赋值的结果。在编译设备驱动程序或编译从信号处理程序内部修改外部变量的程序时,可能需要使用 volatile 类型限定符来保护对象,使其免于优化。-xO3 级别通常会导致代码大小增大。
-xO4
类似于执行 -xO3,但是还自动内联包含在相同文件中的函数;这通常会提高执行速度。要控制内联哪些函数,请参见B.2.102 -xinline=list

该级别跟踪指针赋值的效果,通常导致代码增大。

-xO5
试图生成最高优化级别。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。如果使用分析反馈执行该级别上的优化,则更容易提高性能。有关更多信息,请参见B.2.144 -xprofile= p

B.2.130.2 x86 优化级别

下表列出了 x86 平台上的优化级别。

表 B-36 x86 平台上的 -xO 标志

含义
-xO1
从内存、交叉跳跃(尾部合并)以及单个传递的缺省优化中预装入参数。
-xO2
同时调度高级和低级指令,并执行改进的溢出分析、循环内存引用排除、寄存器生命周期分析、增强的寄存器分配以及全局通用子表达式的排除。
-xO3
执行循环长度约简、感应变量排除以及在级别 2 完成的优化。
-xO4
除执行 -xO3 的优化之外,还自动内联包含在同一文件中的函数。此自动内联通常会提高执行速度,但有时却会使速度变得更慢。此级别通常会导致代码大小增大。
-xO5
生成最高级别优化。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。其中包含为导出的函数生成局部的调用约定入口点、进一步优化溢出代码和增加分析,以改善指令调度。

有关调试的更多信息,请参见《《Oracle Solaris Studio:使用 dbx 调试程序》》手册。有关优化的更多信息,请参见 《Oracle Solaris Studio 性能分析器》手册。

另请参见 -xldscope-xmaxopt

B.2.131 -xopenmp[= i]

使用 -xopenmp 选项可通过 OpenMP 指令启用显式并行化。要在多线程环境中运行已并行化的程序,必须在执行之前将环境变量 OMP_NUM_THREADS 设置为大于 1 的值。如果未设置,则缺省值为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,应将 OMP_NUM_THREADS 设置为正在运行的系统中的可用虚拟处理器数,该值可使用 Oracle Solaris psrinfo(1) 命令确定。

要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。缺省情况下,禁用嵌套并行操作。

下表列出了 i 的值。

表 B-37 -xopenmp 标志

含义
parallel
启用 OpenMP pragma 的识别。-xopenmp=parallel 时的优化级别为 -xO3。如有必要,编译器会将优化级别更改为 -xO3 并发出警告。

此标志还定义处理器标记 _OPENMP

noopt
启用 OpenMP pragma 的识别。如果优化级别低于 -O3,编译器将不会提高优化级别。

如果将优化级别显式设置为低于 -O3,如同在 cc -O2 -xopenmp=noopt 中一样,编译器会发出错误。如果没有使用 -xopenmp=noopt 指定优化级别,则会识别 OpenMP pragma,并相应地对程序进行并行处理,但不进行优化。

此标志还定义处理器标记 _OPENMP

none
此标志为缺省设置。它禁用对 OpenMP pragma 的识别,不更改程序的优化级别并且不预定义任何预处理程序标记。

如果指定了 -xopenmp 但未给定值,编译器将假定 -xopenmp=parallel。如果不指定 -xopenmp,编译器将假定 -xopenmp=none

如果使用 dbx 调试 OpenMP 程序,那么编译时选用 -g-xopenmp=noopt 可以在并行区设置断点并显示变量内容。

在以后的发行版中,-xopenmp 的缺省值可能会更改。可以通过显式指定适当的优化来避免警告消息。

如果在生成任何 .so 库时使用 -xopenmp,则必须在链接可执行文件时使用 -xopenmp。可执行文件的编译器的版本不得比使用 -xopenmp 生成 .so 库的编译器的版本低。此要求在编译包含 OpenMP 指令的库时尤其重要。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

为了取得最佳的性能,请确保在系统上安装了最新的 OpenMP 运行时库 libmtsk.so

有关特定于 OpenMP 的 C 实现的更多信息,请参见3.2 OpenMP 并行化

有关 OpenMP 的信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。

B.2.132 -xP

编译器对源文件仅执行语法和语义检查,以输出所有 K&R C 函数的原型。此选项不生成任何目标代码或可执行代码。例如,对以下源文件指定 -xP

f()
{
}

main(argc,argv)
int argc;
char *argv[];
{
}

产生以下输出:

int f(void);
int main(int, char **);

B.2.133 -xpagesize=n

为堆栈和堆设置首选页面大小。

SPARC:有效值如下:4k8K64K512K2M4M32M256M2G16Gdefault

x86:有效值如下:4K2M4M1Gdefault

如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。必须指定适于目标平台的有效页面大小。

在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。

除非在编译和链接时使用,否则 -xpagesize 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

如果指定 -xpagesize=default,Oracle Solaris 操作系统将设置页面大小。

使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。

此选项是用于 -xpagesize_heap -xpagesize_stack 的宏。这两个选项与 -xpagesize 接受相同的参数。可以通过指定 -xpagesize 为这两个选项设置相同的值,也可以分别为它们指定不同的值。

B.2.134 -xpagesize_heap=n

在内存中为堆设置页面大小。

此选项与 -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 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

B.2.135 -xpagesize_stack=n

在内存中为堆栈设置页面大小。

此选项与 -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 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2

B.2.136 -xpch=v

编译器选项可激活预编译头文件功能。v 可以是 autoautofirstcollect: pch_filenameuse:pch_filename。要使用该功能,需要指定 -xpch-xpchstop 选项,并使用 #pragma hdrstop 指令。

使用 -xpch 选项可以创建预编译头文件并减少编译时间。预编译头文件可减少源文件共享一组通用的 include 文件(包含大量源代码)的应用程序的编译时间。预编译头文件的工作机理是,首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者编译其他有同样头文件顺序的源文件时就可以使用这些收集到的信息。编译器收集的信息存储在预编译头文件中。

有关更多信息,请参见:

B.2.136.1 自动创建预编译头文件

编译器可以通过两种方法之一自动生成预编译头文件。一种方法是让编译器从在源文件找到的第一个 include 文件创建预编译头文件。另一种方法是让编译器从在源文件中找到的 include 文件集合中选择,选择范围从第一个 include 文件开始,直到已经定义好的确定哪个 include 文件是最后一个的点结束。使用下表中所述标志之一可以确定编译器用于自动生成预编译头文件的方法。

表 B-38 -xpch 标志

标志
含义
-xpch=auto
预编译头文件的内容基于编译器在源文件中找到的最长活前缀。此标志生成的预编译头文件可能包含最多的头文件。有关更多信息,请参见B.2.136.5 活前缀
-xpch=autofirst
此标志生成的预编译头文件仅包含在源文件中找到的第一个头文件。

B.2.136.2 手动创建预编译头文件

要手动创建预编译头文件,请首先使用 -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

B.2.136.3 编译器如何处理现有的预编译头文件

如果编译器无法将预编译头文件与 -xpch=auto-xpch=autofirst 结合使用,则会生成新的预编译头文件。如果编译器无法将预编译头文件与 -xpch=use 结合使用,则会发出警告并使用实际的头文件来完成编译。

B.2.136.4 指示编译器使用特定的预编译头文件

您也可以通过指定 -xpch=use:pch_filename 来指示编译器使用特定的预编译头文件。您可以将 include 文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件。例如,在 use 模式下的命令可能为:cc -xpch=use:foo.cpch foo.c bar.c foobar.c

如果以下条件都成立,则只应使用现有的预编译头文件。如果以下任一条件不成立,则应重新创建预编译头文件:

B.2.136.5 活前缀

在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的 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 时,编译器会自动确定活前缀的终点。其定义如下。

对于 -xpch=collect-xpch=use,活前缀以 #pragma hdrstop 结尾。

在共享预编译头文件的每个文件的活前缀中,每个相应的 #define#undef 指令都必须引用相同的符号。例如,每个 #define 必须引用同一个值。这些指令在每个活前缀中出现的顺序也必须相同。每个相应 pragma 也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中。

B.2.136.6 浏览头文件以查找问题

当头文件在不同源文件中的解释一致(特别是在仅包含完整声明时),则头文件是可预编译的。也就是说,任何一个文件中的声明都必须独自成为有效声明。不完全的类型声明,例如 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*/

并入预编译头文件的头文件不得违反以下约束。这里没有定义对违反上述约束的程序的编译结果。

如果头文件还包含变量和函数定义,则也是可预编译的。

B.2.136.7 预编译头文件高速缓存

编译器自动创建预编译头文件时,会将该文件写入 SunWS_cache 目录中。此目录始终位于创建目标文件的位置。该文件的更新受锁保护,这样可在 dmake 下正常工作。

如果需要强制编译器重新生成自动生成的预编译头文件,可以使用 CCadmin 工具清除预编译头文件高速缓存目录。有关更多信息,请参见 CCadmin(1) 手册页。

B.2.136.8 忠告

B.2.136.9 预编译头文件依赖性和 make 文件

指定 -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 规则。

B.2.137 -xpchstop=[file |<include>]

使用 -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

B.2.138 -xpec[={yes|no}]

(仅限 Solaris)生成可移植的可执行代码 (Portable Executable Code, PEC) 二进制文件。此选项将程序中间表示置于目标文件和二进制文件中。该二进制文件可在以后用于调整和故障排除。

使用 -xpec 生成的二进制文件通常比未使用 -xpec 生成的文件大五倍到十倍。

如果不指定 -xpec,则编译器假定 -xpec=no。如果指定了 -xpec 但未提供标志,则编译器假定 -xpec=yes

B.2.139 -xpentium

(x86) Pentium 处理器生成代码。

B.2.140 -xpg

准备目标代码,以收集用 gprof(1) 进行分析所需的数据。此选项调用在正常终止情况下产生 gmon.out 文件的运行时记录机制。


注 - —xpg 在与 -xprofile 配合使用时不会提供任何其他帮助。这两个选项不会准备或使用对方提供的数据。


在 64 位 Oracle Solaris 平台上,使用 prof(1) 或 gprof(1) 生成分析,在 32 位 Oracle Solaris 平台上,则只使用 gprof 生成分析;分析中包含大概的用户 CPU 时间,这些时间源自(链接可执行文件时指定为链接程序参数的)主可执行文件中的例程以及共享库中的例程的 PC 示例数据(请参见 pcsample(2))。其他共享库(在进程启动后使用 dlopen(3DL) 打开的库)不进行分析。

在 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 编译的系统库。因此,在当前 Solaris 平台上收集的分析不包含系统库例程的调用计数。

如果在编译时指定 -xpg,则还必须在链接时指定它。有关在编译时和链接时都必须指定的选项的完整列表,请参见A.1.2 编译时选项和链接时选项


注 - 使用 -xpg 编译以便进行 gprof 分析的二进制文件不应与 binopt(1) 一起使用,因为它们不兼容并可能导致内部错误。


B.2.141 -xprefetch[= val[,val]]

在支持预取的体系结构中启用预取指令。

显式预取只应在度量支持的特殊环境下使用。

下表列出了 val 的值。

表 B-39 -xprefetch 标志

标志
含义
latx:factor
根据指定的因子,调整编译器假定的“预取到装入”和“预取到存储”延迟。只能将此标志与 -xprefetch=auto 结合使用。请参见B.2.141.1 预取延迟比率
[no%]auto
[禁用] 启用预取指令自动生成。
[no%]explicit
[禁用] 启用显式预取宏。
yes
已废弃 - 不使用。改用 -xprefetch=auto,explicit
no
已废弃 - 不使用。改用 -xprefetch=no%auto,no%explicit

缺省值为 -xprefetch=auto,explicit。此缺省值会对实质上具有非线性内存访问模式的应用程序造成负面影响。要覆盖该缺省值,请指定 -xprefetch=no%auto,no%explicit

sun_prefetch.h 头文件提供了可用来指定显式预取指令的宏。预取的位置大约为可执行文件中对应于宏出现的位置。

B.2.141.1 预取延迟比率

预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。

该因子必须是形式为 n.n. 的正数。

在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。

编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加值,请使用大于 1 的因子。介于 .5 和 2.0 之间的值最有可能提供最佳性能。

对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小此值,请使用小于 1 的因子。

要使用 latx:factor 子选项,则以接近 1.0 的因子值开始并对应用程序进行性能测试。适当增加或减小该因子,然后再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几个增量中将看不到性能差异,之后会突然出现差异,然后性能再趋于稳定。

B.2.142 -xprefetch_auto_type= a

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 的选项可以影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而发生的自动插入间接预取的主动性。

B.2.143 -xprefetch_level= l

使用 -xprefetch_level 选项,可以控制自动插入通过 -xprefetch=auto 确定的预取指令的主动性。l 必须为 123。编译器将变得更加主动,换句话说,它会引入更多更高 -xprefetch_level 级别的预取。

适用于 -xprefetch_level 的值取决于应用程序具有的高速缓存未命中次数。较高级别的 -xprefetch_level 值具有提高应用程序性能的潜能。

仅当使用优化级别为 3 或更高的 -xprefetch=auto 进行编译时,此选项才有效;此选项可为支持预取的平台(v8plusv8plusav9v9av9bgeneric64native64)生成代码。

-xprefetch_level=1 启用预取指令自动生成。-xprefetch_level=2 启用级别 1 之外的额外生成。-xprefetch_level=3 启用级别 2 之外的额外生成。

指定了 -xprefetch=auto 时,缺省值为 -xprefetch_level=1

B.2.144 –xprofile= p

收集用于分析的数据或使用分析进行优化。

p 必须为 collect[:profdir]、use[:profdir] 或 tcov[:profdir]。

此选项将会导致在执行期间收集并保存执行频率数据。在后续运行中,可以使用该数据来改进性能。对多线程应用程序来讲,分析收集 (Profile collection) 是一种安全的方法。也就是说,对执行其自己的多任务处理 (-mt) 的程序进行分析可产生准确的结果。只有指定 -xO2 或更高的优化级别时,此选项才有效。如果分别执行编译和链接,则链接步骤和编译步骤中必须都出现同一 -xprofile 选项。

collect[:profdir ]

-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_PROFDATASUN_PROFDATA_DIR 控制在运行时存储分析数据的位置。如果已设置,分析数据将写入 $SUN_PROFDATA_DIR/$SUN_PROFDATA 指定的目录。如果在编译时指定了分析目录名,则 SUN_PROFDATA_DIRSUN_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
use[:profdir ]

通过从使用 —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/feedbacka.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 阶段之间的编译的说明。

tcov[:profdir ]

使用 tcov(1) 检测目标文件以进行基本块覆盖分析。

如果指定可选的 profdir 参数,编译器将在指定位置创建分析目录。该分析目录中存储的数据可通过 tcov(1) 或由编译器通过 -xprofile=use:profdir 来使用。如果省略可选的 profdir 路径名,则会在执行已分析的程序时创建分析目录。只能通过 tcov(1) 使用该分析目录中存储的数据。使用环境变量 SUN_PROFDATASUN_PROFDATA_DIR 可以控制分析目录的位置。

如果 profdir 指定的位置不是绝对路径名,则编译时会相对于当前工作目录来解释该位置。

profdir 指定位置的目录必须在要执行已进行分析的程序的所有计算机中都可以访问。除非不再需要分析目录中的内容,否则不应删除该目录,因为除非重新编译,否则编译器存储在其中的数据将无法恢复。

示例 1:如果用 -xprofile=tcov:/test/profdata 编译一个或多个程序的目标文件,编译器会创建一个名为 /test/profdata.profile 的目录并将其用来存储描述已分析的目标文件的数据。该同一目录还可在执行时用来存储与已进行分析的目标文件关联的执行数据。

示例 2:如果名为 myprog 的程序用 -xprofile=tcov 编译并在目录 /home/joe 中执行,将在运行时创建目录 /home/joe/myprog.profile 并将其用来存储运行时分析数据。

B.2.145 -xprofile_ircache[ =path]

(SPARC) 将 -xprofile_ircache[=path] -xprofile=collect|use 一起使用,通过重用 collect 阶段保存的编译数据来缩短 use 阶段的编译时间。

在编译大程序时,由于中间数据的保存,使得 use 阶段的编译时间大大减少。注意,所保存的数据会占用相当大的磁盘空间。

在使用 -xprofile_ircache[=path] 时,path 会覆盖保存缓存文件的位置。缺省情况下,这些文件会作为目标文件保存在同一目录下。collectuse 阶段出现在两个不同目录中时,指定路径很有用。以下示例显示了典型的命令序列:

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

B.2.146 -xprofile_pathmap

(SPARC) 如果同时还指定 -xprofile=use 命令,请使用 -xprofile_pathmap=collect_prefix: use_prefix 选项。以下两个条件都成立且编译器无法找到使用 -xprofile=use 编译的目标文件的分析数据时,使用 -xprofile_pathmap

collect-prefix 是某个目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=collect 编译的。

use-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=use 编译的。

如果指定了 -xprofile_pathmap 的多个实例,编译器将按照这些实例的出现顺序对其进行处理。将 -xprofile_pathmap 实例指定的每个 use-prefix 与目标文件路径名进行比较,直至找到匹配的 use-prefix 或发现最后一个指定的 use-prefix 与目标文件路径名也不匹配。

B.2.147 -xreduction

在自动并行化期间启用约简识别。使用 -xreduction 进行编译需要 -xautopar,否则编译器将会发出警告。

当启用了约简识别时,编译器会并行化约简,例如点积以及最大或最小搜索。这些约简产生的舍入与通过非并行化代码获得的舍入不同。

B.2.148 -xregs=r[, r…]

为生成的代码指定寄存器用法。

r 是一个逗号分隔列表,它包含下面的一个或多个子选项:applfloatframeptr

no% 作为子选项的前缀会禁用该子选项。

请注意,-xregs 子选项仅限于特定的硬件平台。

示例:-xregs=appl,no%float

表 B-40 -xregs 子选项

含义
appl
(SPARC) 允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是:

g2、g3 或 g4(在 32 位平台上)

g2 或 g3(在 64 位平台上)

您应使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。

在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。由于需要更少的装入和存储指令,因此使用这些寄存器可提高性能。但是,这样使用可能与某些用汇编代码编写的旧库程序冲突。

float
(SPARC) 允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。无论此选项如何,浮点值都可以使用这些寄存器。如果您希望代码没有任何对浮点寄存器的引用,请使用 -xregs=no%float 并确保代码不会以任何方式使用浮点类型。
frameptr
(x86) 允许编译器将帧指针寄存器(IA32 上为 %ebp,AMD64 上为 %rbp)用作通用寄存器。

缺省值为 -xregs=no%frameptr

除非也用 —features=no%except 禁用了异常,否则 C++ 编译器将忽略 -xregs=frameptr。请注意,-xregs=frameptr 属于 -fast

通过 -xregs=framptr,编译器可以自由使用帧指针寄存器来改进程序性能。但是,这可能会限制调试器和性能测量工具的某些功能。堆栈跟踪、调试器和性能分析器不能对通过 -xregs=frameptr 编译的函数生成报告。

如果直接调用或从 C 或 Fortran 函数间接调用的 C++ 函数会引发异常,不应该用 -xregs=frameptr 编译 C、Fortran 和 C++ 混合代码。如果使用 -fast 编译此类混合源代码,请在命令行中的 -fast 选项后添加 -xregs=no%frameptr

由于 64 位平台上的可用寄存器更多,因此与 64 位代码相比,使用 —xregs=frameptr 编译更容易改进 32 位代码的性能。

如果同时指定了 -xpg,编译器会忽略 -xregs=frameptr 并发出警告。而且,—xkeepframe 优先于 —xregs=frameptr。例如,—xkeepframe=%all —xregs=frameptr 表示应保留所有函数的堆栈,但会忽略 —xregs=frameptr 的优化。

SPARC 缺省值为 -xregs=appl,float

x86 缺省值为 -xregs=no%frameptr

在 x86 系统中,-xpg-xregs=frameptr 不兼容。这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr

您应使用 -xregs=no%appl,float 编译用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。

例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要了解其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。

B.2.149 -xrestrict[= f]

赋值为指针的函数参数视为受限指针。f%all%none 或由下面的一个或多个函数名构成的逗号分隔列表:{%all|%none|fn[,fn...]。

如果使用此选项指定了函数列表,则指定函数中的指针参数将被视为受限指针。如果指定了 -xrestrict=%all,则整个 C 文件中的所有指针参数都将被视为受限指针。有关更多信息,请参阅3.7.2 受限指针

此命令行选项可以单独使用,但最好将其用于优化。例如,以下命令将 prog.c 文件中的所有指针参数都视为受限指针:

%cc -xO3 -xrestrict=%all prog.c

以下命令将文件 prog.c 中的函数 agc 的所有指针参数都视为限定指针:

%cc -xO3 -xrestrict=agc prog.c

缺省值为 %none。指定 -xrestrict 与指定 -xrestrict=%all 等效。

B.2.150 -xs

允许在不使用目标文件的情况下dbx 进行调试。

该选项导致所有调试信息被复制到可执行程序中。该选项对 dbx 性能或程序的运行时性能影响很小,但会使用更多磁盘空间。

B.2.151 -xsafe=mem

(SPARC) 允许编译器假定没有内存保护违规发生。

该选项允许在 SPARC V9 体系结构中使用无故障装入指令。


注 - 由于在发生诸如地址未对齐或段违规的故障时,无故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项。因为只有很少的程序会导致基于内存的陷阱,所以您可以安全地将该选项用于大多数程序。对于显式依赖基于内存的自陷来处理异常情况的程序,请勿使用该选项。


仅当与优化级别 -xO5 及以下 -xarch 值中的一个一起使用时,此选项才能有效:sparcsparcvissparcvis2sparcvis3(用于 -m32-m64)。

B.2.152 -xsfpconst

无后缀的浮点常量表示为单精度模式,而非缺省的双精度模式。与 -Xc 一起使用时无效。

B.2.153 -xspace

不执行可增加代码大小的循环优化或并行化。

示例: 如果编译器增加代码大小,它不会解开循环或并行化循环。

B.2.154 -xstrconst

此选项已废弃,可能会在将来的发行版中删除。—xstrconst—features=conststrings 的别名。

B.2.155 -xtarget=t

为指令集和优化指定目标系统。

t 的值必须是下列值之一:nativegenericnative64generic64system-name

-xtarget 的每个特定值都会扩展到 -xarch-xchip-xcache 选项值的特定集合。使用 -xdryrun 选项可在运行的系统上确定 -xtarget=native 的扩展。

例如,-xtarget=ultra4 等效于 -xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2


注 - -xtarget 在特定主机平台上的扩展在该平台上编译时扩展到的 -xarch-xchip-xcache 设置可能与 -xtarget=native 不同。


表 B-41 -xtarget 值(所有平台)

含义
native
等效于

—m32 —xarch=native —xchip=native —xcache=native

可在主机 32 位系统上提供最佳性能。

native64
等效于

—m64 —xarch=native64 —xchip=native64 —xcache=native64

可在主机 64 位系统上提供最佳性能。

generic
等效于

—m32 —xarch=generic —xchip=generic —xcache=generic

可在大多数 32 位系统上提供最佳性能。

generic64
等效于

—m64 —xarch=generic64 —xchip=generic64 —xcache=generic64

可在大多数 64 位系统上提供最佳性能。

system-name
获取指定平台的最佳性能。

从以下代表您所面向的实际系统的列表中选择系统名称:

通过为编译器提供目标计算机硬件的精确描述,某些程序的性能可得到提高。如果程序性能很关键,则合适的目标硬件规范可能非常重要,尤其是在较新版本的 SPARC 处理器上运行时。不过,对大多数程序和较旧的 SPARC 处理器来讲,性能的提高微不足道,因此指定 generic 就足够了。

B.2.155.1 -xtarget 值(SPARC 平台)

在 SPARC 或 UltraSPARC V9 上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果为 -xtarget 指定 native64generic64 以外的标志,则还必须按如下所示指定 -m64 选项:-xtarget=ultra... -m64。否则,编译器将使用 32 位内存模型。

表 B-42 SPARC 上的 -xtarget 扩展

-xtarget=
-xarch
-xchip
-xcache
ultra
sparcvis
ultra
16/32/1:512/64/1
ultra1/140
sparcvis
ultra
16/32/1:512/64/1
ultra1/170
sparcvis
ultra
16/32/1:512/64/1
ultra1/200
sparcvis
ultra
16/32/1:512/64/1
ultra2
sparcvis
ultra2
16/32/1:512/64/1
ultra2/1170
sparcvis
ultra
16/32/1:512/64/1
ultra2/1200
sparcvis
ultra
16/32/1:1024/64/1
ultra2/1300
sparcvis
ultra2
16/32/1:2048/64/1
ultra2/2170
sparcvis
ultra
16/32/1:512/64/1
ultra2/2200
sparcvis
ultra
16/32/1:1024/64/1
ultra2/2300
sparcvis
ultra2
16/32/1:2048/64/1
ultra2e
sparcvis
ultra2e
16/32/1:256/64/4
ultra2i
sparcvis
ultra2i
16/32/1:512/64/1
ultra3
sparcvis2
ultra3
64/32/4:8192/512/1
ultra3cu
sparcvis2
ultra3cu
64/32/4:8192/512/2
ultra3i
sparcvis2
ultra3i
64/32/4:1024/64/4
ultra4
sparcvis2
ultra4
64/32/4:8192/128/2
ultra4plus
sparcvis2
ultra4plus
64/32/4:2048/64/4/2:32768/64/4
ultraT1
sparc
ultraT1
8/16/4/4:3072/64/12/32
ultraT2
sparcvis2
ultraT2
8/16/4:4096/64/16
ultraT2plus
sparcvis2
ultraT2plus
8/16/4:4096/64/16
T3
sparcvis3
ultraT3
8/16/4:6144/64/24
T4
sparc4
T4
16/32/4:128/32/8:4096/64/16
sparc64vi
sparcfmaf
sparc64vi
128/64/2:5120/64/10
sparc64vii
sparcima
sparc64vii
64/64/2:5120/256/10
sparc64viiplus
sparcima
sparc64viiplus
64/64/2:11264/256/11

B.2.155.2 -xtarget 值(x86 平台)

在 64 位 x86 平台上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果为 -xtarget 指定 native64generic64 以外的标志,则还必须按如下所示指定 -m64 选项:-xtarget=opteron ... -m64。否则,编译器将使用 32 位内存模型。

表 B-43 x86 上的 -xtarget 扩展

-xtarget=
-xarch
-xchip
-xcache
opteron
sse2a
opteron
64/64/2:1024/64/16
pentium
386
pentium
generic
pentium_pro
pentium_pro
pentium_pro
generic
pentium3
sse
pentium3
16/32/4:256/32/4
pentium4
sse2
pentium4
8/64/4:256/128/8
nehalem
sse4_2
nehalem
32/64/8:256/64/8:8192/64/16
penryn
sse4_1
penryn
2/64/8:6144/64/24
woodcrest
ssse3
core2
32/64/8:4096/64/16
barcelona
amdsse4a
amdfam10
64/64/2:512/64/16
sandybridge
avx
sandybridge
32/64/8:256/64/8:8192/64/16
westmere
aes
westmere
32/64/8:256/64/8:12288/64/16

B.2.156 -xtemp=dir

cc 使用的临时文件的目录设置为 dir。在此选项字符串中不允许有空格。如果不指定此选项,临时文件将保存到 /tmp-xtemp 优先于 TMPDIR 环境变量。

B.2.157 -xthreadvar[= o]

指定 -xthreadvar 来控制线程局部变量的实现。将此选项与 __thread 声明说明符结合使用,可利用编译器的线程局部存储功能。使用 __thread 说明符声明线程变量后,请指定 -xthreadvar,以便能够将线程局部存储用于动态(共享)库中的位置相关的代码(非 PIC 代码)。有关如何使用 __thread 的更多信息,请参见2.3 线程局部存储说明符

o 必须为 dynamicno%dynamic

表 B-44 -xthreadvar 标志

标志
含义
[no%]dynamic
编译动态装入的变量。

使用 -xthreadvar=no%dynamic 时对线程变量的访问明显加快,但是不能在动态库中使用目标文件。也就是说,只能在可执行文件中使用目标文件。

如果未指定 -xthreadvar,则编译器所用的缺省设置取决于是否启用与位置无关的代码。如果启用了与位置无关的代码,则该选项设置为 -xthreadvar=dynamic。如果禁用了与位置无关的代码,则该选项设置为 -xthreadvar=no%dynamic

如果指定了 -xthreadvar 但未指定任何值,该选项将设置为 -xthreadvar=dynamic

如果动态库包含与位置有关的代码,则必须指定 -xthreadvar

链接程序不支持在动态库中与非 PIC 代码等效的线程变量。由于非 PIC 线程变量要快很多,因此应将其用作可执行文件的缺省设置。

另请参见 -xcode-KPIC-Kpic 的描述

B.2.158 -xtime

报告每个编译组件所用的时间和资源。

B.2.159 -xtransition

针对 K&R C 与 Solaris ISO C 之间的差异发出警告。

-xtransition 选项与 -Xa-Xt 选项一起使用时将发出警告。通过适当编码,可以消除关于不同行为的所有警告消息。除非使用 -xtransition 选项,否则不再出现以下警告:

B.2.160 -xtrigraphs[={ yes|no}]

-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 (??)

B.2.161 -xunroll=n

建议优化器解开循环 n 次。n 是正整数。n 为 1 时,要求编译器不要解开循环。当 n 大于 1 时,-xunroll=n 建议编译器根据需要解开循环 n 次。

B.2.162 -xustr={ascii_utf16_ushort |no}

如果您需要支持使用 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" 文本字符串。

不是所有文件都必须使用该选项编译。

以下示例显示了前置有 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';

B.2.163 -xvector[= a]

在支持 SIMD 的 x86 处理器上允许自动生成向量库函数的调用或生成 SIMD(Single Instruction Multiple Data,单指令多数据)指令。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。

下表列出了 a 的值。no% 前缀可禁用关联的子选项。

表 B-45 -xvector 标志

含义
[no%]lib
(仅限 Solaris>)允许编译器将循环内的数学库调用转换为对等效向量数学例程的单个调用(如果能够进行此类转换)。此类转换可提高那些循环计数较大的循环的性能。使用 no%lib 可以禁用此选项。
[no%]simd
(仅限 x86)指示编译器使用本机 x86 SSE SIMD 指令来提高某些循环的性能。在 x86 中,缺省情况下以可产生有利结果的优化级别 3 和更高级别使用流扩展。使用 no%simd 可以禁用此选项。

仅当目标体系结构中存在流扩展(即目标 ISA 至少为 SSE2)时,编译器才会使用 SIMD。例如,可在现代平台中指定 -xtarget=woodcrest、-xarch=generic64、-xarch=sse2、-xarch=sse3-fast 来使用它。如果目标 ISA 没有流扩展,子选项将无效。

%none
完全禁用此选项。
yes
此选项已废弃,改为指定 -xvector=lib
no
此选项已废弃,改为指定 -xvector=%none

在 x86 平台上的缺省值为 -xvector=simd,在 SPARC 平台上的缺省值为 -xvector=%none。如果指定不带子选项的 -xvector,则在 x86 Solaris、SPARC Solaris 和 Linux 平台上,编译器将分别采用 -xvector=simd,lib-xvector=lib-xvector=simd

-xvector 选项需要 -xO3 或更高的优化级别。如果优化级别未指定或低于 -xO3,编译将不会继续,同时会发出消息。


注 - 编译 x86 平台的 Oracle Solaris 内核代码时,应使用 -xvector=%none 进行编译。


在装入步骤中,编译器包含 libmvec 库。如果在不同的步骤中进行编译和链接,请对这两个命令使用相同的 -xvector 选项。

B.2.164 -xvis

(SPARC) 在使用 vis.h 头文件生成 VIS 指令或使用汇编程序内联代码 (.il)(使用 VIS 指令)时,请使用 -xvis=[yes|no] 命令。缺省值为 -xvis=no。指定 -xvis 与指定 -xvis=yes 等效。

VIS 指令集是 SPARC v9 指令集的扩展。尽管 UltraSPARC 是 64 位处理器,但在很多情况下数据都限制在 8 位或 16 位范围内,特别是多媒体应用程序中。VIS 指令可以用一条指令处理 4 个 16 位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高。

B.2.165 -xvpara

发出有关可能存在的并行编程相关问题的警告,这些问题可能导致在使用 OpenMP 时出现错误的结果。与 -xopenmp 和 OpenMP API 指令一起使用。

编译器在检测到下列情形时会发出警告。

如果所有并行化指令在处理期间均未出现问题,则不显示警告。

示例:

cc -xopenmp -vpara any.c

注 - Oracle Solaris Studio 编译器支持 OpenMP API 并行化。因此,已废弃 MP pragma 指令,不再支持此类指令。有关迁移到 OpenMP API 的信息,请参见《OpenMP API 用户指南》。


B.2.166 -Yc , dir

指定新目录 dir 作为组件 c 的位置。c 可以包含任何字符,这些字符表示 -W 选项下列出的组件。

如果已指定组件的位置,则工具的新路径名称为 dir/tool。如果对任何一项应用了多个 -Y 选项,则保留最后一个选项。

B.2.167 -YA, dir

指定用来搜索所有编译器组件的目录 dir。如果 dir 中找不到组件,搜索将转至安装编译器的目录。

B.2.168 -YI, dir

更改搜索 include 文件的缺省目录。

B.2.169 -YP, dir

更改用于查找库文件的缺省目录。

B.2.170 -YS, dir

更改启动目标文件的缺省目录。

B.2.171 -Zll

(SPARC) 为 lock_lint 创建程序数据库,但不生成可执行代码。有关更多信息,请参阅 lock_lint(1) 手册页。