NAME
cc - C compiler
SYNOPSIS
cc [-#] [-###] [-Aname[(tokens)]] [-B[static|dynamic]]
[-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]] [-fprecision=p] [-fround=r]
[-fsimple[=n]] [-fsingle] [-fstore] [-ftrap[=t[,t...]]]
[-G] [-g] [-g3] [-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]
[-Qoption phase [,option...]] [-Q[y|n]] [-qp]
[-Rdir[:dir...]] [-S] [-s] [-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] [-xdebugformat=[stabs|dwarf]]
[-xdepend[={yes|no}]] [-xdryrun]
[-xdumpmacros[=v[,v...]]] [-xe] [-xF[=v]] [-xhelp=f]
[-xhwcprof[={enable|disable}]] [-xinline=[v[,v...]]]
[-xinstrument=[no%]datarace] [-xipo[=n]]
[-xipo_archive[=a]] [-xivdep[=p]] [-xjobs=n]
[-xkeepframe[=p]] [-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] [-xpec]
[-xpch=v] [-xpchstop] [-xpentium] [-xpg]
[-xprefetch[=val[,val]]] [-xprefetch_auto_type=[a]
[-xprefetch_level=l] [-xprofile=p]
[-xprofile_ircache[=path]]
[-xprofile_pathmap=collect_prefix:use_prefix]
[-xreduction] [-xregs=r[,r...]] [-xrestrict[=f]] [-xs]
[-xsafe=mem] [-xsfpconst] [-xspace] [-xstrconst]
[-xtarget=t] [-xtemp=dir] [-xthreadvar[=o] [-xtime]
[-xtransition] [-xtrigraphs[=[yes|no]] [-xunroll=n]
[-xustr={ascii_utf16_ushort|no}] [-xvector[=a]] [-xvis]
[-xvpara] [-Yc,dir] [-YA,dir] [-YI,dir] [-YP,dir]
[-YS,dir] [-Zll]
DESCRIPTION
Oracle Solaris Studio 12.3 C Compiler version 5.12
This man page details the options or flags that are avail-
able for the C compiler in the Oracle Solaris Studio 12.3
release.
Complete documentation for this release is available on the
Oracle Technical Network (OTN) Solaris Studio website:
http://oracle.com/technetwork/server-storage/solarisstudio
The OTN website is a complete resource for Oracle Solaris
Studio and includes many technical articles detailing best
practices and deep dives into various programming technolo-
gies and other topics.
For the complete description of all new features and func-
tionality in the Oracle Solaris Studio suite, see the What's
New in this Release guide.
A man page, by definition, is a quick reference. For more
detailed information on the C compiler and its options, see
the C User's Guide.
COMPILING FOR 64-BIT PLATFORMS:
Use the -m32 and -m64 options to specify the memory model of
the target compilation, ILP32 or LP64 respectively.
The -xarch option no longer carries an implicit memory model
definition, and should be used only to specify the instruc-
tion set of the target processor.
The ILP32 model specifies that C-language int, long, and
pointer data types are all 32-bits wide. The LP64 model
specifies that long and pointer data types are all 64-bits
wide. The Oracle Solaris and Linux OS also support large
files and large arrays under the LP64 memory model.
When compiling with -m64, the resulting executable will work
only on 64-bit SPARC or x86 processors under Oracle Solaris
OS or Linux OS running a 64-bit kernel. Compilation, link-
ing, and execution of 64-bit objects can only take place in
a Oracle Solaris or Linux OS that supports 64-bit execution.
SPECIAL x86 NOTES
There are some important issues to be aware of when compil-
ing for x86 Oracle Solaris platforms.
Programs compiled with -xarch set to sse, sse2, sse2a, or
sse3 and beyond must be run only on platforms that provide
these extensions and features.
If you compile and link in separate steps, always link using
the compiler and with same -xarch setting to ensure that the
correct startup routine is linked.
Numerical results on x86 might differ from results on SPARC
due to the x86 80-bit floating-point registers. To minimize
these differences, use the -fstore option or compile with
-xarch=sse2 if the hardware supports SSE2.
Numerical results can also differ between Oracle Solaris and
Linux because the intrinsic math libraries (for example,
sin(x)) are not the same.
Binary Compatibility Verification
Program binaries compiled and built using specialized -xarch
hardware flags are verified by the OS that they are being
run on the appropriate platform. Running programs compiled
with specialized -xarch options on platforms that are not
enabled with the appropriate features or instruction set
extensions could result in segmentation faults or incorrect
results occurring without any explicit warning messages.
This warning extends also to programs that employ .il inline
assembly language functions or __asm() assembler code that
utilize SSE, SSE2, SSE2a, and SSE3 (and beyond) instructions
and extensions.
Overview of the C Compiler
The cc (1) manual page describes the ISO C compiler options
that are SVID compliant under current Oracle Solaris operat-
ing systems. Take note that the C compiler recognizes by
default some of the constructs of the 1999 ISO/IEC C stan-
dard. Specifically, the supported are detailed in the C
User's Guide. Use the -xc99=none command if you want to
limit the compiler to the 1990 ISO/IEC C standard.
cc is the interface to the C compilation system. The compi-
lation process incorporates a preprocessor, compiler, code
generator, optimizer, assembler, and link editor. cc
processes the supplied options and then executes the various
components with the proper arguments. cc accepts several
types of files as arguments.
Files with .c suffix are taken to be C source files and may
be preprocessed, compiled, optimized, instrumented for pro-
filing, assembled, and link edited. Although the preproces-
sor can be used as a macro processor, this is not recom-
mended, as its output is geared toward that which would be
acceptable as input to a valid C compiler. The compilation
process may be stopped after the completion of any pass if
the appropriate options are supplied.
If the compilation process runs through the assembler, then
an object file is produced in the current working directory
with .o suffix substituted for .c. However, the .o file is
normally deleted if a single C file is compiled and then
immediately link edited.
Files with .s suffix are taken to be assembly source files;
they may be assembled and link edited.
Files with .S suffix are taken to be assembly source files;
they may be assembled and link edited. Such files are passed
to the preprocessor (/usr/ccs/lib/cpp on Oracle Solaris),
and then to the assembler.
Files with an .i are taken to be preprocessed C source
files, and may be compiled, optimized, instrumented for pro-
filing, assembled, and link edited. Files whose names do not
end in .c, .s, .S or .i are passed to the link editor, which
produces a dynamically linked executable whose name by
default is a.out.
See option -Yc, dir to change the default directories used
for finding libraries. dir is a colon-separated path list.
The default library search order can be seen by using the
-### or -xdryrun option and examining the -Y option of the
ld invocation.
User-Supplied Default Compiler Options Startup File
The default compiler options file enables the user to
specify a set of default options that are applied to all
compiles, unless otherwise overridden. For example, the file
could specify that all compiles default at -xO2, or automat-
ically include the file setup.il.
At startup, the compiler searches for a default options file
listing default options it should include for all compiles.
The environment variable SPRO_DEFAULTS_PATH specifies a
colon-separated list of directories to search for the the
defaults file.
If the environment variable is not set, a standard set of
defaults is used. If the environment variable is set but is
empty, no defaults are used.
The defaults file name must be of the form
compiler.defaults, where compiler is one of the following:
cc, c89, c99, CC, ftn, or lint. For example, the defaults
for the C compiler would be cc.defaults
If a defaults file for the compiler is found in the
directories listed in SPRO_DEFAULTS_PATH, the compiler will
read the file and process the options prior to processing
the options on the command line. The first defaults file
found will be used and the search terminated.
System administrators may create system-wide default files
in Studio-install-path/prod/etc/config. If the environment
variable is set, the installed defaults file will not be
read.
The format of a defaults file is similar to the command
line. Each line of the file may contain one or more compiler
options separated by white space. Shell expansions, such as
wild cards and substitutions, will not be applied to the
options in the defaults file.
The value of the SPRO_DEFAULTS_PATH and the fully expanded
command line will be displayed in the verbose output pro-
duced by options -#, -###, and -dryrun.
Options specified by the user on the command line will usu-
ally override options read from the defaults file. For exam-
ple, if the defaults file specifies compiling with -xO4 and
the user specifies -xO2 on the command line, -xO2 will be
used.
Some options appearing in the default options file will be
appended after the options specified on the command line.
These are the preprocessor option -I, linker options -B, -L,
-R, and -l, and all file arguments, such as source files,
object files, archives, and shared objects.
The following is an example of how a user-supplied default
compiler option startup file might be used.
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
The compiler command is now equivalent to:
cc -fast -xvpara -c -I/local/hdrs -L/local/libs -lliblocal \
tst.c -I/project/src/hdrs -L/project/libs -llibproj
While the compiler defaults file provides a convenient way
to set the defaults for an entire project, it can become the
cause of hard to diagnose problems. Set the environment
variable SPRO_DEFAULTS_PATH to an absolute path rather than
the current directory to avoid such problems.
The interface stability of the default options file is
uncommitted. The order of option processing is subject to
change in a future release.
OPTIONS
All platform-specific options are silently accepted on all
platforms. Any exceptions to this rule are noted under the
specific option.
Options valid only on SPARC platforms are marked (SPARC).
Options valid only on x86/x64 platforms are marked (x86).
Deprecated options are marked (Obsolete) and should not be
used going forward. They are provided only for compatibility
with earlier releases. Use the indicated replacement option.
See ld(1) for linker options.
In general, processing of the compiler options is from left
to right, permitting selective overriding of macro options.
This rule does not apply to linker or preprocessor options.
In the syntax of the command-line options, items shown in
square brackets ( [] ) are optional. Curly brackets enclose
a bar-separated list of literal items to be chosen, as in
{yes | no | maybe } . The first item in a list usually
indicates the default value when the flag appears without a
value.
For example, -someoption[={no|yes}] implies -someoption is
the same as -someoption=no .
The following options are interpreted by cc:
-# Turns on verbose mode, showing how command options
expand. Shows each component as it is invoked.
-### Shows each component as it would be invoked, but does
not actually execute it. Also shows how command options
would expand.
-Aname[(tokens)]
Associate name as a predicate with the specified tokens
as if by a #assert preprocessing directive.
Preassertions:system(unix)
machine(sparc) (SPARC)
machine(i386) (x86)
cpu(sparc) (SPARC)
cpu(i386) (x86)
The above are not predefined in -Xc mode.
If -A is followed by a dash (-) only, it causes all
predefined macros (other than those that begin with __)
and predefined assertions to be forgotten.
-B [static|dynamic]
Specifies whether bindings of libraries for linking are
static or dynamic, indicating whether libraries are
non-shared or shared, respectively. -B dynamic causes
the link editor to look for files named libx.so and
then for files named libx.a when given the -lx option.
-B static causes the link editor to look only for files
named libx.a. This option may be specified multiple
times on the command line as a toggle.
Note: Many system libraries, such as libc, are only
available as dynamic libraries in the Oracle Solaris
64-bit compilation environment. Therefore, do not use
-Bstatic as the last toggle on the command line.
This option and its argument are passed to ld.
-C Prevents the C preprocessor from removing comments,
other than those on preprocessing directive lines.
-c Compile and produce a .o file for each source file
without linking. You can explicitly name a single
object file by using the -o option. When the compiler
produces object code for each or input file, it always
creates an object file in the current working direc-
tory. If you suppress the linking step, you also
suppress the removal of the object files.
-Dname[(arg[,arg])] [=expansion]
Define a macro with optional arguments as if the macro
is defined by a #define preprocessing directive. If no
=expansion is specified, the compiler assumes =1.
Predefinitions:unix
sparc (SPARC)
sun
The above are not predefined in -Xc mode.
These predefinitions are valid in all modes:
__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)
The following is predefined in -Xa and -Xt modes only:
__RESTRICT
The compiler also predefines the object-like macro
__PRAGMA_REDEFINE_EXTNAME
to indicate the pragma will be recognized.
-d [y|n]
Allow or disallow dynamic linking.
-dy specifies dynamic linking, which is the default, in
the link editor. -dn specifies static linking in the
link editor.
This option and its argument are passed to ld.
Note: This option causes fatal errors if you use it in
combination with dynamic libraries. Most system
libraries are only available as dynamic libraries.
-dalign
(SPARC) Obsolete. You should not use this option. Use
-xmemalign=8s instead. For a complete list of obsolete
options and flags, see the C User's Guide. Ignored on
x64/x86 platforms.
-E Runs the source file through the preprocessor only and
sends the output to stdout. The preprocessor is built
directly into the compiler, except in -Xs mode, where
/usr/ccs/lib/cpp is invoked. Includes the preprocessor
line numbering information. See also -P option.
-errfmt[=[no%]error]
Use this option if you want to prefix the string
"error:" to the beginning of error messages so they are
more easily distinguishable from warning messages. The
prefix is also attached to warnings that are converted
to errors by -errwarn.
error Add the prefix "error:" to all error messages.
no%error Do not add the prefix "error:" to any error
messages.
If you do not use this option, the compiler sets it to
-errfmt=no%error. If you use specify -errfmt, but do
not supply a value, the compiler sets it to
-errfmt=error.
-errhdr [=h]
Use this option to limit the warnings from header files
to the group of header files indicated by the following
flags:
Value Meaning
%all Check all used header files.
%none Check none of the header files.
%user Default. Checks all the user header files
except those in /usr/include and its sub-
directories. Also checks all the header files
supplied by the compiler.
-erroff[=t[,t...] ]
Suppresses compiler warning messages but has no effect
on error messages. This option applies to all warning
messages whether or not they have been designated by
-errwarn to cause a non-zero exit status.
The -erroff values are members of a comma-separated
list that consists of one or more of the following:
tag Suppresses the warning message specified by
this tag. You can display the tag for a mes-
sage by using the -errtags=yes option.
no%tag Enables the warning message specified by this
tag.
%all Suppresses all warning messages.
%none Enables all warning messages. This is the
default.
Order is important; for example, %all,no%tag suppresses
all warning messages except tag.
The default is -erroff=%none. Specifying -erroff is
equivalent to specifying -erroff=%all.
Only warning messages from the C compiler front-end
that display a tag when the -errtags option is used can
be suppressed with the -erroff option. You can achieve
finer control over error message suppression by using
#pragma error_messages.
-errshort[=i]
Use this option to control how much detail is in the
error message produced by the compiler when it discov-
ers a type mismatch. This option is particularly useful
when the compiler discovers a type mismatch that
involves a large aggregate.
i can be one of the following:
short Error messages are printed in short form with
no expansion of types. Aggregate members are
not expanded, neither are function argument
and return types.
full Error messages are printed in full verbose
form showing the full expansion of the
mismatched types.
tags Error messages are printed with tag names for
types which have tag names. If there is no tag
name, the type is shown in expanded form.
If you do not use -errshort, the compiler sets the
option to -errshort=full. If you specify -errshort, but
do not provide a value, the compiler sets the option to
-errshort=tags.
This option does not accumulate, it accepts the last
value specified on the command line.
-errtags=a
Displays the message tag for each warning message of
the C compiler front-end that can be suppressed with
the -erroff option or made a fatal error with the
-errwarn option. Messages from the C compiler driver
and other components of the C compilation system do not
have error tags, and cannot be suppressed with -erroff
and made fatal with -errwarn.
a can be either yes or no. The default is -errtags=no.
Specifying -errtags is equivalent to specifying
-errtags=yes.
-errwarn[=t[,t...] ]
Use the -errwarn option to cause the C compiler to exit
with a failure status for the given warning messages.
t is a comma-separated list that consists of one or
more of the following: tag, no%tag, %all, %none. Order
is important; for example %all,no%tag causes the C com-
piler to exit with a fatal status if any warning except
tag is issued.
The warning messages generated by the C compiler change
from release to release as the compiler error checking
improves and features are added. Code that compiles
using -errwarn=%all without error may not compile
without error in the next release of the compiler.
Only warning messages from the C compiler front-end
that display a tag when the -errtags option is used can
be specified with the -errwarn option to cause the C
compiler to exit with a failure status.
The default is -errwarn=%none. If you specify -errwarn
alone, it is equivalent to -errwarn=%all.
The following table details the -errwarn values:
tag Cause cc to exit with a fatal status if the
message specified by tag is issued as a warn-
ing message. Has no effect if tag in not
issued.
no%tag Prevent cc from exiting with a fatal status if
the message specified by tag is issued only as
a warning message. Has no effect if tag is not
issued. Use this option to revert a warning
message that was previously specified by this
option with tag or %all from causing cc to
exit with a fatal status when issued as a
warning message.
%all Cause cc to exit with a fatal status if any
warning messages are issued. %all can be fol-
lowed by no%tag to exempt specific warning
messages from this behavior.
%none Prevents any warning messages from causing cc
to exit with a fatal status should any warning
tag be issued. This is the default.
-fast
This option is a macro that you can effectively use as
a starting point for tuning an executable for maximum
run-time performance. The expansion of -fast can change
from one release of the compiler to the next and
includes options that are target platform specific. Use
the -# or the -xdryrun options to examine the expansion
of -fast, and incorporate the appropriate options of
-fast into the ongoing process of tuning the execut-
able.
The expansion of -fast includes -xlibmopt option, which
enables the compiler to use a library of optimized math
routines. For more information, see the description of
-xlibmopt in this man page.
The -fast option impacts the value of errno. See the
NOTES section at the end of this man page for more
information.
Modules that are compiled with -fast must also be
linked with -fast. For a complete list of compiler
options that must be specified at both compile time and
at link time, see the C User's Guide.
The -fast option is unsuitable for programs that are
intended to run on a different target than the compila-
tion machine. In such cases, follow -fast with the
appropriate -xtarget option. For example:
% cc -fast -xtarget=generic
For C modules depending on exception handling specified
by SUID, follow -fast by -xnolibmil -xbuiltin=%default
% cc -fast -xnolibmil -xbuiltin=%default
The -fast option acts like a macro expansion on the
command line. Therefore, you can override any of the
expanded options by following -fast with the desired
option.
If you combine -fast with other options, the last
specification applies.
These options are turned on for -fast:
-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)
Note that this selection of component option flags is
subject to change with each release of the compiler.
For details on the options set by -fast, see the C
User's Guide.
To determine the expansion of -fast on a running sys-
tem, execute the command:
cc -fast -xdryrun |& grep ###
Note: Some optimizations make certain assumptions about
program behavior. If the program does not conform to
these assumptions, the application may crash or produce
incorrect results. Please refer to the description of
the individual options to determine if your program is
suitable for compilation with -fast.
Do not use this option for programs that depend on IEEE
standard exception handling; you can get different
numerical results, premature program termination, or
unexpected SIGFPE signals.
The -fast option on x86 includes -xregs=frameptr. Be
sure to read the discussion of -xregs=frameptr espe-
cially when compiling mixed C, Fortran, and C++ source
codes.
-fd Reports K&R function declarations and definitions.
-features=[a]
The compiler's treatment of extern inline functions
conforms by default to the behavior specified by the
ISO/IEC 9899:1999 C standard. Compile new codes with
-features=no%extinl to obtain the same treatment of
extern inline functions as provided by versions 5.5, or
older, of the C and C++ compilers.
Old C and C++ objects (pre C/C++ 5.6) can be linked
with new C and C++ objects with no change of behavior
for the old objects. To get standard conforming
behavior, old code must be recompiled using the current
compiler.
The following table lists the possible values for a.
Prefix no% disables a suboption.
Value Meaning
[no%]conststrings
Enables or disables the placement of string
literals in read-only memory. The default is
-features=conststrings which replaces the
deprecated -xstrconst option. Note that your
program will fail to write to a string
literal under the default compilation mode
just as if you had specified -xstrconst on
the command line.
extensions
Allows zero-sized struct/union declarations
and void function with return statements
returning a value to work.
extinl Generates extern inline functions as global
functions. This is the default, which con-
forms with the 1999 C standard.
[no%]extinl
Generates extern inline functions as static
functions.
[no%]typeof
Enables/disables recognition of the typeof
operator. The typeof operator returns the
type of its argument (either an expression or
a type). It is specified syntactically like
the sizeof operator, but it behaves semanti-
cally like a type defined with typedef.
Accordingly, it can be used anywhere a
typedef can be used. For example, it can be
used in a declaration, a cast, or inside of a
sizeof or typeof. The default is
-features=typeof.
%none Deprecated. Do not use %none.
Examples
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 */
The typeof operator can be especially useful in macro
definitions, where arguments may be of arbitrary type.
For example:
#define SWAP(a,b)
{ typeof(a) temp; temp = a; a = b; b = temp; }
-flags
Same as -xhelp=flags.
Prints a one-line summary of available options.
-flteval[={any|2}]
(x86) Use this option to control how floating point
expressions are evaluated.
2 Floating point expressions are evaluated as
long double.
any Floating point expressions are evaluated
depending on the combination of the types of
the variables and constants that make up an
expression.
If you do not specify -flteval, the compiler sets it to
-flteval=any. If you do specify -flteval, but do not
provide a value, the compiler sets it to -flteval=2.
-flteval=2 is only usable with -xarch=sse, pentium_pro,
ssea, or pentium_proa.
-flteval=2 is also not compatible in combination with
options -fprecision or -nofstore.
For more information, see 'Precision of Floating Point
Evaluators' in appendix E of the C User's Guide.
-fma [= { none|fused}]
(SPARC) Enables automatic generation of floating-point,
fused, multiply-add instructions. -fma=none disables
generation of these instructions. -fma=fused allows the
compiler to attempt to find opportunities to improve
the performance of the code by using floating-point,
fused, multiply-add instructions.
The default is -fma=none.
The minimum requirements are -xarch=sparcfmaf and an
optimization level of at least -xO2 for the compiler to
generate fused multiply-add instructions. The compiler
marks the binary program if fused multiply-add instruc-
tions are generated in order to prevent the program
from executing on platforms that do not support them.
Fused multiply-adds eliminate the intermediate rounding
step between the multiply and the add. Consequently,
programs may produce different results when compiled
with -fma=fused, although precision will tend to be
increased rather than decreased.
-fnonstd
Macro for -fns and -ftrap=common.
-fns[=[no|yes]]
For SPARC, selects the SPARC nonstandard floating-point
mode.
For x86, selects SSE flush-to-zero mode and, where
available, denormals-are-zero mode. This option causes
subnormal results to be flushed to zero on x86. Where
available, this option also causes subnormal operands
to be treated as zero. This option has no effect on
traditional x86 floating-point operations that do not
utilize the SSE or SSE2 instruction set.
The default, -fns=no, is standard floating-point mode.
Optional use of =yes or =no provides a way of toggling
the -fns flag following some other macro flag that
includes -fns, such as -fast.
-fns is the same as -fns=yes.
-fns=yes selects non-standard floating-point.
-fns=no selects standard floating-point.
On some SPARC systems, the nonstandard floating point
mode disables "gradual underflow", causing tiny results
to be flushed to zero rather than producing subnormal
numbers. It also causes subnormal operands to be
silently replaced by zero. On those SPARC systems that
do not support gradual underflow and subnormal numbers
in hardware, use of this option can significantly
improve the performance of some programs.
When nonstandard mode is enabled, floating point arith-
metic may produce results that do not conform to the
requirements of the IEEE 754 standard. See the Numeri-
cal Computation Guide for more information.
On SPARC systems, this option is effective only if used
when compiling the main program.
-fprecision=p
(x86) Initializes the rounding precision mode bits in
the Floating-point Control Word to p, which is one of
single (24 bits), double (53 bits), or extended (64
bits) respectively. The default floating-point
rounding-precision mode is extended.
Note that on x86, only the precision, not exponent,
range is affected by the setting of floating-point
rounding precision mode.
This option is effective only on x86 systems and only
if used when compiling the main program, but is ignored
if compiling for 64-bit platforms (-m64), or SSE2-
enabled processors (-xarch=sse2). -fprecision is
ignored on SPARC platforms.
-fround=r
Sets the IEEE 754 rounding mode that is established at
runtime during the program initialization.
r must be one of: nearest, tozero, negative, positive.
The default is -fround=nearest.
The meanings are the same as those for the ieee_flags
subroutine.
When r is tozero, negative, or positive, this flag
causes the rounding direction mode to be set to round-
to-zero, round-to-negative-infinity, or round-to-
positive-infinity respectively when a program begins
execution. When r is nearest or the -fround flag is
not used, the rounding direction mode is not altered
from its initial value (round-to-nearest by default).
This option is effective only if used when compiling
the main program.
Note that compiling with -xvector or -xlibmopt require
default rounding. Programs that link with libraries
compiled with either -xvector or -xlibmopt or both must
ensure that default rounding is in effect.
-fsimple[=n]
Allows the optimizer to make simplifying assumptions
concerning floating-point arithmetic.
The compiler defaults to -fsimple=0. Specifying -fsim-
ple is equivalent to -fsimple=1.
If n is present, it must be 0, 1, or 2.
-fsimple=0
Permits no simplifying assumptions. Preserves strict
IEEE 754 conformance.
-fsimple=1
Allows conservative simplifications. The resulting code
does not strictly conform to IEEE 754, but numeric
results of most programs are unchanged.
With -fsimple=1, the optimizer can assume the follow-
ing:
o The IEEE 754 default rounding/trapping modes do not
change after process initialization.
o Computations producing no visible result other than
potential floating- point exceptions may be deleted.
o Computations with Infinity or NaNs as operands need
not propagate NaNs to their results. For example, x*0
may be replaced by 0.
o Computations do not depend on sign of zero.
With -fsimple=1, the optimizer is not allowed to optim-
ize completely without regard to roundoff or excep-
tions. In particular, a floating-point computation can-
not be replaced by one that produces different results
with rounding modes held constant at run time.
-fsimple=2
Includes all the functionality of -fsimple=1, and also
enables use of SIMD instructions to compute reductions
when -xvector=simd is in effect.
Also permits aggressive floating point optimizations
that may cause many programs to produce different
numeric results due to changes in rounding. For exam-
ple, -fsimple=2 permits the optimizer to attempt
replace all computations of x/y in a given loop with
x*z, where x/y is guaranteed to be evaluated at least
once in the loop, z=1/y, and the values of y and z are
known to have constant values during execution of the
loop.
Even with -fsimple=2, the optimizer still is not per-
mitted to introduce a floating point exception in a
program that otherwise produces none.
See Also:
Techniques for Optimizing Applications: High Perfor-
mance Computing by Rajat Garg and Ilya Sharapov for a
more detailed explanation of how optimization can
impact precision. See also articles on performance and
precision on the OTN Oracle Solaris Studio website:
oracle.com/technetwork/server-storage/solarisstudio/
-fsingle
(-Xt and -Xs modes only) Causes the compiler to evalu-
ate float expressions as single precision, rather than
double precision. (This option has no effect if the
compiler is used in either -Xa or -Xc modes, as float
expressions are already evaluated as single precision.)
-fstore
(x86) Causes the compiler to convert the value of a
floating-point expression or function to the type on
the left-hand side of an assignment, when that expres-
sion or function is assigned to a variable, or when the
expression is cast to a shorter floating-point type,
rather than leaving the value in the register. Due to
roundoffs and truncation, the results may be different
from those generated from the register value. This is
the default mode. To turn off this option, use the
-nofstore option.
-ftrap[=t[,t...] ]
Sets the IEEE 745 trapping mode in effect at startup
but does not install a SIGFPE handler. You can use
ieee_handler(3M) or fex_set_handling(3M) to simultane-
ously enable traps and install a SIGFPE handler. If you
specify more than one value, the list is processed
sequentially from left to right.
Use prefix no% to remove a suboption from %all or com-
mon.
Value Meaning
[no%]division Trap on division by zero.
[no%]inexact Trap on inexact result.
[no%]invalid Trap on invalid operation.
[no%]overflow Trap on overflow.
[no%]underflow Trap on underflow.
%all Trap on all the above.
%none Trap on none of the above.
common Trap on invalid, division by zero, and
overflow.
The default is -ftrap=%none.
Note that the [no%] form of the option is used only to
modify the meanings of the %all or common value and
must be used with one of these values, as shown in the
example. The [no%] form of the option by itself does
not explicitly cause a particular trap to be disabled.
Example: -ftrap=%all,no%inexact means set all traps,
except inexact.
If you compile one routine with -ftrap=t, compile all
routines of the program with the same -ftrap=t option;
otherwise, you can get unexpected results.
Use the -ftrap=inexact trap with caution, as it will
result in the trap being issued whenever a floating-
point value cannot be represented exactly. For example,
the following statement may generate this condition:
x = 1.0 / 3.0;
-G Produce a shared object rather than a dynamically
linked executable. This option is passed to ld and
cannot be used with the -dn option.
When you use the -G option, the compiler does not pass
any default -l options to ld. If you want the shared
library to have a dependency on another shared library,
you must pass the necessary -l option on the command
line.
If you are creating a shared object by specifying -G
along with other compiler options that must be speci-
fied at both compile time and link time, make sure that
those same options are also specified when you link
with the resulting shared object.
When you create a shared object, all the object files
that are compiled for 64-bit SPARC architectures must
also be compiled with an explicit -xcode value as docu-
mented under the description of -xcode.
-g Produces additional symbol table information for dbx(1)
and the Performance Analyzer analyzer(1).
If you specify -g, and the optimization level is -xO3
or lower, the compiler provides best-effort symbolic
information with almost full optimization. Tail-call
optimization and back-end inlining are disabled.
If you specify -g and the optimization level is -xO4,
the compiler provides best-effort symbolic information
with full optimization.
Compile with the -g option to use the full capabilities
of the Performance Analyzer. While some performance
analysis features do not require -g, you must compile
with -g to view annotated source, some function level
information, and compiler commentary messages. See the
analyzer(1) man page and the Performance Analyzer
manual for more information.
The commentary messages that are generated with -g
describe the optimizations and transformations that the
compiler made while compiling your program. Use the
er_src(1) command to display the messages, which are
interleaved with the source code.
Note: If you compile and link your program in separate
steps, then including the -g option in one step and
excluding it from the other step will not affect the
correctness of the program, but it will affect the
ability to debug the program. Any module that is not
compiled with -g (or -g0), but is linked with -g (or
-g0) will not be prepared properly for debugging. Note
that compiling the module that contains the function
main with the -g option (or the -g0 option) is usually
necessary for debugging.
-g3 Produce additional debugging information.
-g3 is the same as -g with additional debugging symbol
table information so that dbx can display how macros in
the source code have been expanded. This added symbol
table information can result in an increase in the size
of the debug information in the resulting .o and exe-
cutable when compared to only using -g.
-H Prints, one per line, the path name of each file
included during the current compilation to standard
error.
-h name
Assigns a name to a shared dynamic library; allows you
to keep different versions of a library.
In general, the name after -h should be the same as the
file name given in the -o option. The space between -h
and name is optional.
The linker assigns the specified name to the library
and records the name in the library file as the intrin-
sic name of the library. If there is no -h name option,
then no intrinsic name is recorded in the library file.
When the runtime linker loads the library into an exe-
cutable file, it copies the intrinsic name from the
library file into the executable, into a list of needed
shared library files. Every executable has such a list.
If there is no intrinsic name of a shared library, then
the linker copies the path of the shared library file
instead.
-I[-|dir]
-Idir adds dir to the list of directories that are
searched for #include files. -I values accumulate from
left to right.
o For include statements of the form #include
<foo.h>, the preprocessor searches for the header
file in the following order:
1. The directories named with the -I option, if
any.
2. The compiler and system standard directories,
usually /usr/include.
o For include statements of the form #include
"foo.h", the compiler searches the directories in
the following order:
1. The current directory (that is, the directory
that contains the file which contains the
include statement itself.
2. The directories named with -I options, if
any.
3. The compiler and system standard directories,
usually /usr/include.
-I- changes the include-file search rules to the fol-
lowing:
o The compiler never searches the current
directory, unless the directory is listed
explicitly in a -I directive. This effect
applies even for include statements of the
form #include "foo.h".
o For include files of the form #include
"foo.h", search the directories in the fol-
lowing order:
o The directories named with -I options
(both before and after -I-).
o The compiler and system standard direc-
tories, usually /usr/include.
o For include files of the form #include
<foo.h>, search the directories in the fol-
lowing order:
o The directories named with the -I
options that appear after -I- (that is,
the compiler does not search the -I
directories that appear before -I-).
o The compiler and system standard direc-
tories, usually /usr/include.
Only the first -I- option on the command line works as
described above.
-Idir looks in dir, prior to /usr/include, for included
files whose names do not begin with slash (/). Direc-
tories for multiple -I options are searched in the
order specified.
Warnings
Never specify the compiler installation area,
/usr/include, /lib, /usr/lib, as search directories.
-i Ignores the LD_LIBRARY_PATH and LD_LIBRARY_PATH_64 set-
tings.
-include filename
This option causes the compiler to treat filename as if
it appears in the first line of a primary source file
as a #include preprocessor directive.
The first directory the compiler searches for filename
is the current working directory and not the directory
containing the main source file, as is the case when a
file is explicitly included. If the compiler cannot
find filename in the current working directory, it
searches the normal directory paths. If you specify
multiple -include options, the files are included in
the order they appear on the command line.
-KPIC
(SPARC) Obsolete. You should not use this option. Use
-xcode=pic32 instead. For a complete list of obsolete
options and flags, see the C User's Guide.
(x86) -KPIC is identical to -Kpic on x86 architectures.
-Kpic
(SPARC) Obsolete. You should not use this option. Use
-xcode=pic13 instead. For a complete list of obsolete
options and flags, see the C User's Guide.
(x86) Produces position-independent code. Use this
option to compile source files when building a shared
library. Each reference to a global datum is generated
as a dereference of a pointer in the global offset
table. Each function call is generated in pc-relative
addressing mode through a procedure linkage table.
-keeptmp
Retains temporary files created during compilation,
instead of deleting them automatically.
-Ldir
Adds dir to the list of directories searched for
libraries by ld. This option and its arguments are
passed to ld.
Warnings
Never specify the compiler installation area,
/usr/include, /lib, /usr/lib, as search directories.
-lname
Links with object library libname.so or libname.a (for
ld(1)). The order of libraries in the command line is
important, as symbols are resolved from left to right.
This option must follow the sourcefile.
-library=sunperf
Link with the Oracle Solaris Studio supplied perfor-
mance libraries.
-m32|-m64
Specifies the memory model for the compiled binary
object.
Use -m32 to create 32-bit executables and shared
libraries. Use -m64 to create 64-bit executables and
shared libraries.
The ILP32 memory model (32-bit int, long, pointer data
types) is the default on all Oracle Solaris platforms
and on Linux platforms that are not 64-bit enabled. The
LP64 memory model (64-bit long, pointer data types) is
the default on Linux platforms that are 64-bit enabled.
-m64 is permitted only on platforms that are enabled
for the LP64 model.
Object files or libraries compiled with -m32 cannot be
linked with object files or libraries compiled with
-m64.
When compiling applications with large amounts of
static data using -m64, -xmodel=medium may also be
required. Be aware that some Linux platforms do not
support the medium model.
Modules that are compiled with -m32|-m64 must also be
linked with -m32|-m64. For a complete list of compiler
options that must be specified at both compile time and
at link time, see the C User's Guide.
Note that in previous compiler releases, the memory
model, ILP32 or LP64, was implied by the choice of the
instruction set with -xarch. Starting with the Sun Stu-
dio 12 compilers, this is no longer the case. On most
platforms, just adding -m64 to the command line is suf-
ficient to create 64-bit objects.
On Oracle Solaris, -m32 is the default. On Linux sys-
tems supporting 64-bit programs, -m64 -xarch=sse2 is
the default.
See also -xarch.
-mc Removes duplicate strings from the .comment section of
an object file. When you use the -mc flag, mcs -c is
invoked.
-misalign
(SPARC) Obsolete. You should not use this option. Use
the -xmemalign=1i option instead. For a complete list
of obsolete options and flags, see the C User's Guide.
-misalign2
(SPARC) Obsolete. You should not use this option. Use
the -xmemalign=2i option instead. For a complete list
of obsolete options and flags, see the C User's Guide.
-mr[,string]
-mr removes all strings from the .comment section of an
object file. When you use the -mr flag, mcs -d is
invoked.
-mr,string removes all strings from the .comment sec-
tion and inserts string in the .comment section of the
object file. If string contains embedded blanks, it
must be enclosed in quotation marks. If string is null,
the .comment section will be empty. When you use this
flag, mcs -d -a is invoked.
-mt[={yes|no}]
Use this option to compile and link multithreaded code
using the Oracle Solaris threads or POSIX threads API.
The -mt=yes option assures that libraries are linked in
the appropriate order.
This option passes -D_REENTRANT to the preprocessor.
To use Oracle Solaris threads, include the thread.h
header file and compile with the -mt=yes option. To use
POSIX threads on Oracle Solaris platforms, include the
pthread.h header file and compile with the -mt=yes
option.
On Linux platforms, only the POSIX threads API is
available. (There is no libthread on Linux platforms.)
Consequently, -mt=yes on Linux platforms adds -lpthread
instead of -lthread. To use POSIX threads on Linux
platforms, compile with -mt.
Note that when compiling with -G, neither -ltread nor
-lpthread are automatically included by -mt=yes. You
will need to explicitly list these libraries when
building a shared library.
The -xopenmp option (for using the OpenMP shared-memory
parallelization API) includes -mt=yes automatically.
If you compile with -mt=yes and link in a separate
step, you must use the -mt=yes option in the link step
as well as the compile step. If you compile and link
one translation unit with -mt=yes, you must compile and
link all units of the program with -mt=yes
-mt=yes is the default behavior of the compiler. If
this behaviour is not desired use the option -mt=no.
The option -mt is equivalent to -mt=yes.
See also: -xnolib
-native
This option is a synonym for -xtarget=native.
-nofstore
(x86) Cancel -fstore on command line. Cancels forcing
expressions to have the precision of the destination
variable as invoked by -fstore.
-nofstore is invoked by -fast. The normal default is
-fstore.
-O Use default optimization level -xO3. However, -xO3 may
be inappropriate for programs that rely on all vari-
ables being automatically considered volatile. Typical
programs that might have this assumption are device
drivers and older multi-threaded applications that
implement their own synchronization primitives. The
work around is to compile with -xO2 instead of -O.
-On The same as -xOn.
-o filename
Names the output file filename, instead of the default
a.out. filename cannot be the same as sourcefile since
cc does not overwrite the source file.
filename must have an appropriate suffix. When used
with -c, filename specifies the target .o object file;
with -G it specifies the target .so library file. This
option and its argument are passed to ld.
-P Preprocesses only the named C files and leaves the
result in corresponding files suffixed .i. The output
will not contain any preprocessing line directives,
unlike -E.
-p Obsolete See -xpg.
-Qoption phase option[,option...]
Passes option to the compilation phase.
To pass multiple options, specify them in order as a
comma-separated list. Options that are passed to com-
ponents with -Qoption can be reordered. Options that
the driver recognizes are kept in the correct order. Do
not use -Qoption for options that the driver already
recognizes.
The following table shows the possible values for phase
and the corresponding argument for -Wc,arg
Qoption
phase W<c>
===== ====
fbe a Assembler: (fbe), (gas)
cg c C code generator: (cg)(SPARC)
driver d cc driver (1)
ir2hf h Intermediate code translator (ir2hf)(x86)
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)
See also -Wc,arg
-Q[y|n]
Emits or does not emit identification information to
the output file. If y is used, identification informa-
tion about each invoked compilation tool will be added
to the output files (the default behavior). This can
be useful for software administration. -Qn suppresses
this information.
-qp Same as -p.
-Rdir[:dir...]
A colon-separated list of directories used to specify
library search directories to the runtime linker. If
present and not null, it is recorded in the output
object file and passed to the runtime linker.
If both LD_RUN_PATH and the -R option are specified,
the -R option takes precedence.
-S Compiles, but does not assemble or link edit the named
C files. The assembler-language output is left in
corresponding files suffixed .s.
-s Removes all symbolic debugging information from the
output object file. This option is passed to ld(1).
This option cannot be specified with -g.
-traceback[={%none|common|signals_list}]
Issue a stack trace if a severe error occurs in execu-
tion.
The -traceback option causes the executable to issue a
stack trace to stderr, dump core, and exit if certain
signals are generated by the program. If multiple
threads generate a signal, a stack trace will only be
produced for the first one.
To use traceback, add the -traceback option to the com-
piler command line when linking. The option is also
accepted at compile-time but is ignored unless an exe-
cutable binary is generated. Using -traceback with -G
to create a shared library is an error.
%none or none
disables traceback
common
specifies that a stack trace should be issued if
any of a set of common signals is generated --
sigill, sigfpe, sigbus, sigsegv, and sigabrt.
signals_list
specifies a comma-separated list of names of sig-
nals which should generate a stack trace, in lower
case. The following signals (those that cause the
generation of a core file) can be caught:
sigquit, sigill, sigtrap, sigabrt, sigemt, sigfpe,
sigbus, sigsegv, sigsys, sigxcpu, sigxfsz
Any of these can be preceeded with no% to disable
catching the signal.
For example: -traceback=sigsegv,sigfpe will pro-
duce a stack trace and core dump if either sigsegv
or sigfpe is generated.
If the option is not specified, the default is
-traceback=%none
-traceback without any = sign implies -traceback=common
Note: If the core dump is not wanted, users may set the
coredumpsize limit to zero using:
% limit coredumpsize 0
The -traceback option has no effect on runtime perfor-
mance.
-Uname
Causes any definition of name to be undefined. This
option removes any initial definition of the preproces-
sor symbol name created by -D on the same command line
including those placed by the command-line driver.
-U has no effect on any preprocessor directives in
source files. You can supply multiple -U options on the
command line.
If the same name is specified for both -D and -U, name
is not defined, regardless of the order of the options.
-V Causes each invoked tool to print its version informa-
tion on the standard error output.
-v Causes the compiler to perform more and stricter
semantic checks, and to enable certain lint-like checks
on the named C files.
-Wc,arg
Passes the argument arg to c. Each argument must be
separated from the preceding by only a comma. (A comma
can be part of an argument by escaping it by an immedi-
ately preceding backslash (\) character; the backslash
is removed from the resulting argument.) All -W argu-
ments are passed after the regular command-line argu-
ments.
c can be one of the following:
a Assembler: (fbe), (gas)
c C code generator: (cg)(SPARC)
d cc driver (1)
h Intermediate code translator (ir2hf)(x86)
l Link editor (ld)
m mcs
O (Capital letter 'O') Interprocedural optim-
izer
o Postoptimizer
p Preprocessor (cpp)
u C code generator (ube), (x86)
0 (The number zero) Compiler (acomp)
2 Optimizer: (iropt)
(1) Note: You cannot use -Wd to pass the cc options
listed in this man page to the C compiler.
For example, -Wa,-o,objfile passes -o and objfile to
the assembler, in that order; also -Wl,-I,name causes
the linking phase to override the default name of the
dynamic linker, /usr/lib/ld.so.1.
The order in which the argument(s) are passed to a tool
with respect to the other specified command line
options may change.
-w Suppress compiler warning messages.
The option overrides the error_messages pragma.
-X[c|a|t|s]
Specifies the degree of conformance to the ISO C stan-
dard. The value of -xc99 affects which version of the
ISO C standard the -X option applies.
c (conformance)
Strictly conformant ISO C, without K&R C compati-
bility extensions. The compiler issues errors and
warnings for programs that use non-ISO C con-
structs. The predefined macro __STDC__ has a
value of 1 with the -Xc option.
a This is the default compiler mode. ISO C plus K&R
C compatibility extensions, with semantic changes
required by ISO C. Where K&R C and ISO C specify
different semantics for the same construct, the
compiler uses the ISO C interpretation. If the -Xa
option is used in conjunction with the -xtransi-
tion option, the compiler issues warnings about
the different semantics. The predefined macro
__STDC__ has a value of 0 with the -Xa option.
t (transition)
This option uses ISO C plus K&R C compatibility
extensions without semantic changes required by
ISO C. Where K&R C and ISO C specify different
semantics for the same construct, the compiler
uses the K&R C interpretation. If you use the -Xt
option in conjunction with the -xtransition
option, the compiler issues warnings about the
different semantics. The predefined macro __STDC__
has a value of zero with the -Xt option.
s (K&R C)
The compiler tries to warn about all language con-
structs that have differing behavior between Ora-
cle Solaris Studio ISO C and the K&R C. Invokes
cpp for processing. __STDC__ is not defined in
this mode.
The predefined macro __STDC__ has the value 0 for -Xt
and -Xa, and 1 for -Xc. (It is not defined for -Xs.)
All warning messages about differing behavior can be
eliminated through appropriate coding; for example, use
of casts can eliminate the integral promotion change
warnings.
-Xlinker arg
Passes arg to linker, ld(1)
Equivalent to -Wl,arg
-xaddr32[={yes|no}]
(x86/x64 only) The -xaddr32=yes compilation flag res-
tricts the resulting executable or shared object to a
32-bit address space.
An executable that is compiled in this manner results
in the creation of a process that is restricted to a
32-bit address space.
When -xaddr32=no is specified a usual 64 bit binary is
produced.
If the -xaddr32 option is not specified, -xaddr32=no is
assumed.
If only -xaddr32 is specified -xaddr32=yes is assumed.
This option is only applicable to -m64 compilations and
only on Oracle Solaris platforms supporting
SF1_SUNW_ADDR32 software capability.
Since Linux kernel does not support addres space limi-
tation this option is not available on Linux. The
-xaddr32 option is ignored on Linux.
When linking, if a single object file was compiled with
-xaddr32=yes the whole output file is assumed to be
compiled with -xaddr32=yes.
A shared object that is restricted to a 32-bit address
space must be loaded by a process that executes within
a restricted 32-bit mode address space.
For more information refer to the SF1_SUNW_ADDR32
software capabilities definition, described in the
Linker and Libraries Guide.
-xalias_level[=a]
where a must be one of:any, basic, weak, layout,
strict, std, strong. Use this flag to place the indi-
cated alias level into effect for the whole translation
unit. In other words, the alias level you select is
applied to all of the memory references in the transla-
tion unit. If you do not supply -xalias_level, the com-
piler assumes -xalias_level=any. If you supply
-xalias_level without a value, the compiler assumes
-xalias_level=layout.
o any
The compiler assumes that all memory references can
alias at this level. There is no type-based alias anay-
lysis.
o basic
If you use the -xalias_level=basic option, the compiler
assumes that memory references that involve different C
basic types do not alias each other. The compiler also
assumes that references to all other types can alias
each other as well as any C basic type. The compiler
assumes that references using char * can alias any
other type.
o weak
If you use the -xalias_level=weak option, the compiler
assumes that any structure pointer can point to any
structure type. Any structure or union type that con-
tains a reference to any type that is either referenced
in an expression in the source being compiled or is
referenced from outside the source being compiled, must
be declared prior to the expression in the source being
compiled.
You can satisfy this restriction by including all the
header files of a program that contain types that
reference any of the types of the objects referenced in
any expression of the source being compiled.
At the level of -xalias_level=weak, the compiler
assumes that memory references that involve different C
basic types do not alias each other. The compiler
assumes that references using char * alias memory
references that involve any other type.
o layout
The compiler assumes that memory references that
involve types with the same sequence of types in memory
can alias each other. The compiler assumes that two
references with types that do not look the same in
memory do not alias each other. The compiler assumes
that any two memory accesses through different struct
types alias if the initial members of the structures
look the same in memory. However, at this level, you
should not use a pointer to a struct to access some
field of a dissimilar struct object that is beyond any
of the common initial sequence of members that look the
same in memory between the two structs. This is because
the compiler assumes that such references do not alias
each other.
At the level of -xalias_level=layout the compiler
assumes that memory references that involve different C
basic types do not alias each other. The compiler
assumes that references using char * can alias memory
references involving any other type.
o strict
The compiler assumes that memory references, that
involve types such as structs or unions, that are the
same when tags are removed, can alias each other. Con-
versely, the compiler assumes that memory references
involving types that are not the same even after tags
are removed do not alias each other. However, any
structure or union type that contains a reference to
any type that is part of any object referenced in an
expression in the source being compiled, or is refer-
enced from outside the source being compiled, must be
declared prior to the expression in the source being
compiled.
You can satisfy this restriction by including all the
header files of a program that contain types that
reference any of the types of the objects referenced in
any expression of the source being compiled.
At the level of -xalias_level=strict the compiler
assumes that memory references that involve different C
basic types do not alias each other. The compiler
assumes that references using char * can alias any
other type.
o std
The compiler assumes that types and tags need to be the
same to alias, however, references using char * can
alias any other type. This rule is the same as the res-
trictions on the dereferencing of pointers that are
found in the 1999 ISO C standard. Programs that prop-
erly use this rule will be very portable and should see
good performance gains under optimization.
o strong
The same restrictions apply as at the std level, but
additionally, the compiler assumes that pointers of
type char * are used only to access an object of type
char. Also, the compiler assumes that there are no
interior pointers. An interior pointer is defined as a
pointer that points to a member of a struct.
See Also: -xprefetch_auto_type
-xanalyze={code|no}
Compile with this option to produce a static analysis
of the source code that can be viewed using the Code
Analyzer.
When compiling with -xanalyze=code and linking in a
separate step, include -xanalyze=code also on the link
step.
The default is -xanalyze=no.
See the Oracle Solaris Studio Code Analyzer documenta-
tion for further information.
-xannotate[={yes|no}]
(Oracle Solaris) Instructs the compiler to create
binaries that can later be used by the optimization and
observability tools binopt(1), code-analyzer(1), dis-
cover(1), collect(1), and uncover(1).
The default is -xannotate=yes. Specifying -xannotate
without a value is equivalent to -xannotate=yes.
For optimal use of the optimization and observability
tools, -xannotate=yes must be in effect at both com-
pile and link time.
Compile and link with -xannotate=no to produce slightly
smaller binaries and libraries when optimization and
observability tools will not be used.
This option is not available on Linux systems.
-xarch=isa
Specifies the target architecture instruction set
(ISA).
This option limits the code generated by the compiler
to the instructions of the specified instruction set
architecture by allowing only the specified set of
instructions. This option does not guarantee use of any
target-specific instructions. However, use of this
option can affect the portability of a binary program.
See the Notes and Warnings sections at the end of this
entry.
Note: Use the -m64 or -m32 option to specify the
intended memory model, LP64 (64-bits) or ILP32 (32-
bits) respectively. The -xarch flag no longer indi-
cates the memory model, except for compatibility with
previous releases, as indicated below.
Note: The compiler and linker will mark .o files and
executables that require a particular instruction set
architecture (ISA) so that the executable will not be
loaded at runtime if the running system does not sup-
port that particular ISA.
Code using _asm statements or inline templates (.il
files) that use architecture-specific instructions
might require compiling with the appropriate -xarch
values to avoid compilation errors.
If you compile and link in separate steps, make sure
you specify the same value for -xarch in both steps.
Values for all platforms:
Value Meaning
generic This option uses the instruction set common
to most processors.
generic64 Compile for good performance on most 64-bit
platforms. (Oracle Solaris only)
This option is equivalent to
-m64 -xarch=generic
and is provided for compatibility with ear-
lier releases. Use -m64 to specify 64-bit
compilation instead of -xarch=generic64
native Compile for good performance on this system
The compiler chooses the appropriate setting
for the current system processor it is run-
ning on.
native64 Compile for good performance on this system
(Oracle Solaris only)
This option is equivalent to
-m64 -xarch=native and is provided for compa-
tibility with earlier releases.
Values specific to SPARC platforms:
sparc Compile for the SPARC-V9 ISA.
Compile for the V9 ISA, but without the
Visual Instruction Set (VIS), and without
other implementation-specific ISA extensions.
This option enables the compiler to generate
code for good performance on the V9 ISA.
sparcvis Compile for the SPARC-V9 ISA plus VIS.
Compile for SPARC-V9 plus the Visual Instruc-
tion Set (VIS) version 1.0, and with
UltraSPARC extensions. This option enables
the compiler to generate code for good per-
formance on the UltraSPARC architecture.
sparcvis2 Compile for the SPARC-V9 ISA with UltraSPARC
III extensions.
Enables the compiler to generate object code
for the UltraSPARC architecture, plus the
Visual Instruction Set (VIS) version 2.0, and
with UltraSPARC III extensions.
sparcvis3 Compile for the SPARC-V9 ISA with UltraSPARC
III and VIS 3 extensions.
Enables the compiler to use instructions from
the SPARC-V9 instruction set, plus the
UltraSPARC extensions, including the Visual
Instruction Set (VIS) version 1.0, the
UltraSPARC-III extensions, including the
Visual Instruction Set (VIS) version 2.0, the
fused multiply-add instructions, and the
Visual Instruction Set (VIS) version 3.0
sparcfmaf Compile for the sparcfmaf version of the
SPARC-V9 ISA.
Enables the compiler to use instructions from
the SPARC-V9 instruction set, plus the
UltraSPARC extensions, including the Visual
Instruction Set (VIS) version 1.0, the
UltraSPARC-III extensions, including the
Visual Instruction Set (VIS) version 2.0, and
the SPARC64 VI extensions for floating-point
multiply-add.
Note that you must use -xarch=sparcfmaf in
conjunction with -fma=fused and some optimi-
zation level to get the compiler to attempt
to find opportunities to use the multiply-add
instructions automatically.
sparc4 Compile for the SPARC4 version of the SPARC-
V9 ISA.
Enables the compiler to use instructions from
the SPARC-V9 instruction set, plus the
UltraSPARC extensions, which includes VIS
1.0, the UltraSPARC-III extensions, which
includes VIS2.0, the fused floating-point
multiply-add instructions, VIS 3.0, and
SPARC4 instructions.
sparcima Compile for the sparcima version of the
SPARC-V9 ISA.
Enables the compiler to use instructions from
the SPARC-V9 instruction set, plus the
UltraSPARC extensions, including the Visual
Instruction Set (VIS) version 1.0, the
UltraSPARC-III extensions, including the
Visual Instruction Set (VIS) version 2.0, the
SPARC64 VI extensions for floating-point
multiply-add, and the SPARC64 VII extensions
for integer multiply-add.
v9 Is equivalent to -m64 -xarch=sparc
Legacy makefiles and scripts that use
-xarch=v9 to obtain the 64-bit memory model
need only use -m64.
v9a Is equivalent to -m64 -xarch=sparcvis and is
provided for compatibility with earlier
releases.
v9b Is equivalent to -m64 -xarch=sparcvis2 and
is provided for compatibility with earlier
releases.
Notes:
o Object binary files (.o) compiled with generic,
sparc, sparcvis2, sparcvis3, sparcfmaf, and sparcima
can be linked and can execute together but can only
run on a processor supporting all the instruction
sets linked.
For any particular choice, the generated executable
could run much more slowly on earlier architectures.
Also, although quad-precision floating-point instruc-
tions are available in many of these instruction set
architectures, the compiler does not use these
instructions in the code it generates.
Values specific to x86 platforms:
Value Meaning
pentium_pro
Limits the instruction set to the pentium_pro
architecture.
sse Adds the SSE instruction set to the
pentium_pro instruction set.
sse2 Supplements the pentium_pro and SSE instruc-
tion sets with the SSE2 instruction set.
sse3 Supplements the pentium_pro, SSE, and SSE2
instruction sets with the SSE3 instruction
set.
ssse3 Supplements the pentium_pro, SSE, SSE2, and
SSE3 instruction sets with the SSSE3 instruc-
tion set.
sse4_1 Supplements the pentium_pro, SSE, SSE2, SSE3,
and SSSE3 instruction sets with the SSE4.1
instruction set.
sse4_2 Supplements the pentium_pro, SSE, SSE2, SSE3,
SSSE3, and SSE4.1 instruction sets with the
SSE4.2 instruction set.
amdsse4a Uses the AMD SSE4a Instruction set.
amd64 Is equivalent to -m64 -xarch=sse2 (Oracle
Solaris only)
Legacy makefiles and scripts that use
-xarch=amd64 to obtain the 64-bit memory
model need only use -m64.
avx Adds the Advanced Vector Extensions to the
Intel x86 instruction set.
aes Adds the Advanced Encryption Standard
instruction set. Note that the compiler does
not generate AES instructions automatically
when -xarch=aes is specified unless the
source code includes .il inline code, _asm
statements, or assembler code that use AES
instructions, or references to AES intrinsic
functions.
pentium_proa
Adds the AMD extensions (3DNow!, 3DNow!
extensions, and MMX extensions) to the
pentium_pro architecture.
ssea Adds the AMD extensions (3DNow!, 3DNow!
extensions, and MMX extensions) to the 32-bit
SSE architecture.
sse2a Adds the AMD extensions (3DNow!, 3DNow!
extensions, and MMX extensions) to the SSE2
architecture.
amd64a Is equivalent to -m64 -xarch=sse2a (Oracle
Solaris only)
Notes: If any part of a program is compiled or
linked on an x86 platform with -m64, then all
parts of the program must be compiled with
one of these options as well.
For details on the various Intel instruction
set architectures (SSE, SSE2, SSE3, SSSE3,
and so on) refer to the Intel-64 and IA-32
Intel Architecture Software Developer's
Manual
Defaults:
If -xarch=isa is not specified, the defaults are:
-xarch=generic on SPARC platforms
-xarch=generic on x86/x64 platforms
Interactions:
Although this option can be used alone, it is part of
the expansion of the -xtarget option and can be used
to override the -xarch value that is set by a
specific -xtarget option.
For example, -xtarget=ultra4 expands to
-xarch=sparcvis2 -xcache=64/32/4:8192/128/2
-xchip=ultra4
Warnings:
If this option is used with optimization, the
appropriate choice can provide good performance of
the executable on the specified architecture. An
inappropriate choice, however, might result in seri-
ous degradation of performance or in in a binary pro-
gram that is not executable on all intended target
platforms.
-xautopar
Turns on automatic parallelization for multiple proces-
sors. Does dependence analysis (analyze loops for
inter- iteration data dependence) and loop restructur-
ing. If optimization is not at -xO3 or higher, optimi-
zation is raised to -xO3 and a warning is issued.
Note that -xautopar does not accept OpenMP paralleliza-
tion directives.
Avoid -xautopar if you do your own thread management.
To get faster execution, this option requires a multi-
ple processor system. On a single-processor system, the
resulting binary usually runs slower.
Use the OMP_NUM_THREADS environment variable to specify
the number of threads to use when running a program
automatically parallelized by the -xautopar compiler
option. If OMP_NUM_THREADS is not set, the default
number of threads used is 2. To use more threads, set
OMP_NUM_THREADS to a higher value. Set OMP_NUM_THREADS
to 1 to run with just one thread. In general, set
OMP_NUM_THREADS to the available number of virtual pro-
cessors on the running system, which can be determined
by using the Oracle Solaris psrinfo(1) command. See
the OpenMP API User's Guide for more information.
If you use -xautopar and compile and link in one step,
then linking automatically includes the microtasking
library and the threads-safe C runtime library. If you
use -xautopar and compile and link in separate steps,
then you must link with cc -xautopar as well. For a
complete list of all compiler options that must be
specified at both compile time and at link time, see
the C User's Guide.
-xbinopt={prepare|off}
(SPARC) This option is now obsolete and will be removed
in a future release of the compilers. See -xannotate.
Instructs the compiler to prepare the binary for later
optimizations, transformations and analysis (see
binopt(1)). This option may be used for building exe-
cutables or shared objects. This option must be used
with optimization level -xO1 or higher to be effective.
There is a modest increase in size of the binary when
built with this option.
If you compile in separate steps, -xbinopt must appear
on both compile and link steps:
example% cc -c -xO1 -xbinopt=prepare a.c b.c
example% cc -o myprog -xbinopt=prepare a.o
If some source code is not available for compilation,
this option may still be used to compile the remainder
of the code. It should then be used in the link step
that creates the final binary. In such a situation,
only the code compiled with this option can be optim-
ized, transformed or analyzed.
Compiling with -xbinopt=prepare and -g increases the
size of the executable by including debugging informa-
tion. The default is -xbinopt=off.
-xbuiltin[={%all|%default|%none}]
Use the -xbuiltin option to improve the optimization of
code that calls standard library functions. This option
lets the compiler substitute intrinsic functions or
inline system functions where profitable for perfor-
mance. See the er_src(1) man page to learn how to read
compiler commentary output to determine which functions
were substituted by the compiler.
With -xbuiltin=%all, substitutions can cause the set-
ting of errno to become unreliable. If your program
depends on the value of errno, avoid this option.
-xbuiltin=%default only inlines functions that do not
set errno. The value of errno is always correct at any
optimization level, and can be checked reliably. With
-xbuiltin=%default at -xO3 or lower, the compiler will
determine which calls are profitable to inline, and not
inline others.
The -xbuiltin=%none option turns off all substitutions
of library functions.
If you do not specify -xbuiltin, the default is
-xbuiltin=%default when compiling with an optimization
level -xO1 and higher, and -xbuiltin=%none at -xO0. If
you specify -xbuiltin without an argument, the default
is -xbuiltin=%all and the compiler substitutes intrin-
sics or inlines standard library functions much more
aggressively.
Compiling with -fast adds -xbuiltin=%all.
Note: The -xbuiltin option only inlines global func-
tions defined in system header files, never static
functions defined by the user. User code that attempts
to interpose on global functions may result in unde-
fined behavior.
-xCC When you specify -xc99=none and -xCC, the compiler
accepts the C++-style comments. In particular, the "//"
can be used to indicate the start of a comment.
-xc99[=o]
The -xc99 flag controls compiler recognition of the
implemented features from the C99 standard (ISO/IEC
9899:1999, Programming Language - C).
o can be a comma separated list comprised of the
following:
Value Meaning
[no_]lib Enable the 1999 C standard library
semantics of routines that appeared in
both the 1990 and 1999 C standard.
Optional no_ disables this feature.
all Turn on recognition of supported C99
language features and enable the 1999 C
standard library semantics of routines
that appear in both the 1990 and 1999 C
standard.
none Turn off recognition of C99 language
features, and do not enable the 1999 C
standard library semantics of routines
that appeared in both the 1990 and 1999
C standard.
If you do not specify -xc99, the compiler defaults to
-xc99=all,no_lib.
If you specify -xc99 without any values, the option is
set to -xc99=all.
-xcache=c
Define cache properties for use by optimizer.
c must be one of the following:
o generic
o native
o s1/l1/a1[/t1]
o s1/l1/a1[/t1]:s2/l2/a2[/t2]
o s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
The si, li, ai, and ti, are defined as follows:
si The size of the data cache at level i, in kilobytes
li The line size of the data cache at level i, in bytes
ai The associativity of the data cache at level i
ti The number of hardware threads sharing the cache at
level i The ti parameters are optional. A value of 1
is used if not present.
This option specifies the cache properties that the
optimizer can use. It does not guarantee that any
particular cache property is used.
Although this option can be used alone, it is part of
the expansion of the -xtarget option; its primary use
is to override a value supplied by the -xtarget option.
The -xcache values are:
generic
Define the cache properties for good performance
on most platforms. This is the default.
native
Define the cache properties for good performance
on this host platform.
s1/l1/a1[/t1]
Define level 1 cache properties.
s1/l1/a1[/t1]:s2/l2/a2[/t2]
Define levels 1 and 2 cache properties.
s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
Define levels 1, 2, and 3 cache properties.
-xchar=o
The option is provided solely for the purpose of easing
the migration of code from systems where the char type
is defined as unsigned. Unless you are migrating from
such a system, do not use this option. Only code that
relies on the sign of a char type needs to be rewritten
to explicitly specify signed or unsigned. You can sub-
stitute one of the following values for o:
o signed: Treat character constants and variables
declared as char as signed. This impacts the behavior
of compiled code, it does not affect the behavior of
library routines.
o s: equivalent to signed.
o unsigned: Treat character constants and variables
declared as char as unsigned. This impacts the
behavior of compiled code, it does not affect the
behavior of library routines.
o u: equivalent to unsigned.
If you do not specify -xchar, the compiler assumes
-xchar=s. If you specify -xchar, but do not specify a
value, the compiler assumes -xchar=s.
The -xchar option changes the range of values for the
type char only for code compiled with -xchar. This
option does not change the range of values for type
char in any system routine or header file. In particu-
lar, the value of CHAR_MAX and CHAR_MIN, as defined by
limits.h, do not change when this option is specified.
Therefore, CHAR_MAX and CHAR_MIN no longer represent
the range of values encodable in a plain char.
If you use -xchar, be particularly careful when you
compare a char against a predefined system macro
because the value in the macro may be signed. This is
most common for any routine that returns an error code
which is accessed through a macro. Error codes are
typically negative values so when you compare a char
against the value from such a macro, the result is
always false. A negative number can never be equal to
any value of an unsigned type.
It is strongly recommended that you never use -xchar to
compile routines for any interface exported through a
library. The Oracle Solaris ABI specifies type char as
signed, and system libraries behave accordingly. The
effect of making char unsigned has not been extensively
tested with system libraries. Instead of using this
option, modify your code that it does not depend on
whether type char is signed or unsigned. The sign of
type char varies among compilers and operating systems.
-xchar_byte_order=o
Produce an integer constant by placing the characters
of a multi-character character-constant in the speci-
fied byte order. You can substitute one of the follow-
ing values for o:
o low: place the characters of a multi-character
character-constant in low-to-high byte order.
o high: place the characters of a multi-character
character-constant in high-to-low byte order.
o default: place the characters of a multi-character
character-constant in an order determined by the com-
pilation mode -X[a|c|s|t].
-xcheck[=n]
Performs a runtime check for stack overflow of the main
thread in a singly-threaded program as well as slave-
thread stacks in a multithreaded program. If a stack
overflow is detected, a SIGSEGV is generated. If your
application needs to handle a SIGSEGV caused by a stack
overflow differently than it handles other address-
space violations, see sigaltstack(2).
n must be one of the following values.
Value Meaning
%all Perform all -xcheck checks.
%none Do not perform any of the -xcheck
checks.
stkovf Enables a runtime check for stack over-
flow.
no%stkovf Turns off stack-overflow checking.
init_local Initialize local variables. See the C
User's Guide description of this option
for a list of the predefined values used
by the compiler to initialize variables.
no%init_local Do not initialize local variables.
If you do not specify -xcheck, the compiler defaults to
-xcheck=%none. If you specify -xcheck without any argu-
ments, the compiler defaults to -xcheck=%all.
The -xcheck option does not accumulate on the command
line. The compiler sets the flag in accordance with the
last occurrence of the command.
-xchip=c
Specifies the target processor for use by the optim-
izer.
c must be one of the values listed below.
Although this option can be used alone, it is part of
the expansion of the -xtarget option; its primary use
is to override a value supplied by the -xtarget option.
This option specifies timing properties by specifying
the target processor.
Some effects are:
o The ordering of instructions, that is, scheduling
o The way the compiler uses branches
o The instructions to use in cases where semantically
equivalent alternatives are available
The -xchip values for SPARC platforms are:
generic
Set the parameters for the best performance over
most SPARC platform architectures. This is the
default.
native Set the parameters for the best performance on
the host environment.
old Uses the timing properties of the pre-SuperSPARC
processors.
sparc64vi
Optimize for the SPARC64 VI processor.
sparc64vii
Optimize for the SPARC64 VII processor.
ultra Optimize for the UltraSPARC(TM) processor.
ultra2 Optimize for the UltraSPARC II processor.
ultra2e
Optimize for the UltraSPARC IIe processor.
ultra2i
Optimize for the UltraSPARC IIi processor.
ultra3 Optimize for the UltraSPARC III processor.
ultra3cu
Optimize for the UltraSPARC IIIcu processor.
ultra3i
Optimize for the UltraSPARC IIIi processor.
ultra4 Optimize for the UltraSPARC IV processor.
ultra4plus
Optimize for the UltraSPARC IVplus processor.
ultraT1
Optimize for the UltraSPARC T1 processor.
ultraT2
Optimize for the UltraSPARC T2 processor.
ultraT2plus
Optimize for the UltraSPARC T2+ processor.
T3 Optimize for the SPARC T3 processor.
T4 Optimize for the SPARC T4 processor.
sparc64viiplus
Optimize for the SPARC64 VII plus processor.
The -xchip values for x86 platforms are:
generic
Optimize for most x86 platforms.
native Optimize for this host processor.
core2 Optimize for the Intel Core2 processor.
nehalem
Optimize for the Intel Nehalem processor.
opteron
Optimize for the AMD Opteron processor.
penryn Optimize for the Intel Penryn processor.
pentium
Optimize for the Intel Pentium architecture.
pentium_pro
Optimize for the Intel Pentium Pro architecture.
pentium3
Optimize for the Intel Pentium 3 style processor
pentium4
Optimize for the Intel Pentium 4 style processor
sandybridge
Optimize for the Intel Sandy Bridge processor.
westmere
Optimize for the Intel Westmere processor.
amdfam10
Optimize for the AMD FAM10 processor
-xcode=v
(SPARC) Specify code address space
Note: It is highly recommended that you build shared
objects by specifying -xcode=pic13 or -xcode=pic32. It
is possible to build workable shared objects with -m64
-xcode=abs64, but these will be inefficient. Shared
objects built with -m64 xarch=v9 -xcode=abs32 or -m64
-xcode=abs44 will not work.
The values for -xcode are:
abs32 This is the default for 32-bit systems. Gen-
erates 32-bit absolute addresses.
Code + data + bss size is limited to 2**32
bytes.
abs44 This is the default for 64-bit systems. Gen-
erates 44-bit absolute addresses.
Code + data + bss size is limited to 2**44
bytes. Available only on 64-bit architectures.
abs64 Generates 64-bit absolute addresses.
Available only on 64-bit architectures.
pic13 Generates position-independent code for use in
shared libraries (small model).
Equivalent to -Kpic. Permits references to at
most 2**11 unique external symbols on 32-bit
architectures, 2**10 on 64-bit.
pic32 Generates position-independent code for use in
shared libraries (large model).
Equivalent to -KPIC. Permits references to at
most 2**30 unique external symbols on 32-bit
architectures, 2**29 on 64-bit.
The default is -xcode=abs32 for 32-bit architectures.
The default is -xcode=abs44 for 64-bit architectures.
When building shared dynamic libraries, the default
-xcode value of abs44 (not abs32) will not work with
64-bit architectures. Specify -xcode=pic13 or
-xcode=pic32 instead.
To determine whether to use -xcode=pic13 or
-xcode=pic32, check the size of the Global Offset Table
(GOT) by using elfdump -c (see the elfdump(1) man page
for more information) and to look for the section
header, sh_name: .got. The sh_size value is the size of
the GOT. If the GOT is less than 8,192 bytes, specify
-xcode=pic13, otherwise specify -xcode=pic32.
In general, use the following guidelines to determine
how you should use -xcode:
o If you are building an executable you should not use
-xcode=pic13 or -xcode=pic32.
o If you are building an archive library only for
linking into executables you should not use
-xcode=pic13 or -xcode=pic32.
o If you are building a shared library, start with
-xcode=pic13 and once the GOT size exceeds 8,192 bytes,
use -xcode=pic32.
o If you are building an archive library for linking
into shared libraries you should just use -xcode=pic32.
-xcsi
This option allows the C compiler to accept source code
written in locales that do not conform to the ISO C
source character code requirements. These locales
include ja_JP.PCK.
Note: The compiler translation phases required to han-
dle such locales may result in significantly longer
compile times. You should only use this option when
you compile source files that contain source characters
from one of these locales.
The compiler does not recognize source code written in
locales that do not conform to the ISO C source charac-
ter code requirements unless you specify -xcsi.
-xdebugformat=[stabs|dwarf]
Specify -xdebugformat=dwarf if you maintain software
which reads debugging information in the dwarf format.
This option causes the compiler to generate debugging
information by using the dwarf standard format and is
the default
-xdebugformat=stabs generates debugging information
using the stabs standard format.
If you do not specify -xdebugformat, the compiler
assumes -xdebugformat=dwarf. This option requires an
argument.
This option affects the format of the data that is
recorded with the -g option. Some small amount of
debugging information is recorded even without -g, and
the format of that information is also controlled with
this option. So -xdebugformat has a an effect even
when -g is not used.
The dbx and Performance Analyzer software understand
both stabs and dwarf format so using this option does
not have any effect on the functionality of either
tool.
See also the dumpstabs(1) and dwarfdump(1) man pages
for more information.
-xdepend[=[yes|no] ]
Analyzes loops for inter-iteration data dependencies
and performs loop restructuring. Loop restructuring
includes loop interchange, loop fusion, scalar replace-
ment, and elimination of "dead" array assignments.
On SPARC, -xdepend is turned on for all optimization
levels -xO3 and above, and is off for lower opt levels.
Also, an explicit setting of -xdepend overrides any
implicit setting.
On x86, if optimization is not at -xO3 or higher, the
compiler raises the optimization to -xO3 and issues a
warning.
If you do not specify -xdepend, the default is
-xdepend=no which means the compiler does not analyze
loops for data dependencies. If you specify -xdepend
but do not specify an argument, the compiler sets the
option to -xdepend=yes which means the compiler
analyzes loops for data dependencies.
Dependency analysis is included in -xautopar. The
dependency analysis is done at compile time.
Dependency analysis may help on single-processor sys-
tems. However, if you try -xdepend on single-processor
systems, you should not also specify -xautopar , other-
wise the -xdepend optimization is done for multiple-
processor systems.
See Also: -xprefetch_auto_type
-xdryrun
This option is a macro for -###.
-xdumpmacros[=value[,value...]]
Use this option when you want to see how macros are
behaving in your program. This option provides informa-
tion such as macro defines, undefines, and instances of
usage. It prints output to the standard error (stderr),
based on the order macros are processed. The -xdumpmac-
ros option is in effect until the end of the file or
until it is overridden by the dumpmacros or
end_dumpmacros pragma.
Values:
The prefix no% applied to a suboption disables that
suboption.
Value Meaning
[no%]defs Print all macro defines
[no%]undefs Print all macro undefines
[no%]use Print information about macros used
[no%]loc Print location (path name and line
number) also for defs, undefs, and use
[no%]conds Print use information for macros used
in conditional directives
[no%]sys Print all macros defines, undefines,
and use information for macros in system
header files
%all Sets the option to
-xdumpmacros=defs,undefs,use,loc,conds,sys.
A good way to use this argument is in
conjunction with the [no%] form of the
other arguments. For example,
-xdumpmacros=%all,no%sys would exclude
system header macros from the output but
still provide information for all other
macros.
%none Do not print any macro information
The option values accumulate so specifying
-xdumpmacros=sys -xdumpmacros=undefs has the same
effect as -xdumpmacros=undefs,sys.
Note: The sub-options loc, conds, and sys are qualif-
iers for defs, undefs and use options. By themselves,
loc, conds, and sys have no effect. For example,
-xdumpmacros=loc,conds,sys has no effect.
Defaults:
If you specify -xdumpmacros without any arguments, it
means -xdumpmacros=defs,undefs,sys. If you do not
specify -xdumpmacros, it defaults to
-xdumpmacros=%none.
-xe Performs only syntax and semantic checking on the
source file, but does not produce any object or execut-
able file.
-xF[=v]
The -xF option enables the optimal reordering of func-
tions and variables by the linker.
This option instructs the compiler to place functions
and/or data variables into separate section fragments,
which enables the linker, using directions in a mapfile
specified by the linker's -M option, to reorder these
sections to optimize program performance. Generally,
this optimization is only effective when page fault
time constitutes a significant fraction of program run
time.
Reordering functions and variables for optimal perfor-
mance requires the following operations:
1. Compiling and linking with -xF.
2. Following the instructions in the Performance
Analyzer manual regarding how to generate a mapfile for
functions or following the instructions in the Linker
and Libraries Guide regarding how to generate a mapfile
for data.
3. Relinking with the new mapfile by using the linker's
-M option.
4. Re-executing under the Analyzer to verify improve-
ment.
v can be one of the following values. Prefix no% dis-
ables the suboption.
Value Meaning
[no%]func Fragment functions into separate sec-
tions.
[no%]gbldata Fragment global data (variables with
external linkage) into separate sec-
tions.
%all Fragment functions and global data.
%none Fragment nothing.
If you do not specify -xF, the default is -xF=%none. If
you specify -xF without any arguments, the default is
-xF=%none,func.
See Also:
analyzer(1), ld(1)
-xhelp=flags
displays a summary of the compiler options.
-xhwcprof[={enable|disable}]
(SPARC) Use the -xhwcprof option to enable compiler
support for dataspace profiling.
When -xhwcprof is enabled, the compiler generates
information that helps tools associate profiled load
and store instructions with the data-types and struc-
ture members (in conjunction with symbolic information
produced with -g) to which they refer. It associates
profile data with the data space of the target, rather
than the instruction space, and provides insight into
behavior that is not easily obtained from only instruc-
tion profiling.
You can compile a specified set of object files with
-xhwcprof however, -xhwcprof is most useful when
applied to all object files in the application. This
will provide coverage to identify and correlate all
memory references distributed in the application's
object files.
If you are compiling and linking in separate steps, use
-xhwcprof at link time as well. Future extensions to
-xhwcprof may require its use at link time. For a com-
plete list of compiler options that must be specified
at both compile time and at link time, see the C User's
Guide.
An instance of -xhwcprof=enable or -xhwcprof=disable
overrides all previous instances of -xhwcprof in the
same command line.
-xhwcprof is disabled by default. Specifying -xhwcprof
without any arguments is the equivalent to
-xhwcprof=enable.
-xhwcprof requires that optimization be turned on and
that the debug data format be set to dwarf
(-xdebugformat=dwarf).
The combination of -xhwcprof and -g increases compiler
temporary file storage requirements by more than the
sum of the increases due to -xhwcprof and -g specified
alone.
The following command compiles example.c and specifies
support for hardware counter profiling and symbolic
analysis of data types and structure members using
DWARF symbols:
example% cc -c -O -xhwcprof -g -xdebugformat=dwarf
example.c
For more information on hardware counter-based profil-
ing, see the Performance Analyzer manual.
-xinline[=v[,v]...]
v can be [{%auto,func_name,no%func_name}].
-xinline tries to inline only those functions specified
in the list. The list is comprised of either a comma-
separated list of function names, or a comma separated
list of no%func_name values, or the value %auto. If you
specify %nofunc_name, the compiler is not to inline the
named function. If you specify %auto, the compiler is
to attempt to automatically inline all functions in the
source files.
The list of values accumulates from left to right. So
for a specification of -xinline=%auto,no%foo the com-
piler attempts to inline all functions except foo. For
a specification of -xinline=%bar,%myfunc,no%bar the
compiler only tries to inline myfunc.
When you compile with optimization set at -xO4 or
above, the compiler normally tries to inline all refer-
ences to functions defined in the source file. You can
restrict the set of functions the compiler attempts to
inline by specifying the -xinline option. If you
specify only -xinline=, that is you do not name any
functions or auto, this indicates that none of the rou-
tines in the source files are to be inlined. If you
specify a list of func_name and no%func_name without
specifying %auto, the compiler only attempts to inline
those functions specified in the list. If %auto is
specified in the list of values with the -xinline
option at optimization level set at -xO4 or above, the
compiler attempts to inline all functions that are not
explicitly excluded by no%func_name.
A function is inlined if any of the following apply:
o Optimization is set at -xO3 or higher
o Inlining the funciton is judged to be profitable and
safe
o The source for the function is in the file being
compiled or the function is in a file that was compiled
with -xipo[=1|2].
If you specify multiple -xinline options on the command
line, they do not accumulate. The last -xinline on the
command line specifies what functions the compiler
attempts to inline.
See also -xldscope.
-xinstrument=[no%]datarace]
Specify this option to compile and instrument your pro-
gram for analysis by the Thread Analyzer. For more
information on the Thread Analyzer, see tha(1) for
details.
You can then use the Performance Analzyer to run the
instrumented program with collect -r races to create a
data-race-detection experiment. You can run the instru-
mented code standalone but it runs more slowly.
You can specify -xinstrument=no%datarace to turn off
preparation of source code for the thread analyzer.
This is the default.
It is illegal to specify -xinstrument without an argu-
ment.
If you compile and link in seperate steps, you must
specify -xinstrument=datarace in both the compilation
and linking steps.
This option defines the preprocessor token
__THA_NOTIFY. You can specify #ifdef __THA_NOTIFY to
guard calls to libtha(3) routines.
This option also sets -g.
-xipo[=n]
The compiler performs partial-program optimizations by
invoking an interprocedural analysis pass. It performs
optimizations across all object files in the link step,
and is not limited to just the source files on the com-
pile command. However, whole-program optimizations
performed with -xipo do not include assembly (.s)
source files.
You must specify -xipo both at compile time and at link
time. For a complete list of compiler options that
must be specified at both compile time and at link
time, see the C User's Guide.
Analysis and optimization is limited to the object
files compiled with -xipo, and does not extend to
object files or libraries. -xipo is multiphased, so
you need to specify -xipo for each step if you compile
and link in separate steps.
The -xipo option generates significantly larger object
files due to the additional information needed to per-
form optimizations across files. However, this addi-
tional information does not become part of the final
executable binary file. Any increase in the size of the
executable program is due to the additional optimiza-
tions performed. The object files created in the compi-
lation steps have additional analysis information com-
piled within them to permit crossfile optimizations to
take place at the link step.
n is 0, 1, or 2. -xipo without any arguments is
equivalent to -xipo=1. -xipo=0 is the default setting
and turns off -xipo.
With -xipo=1, the compiler performs inlining across all
source files. At -xipo=2, the compiler performs inter-
procedural aliasing analysis as well as optimization of
memory allocation and layout to improve cache perfor-
mance.
Here are some important considerations for -xipo:
o It requires an optimization level of at least -xO4.
o Objects that are compiled without -xipo can be linked
freely with objects that are compiled with -xipo.
In this example, compilation and linking occur in a
single step:
cc -xipo -xO4 -o prog part1.c part2.c part3.c
In this example, compilation and linking occur in
separate steps:
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
The object files created in the compilation steps have
additional analysis information compiled within them to
permit crossfile optimizations to take place at the
link step.
A restriction is that libraries, even if compiled with
-xipo do not participate in crossfile interprocedural
analysis, as shown in this example:
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
Here interprocedural optimizations are performed
between one.c, two.c and three.c, and between main.c
and four.c, but not between main.c or four.c and the
routines on mylib.a. (The first compilation may gen-
erate warnings about undefined symbols, but the inter-
procedural optimizations are performed because it is a
compile and link step.)
When Not To Use -xipo=2 Interprocedural Analysis
The compiler tries to perform whole-program analysis
and optimizations as it works with the set of object
files in the link step. The compiler makes the follow-
ing two assumptions for any function (or subroutine)
foo() defined in this set of object files:
(1) foo() is not called explicitly by another routine
that is defined outside this set of object files at
runtime.
(2) The calls to foo() from any routine in the set of
object files are not interposed upon by a different
version of foo() defined outside this set of object
files.
Do not compile with -xipo=2 if assumption (1) is not
true for the given application.
Do not compile with either -xipo=1 or -xipo=2 if
assumption (2) is not true.
As an example, consider interposing on the function
malloc() with your own version and compiling with
-xipo=2. Consequently, all the functions in any library
that reference malloc() that are linked with your code
have to be compiled with -xipo=2 also and their object
files need to participate in the link step. Since this
might not be possible for system libraries, do not com-
pile your version of malloc() with -xipo=2.
As another example, suppose that you build a shared
library with two external calls, foo() and bar() inside
two different source files. Furthermore, suppose that
bar() calls foo(). If there is a possibility that foo()
could be interposed at runtime, then do not compile the
source file for foo() or for bar() with -xipo=1 or
-xipo=2. Otherwise, foo() could be inlined into bar(),
which could cause incorrect results.
See also -xjobs and -xipo_archive
-xipo_archive[=a]
The -xipo_archive option enables the compiler to optim-
ize object files that are passed to the linker with
object files that were compiled with -xipo and that
reside in the archive library (.a) before producing an
executable. Any object files contained in the library
that were optimized during the compilation are replaced
with their optimized version.
a is one of the following:
writeback
The compiler optimizes object files passed to the
linker with object files compiled with -xipo that
reside in the archive library (.a) before producing an
executable. Any object files contained in the library
that were optimized during the compilation are
replaced with an optimized version.
For parallel links that use a common set of archive
libraries,each link should create its own copy of
archive libraries to be optimized before linking.
readonly
The compiler optimizes object files passed to the
linker with object files compiled with -xipo that
reside in the archive library (.a) before producing an
executable.
The option -xipo_archive=readonly enables cross-module
inlining and interprocedural data flow analysis of
object files in an archive library specified at link
time. However, it does not enable cross-module optim-
ization of the archive library's code except for code
that has been inserted into other modules by cross
module inlining.
To apply cross-module optimization to code within an
archive library, -xipo_archive=writeback is required.
Note that doing so modifies the contents of the
archive library from which the code was extracted.
none
Default. There is no processing of archive files. The
compiler does not apply cross-module inlining or other
cross-module optimizations to object files compiled
using -xipo and extracted from an archive library at
link time. To do that, both -xipo and either
-xipo_archive=readonly or -xipo_archive=writeback must
be specified at link time.
It is illegal to specify -xipo_archive without a flag.
-xivdep[=p]
Disable or set interpretation of ivdep pragmas
The ivdep pragmas tell a compiler to ignore some or all
loop-carried dependences on array references that it
finds in a loop for purposes of optimization. This
enables a compiler to perform various loop optimiza-
tions such as microvectorization, distribution,
software pipelining, etc., which would not be otherwise
possible. It is used in cases where the user knows
either that the dependences do not matter or that they
never occur in practice.
The interpretation of #pragma ivdep directives depend
upon the value of the -xivdep option.
The following values for p are interpreted as follows:
loop - ignore assumed loop-carried vector dependences
loop_any - ignore all loop-carried vector dependences
back - ignore assumed backward loop-carried vector
dependences
back_any - ignore all backward loop-carried vector
dependences
none - do not ignore any dependences (disables ivdep
pragmas)
These interpretations are provided for compatibility
with other vendor's interpretations of the ivdep
pragma.
-xjobs=n
Compile with multiple processors.
Specify the -xjobs option to set how many processes the
compiler creates to complete its work. This option can
reduce the build time on a multi-cpu machine.
Currently, -xjobs works only with the -xipo option.
When you specify -xjobs=n, the interprocedural optim-
izer uses n as the maximum number of code generator
instances it can invoke to compile different files.
Generally, a safe value for n is 1.5 multiplied by the
number of available processors. Using a value that is
many times the number of available processors can
degrade performance because of context switching over-
heads among spawned jobs. Also, using a very high
number can exhaust the limits of system resources such
as swap space.
You must always specify -xjobs with a value. Otherwise
an error diagnostic is issued and compilation aborts.
Multiple instances of -xjobs on the command line over-
ride each other until the rightmost instance is
reached.
The following example compiles more quickly on a system
with two processors than the same command without the
-xjobs option.
example% cc -xipo -xO4 -xjobs=3 t1.c t2.c t3.c
-xkeepframe[=[%all,%none,function_name,no%function_name]]
Prohibit stack related optimizations for the named
functions.
%all - prohibit stack related optimizations for all the
code
%none - allow stack related optimizations for all the
code
If not specified on the command line, the compiler
assumes -xkeepframe=%none
If specified on the command line without a value, the
compiler assumes -xkeepframe=%all
This option is accumulative and can appear on the com-
mand line multiple times. For example,
-xkeepframe=%all -xkeepframe=no%func1 indicates that
the stack frame should be kept for all functions except
func1. Also, -xkeepframe overrides -xregs=frameptr.
For example, -xkeepframe=%all -xregs=frameptr indicates
that the stack should be kept for all functions, but
the optimizations for -xregs=frameptr would not be
done.
-xldscope={v}
Changes the default linker scoping for the definition
of extern symbols. Changing the default can result in
faster and safer shared libraries because the implemen-
tation will be better hidden.
v must be one of the following:
Value Meaning
global Global linker scoping is the least res-
trictive linker scoping. All references
to the symbol bind to the definition in
the first dynamic module that defines
the symbol. This linker scoping is the
current linker scoping for extern sym-
bols.
symbolic Symbolic linker scoping and is more res-
trictive than global linker scoping. All
references to the symbol from within the
dynamic module being linked bind to the
symbol defined within the module. Out-
side of the module, the symbol appears
as though it were global. This linker
scoping corresponds to the linker option
-Bsymbolic.
hidden Hidden linker scoping is more restric-
tive than symbolic and global linker
scoping. All references within a dynamic
module bind to a definition within that
module. The symbol will not be visible
outside of the module.
If you do not specify -xldscope, the compiler assumes
-xldscope=global. It is not legal to specify -xldscope
without any arguments. The compiler issues an error if
you specify -xldscope without an argument. Multiple
instances of this option on the command line override
each other until the rightmost instance is reached.
If you intend to allow a client to override a function
in a library, you must be sure that the function is not
generated inline during the library build. The compiler
inlines a function if you specify the function name
with -xinline, if you use #pragma inline, if you com-
pile at -xO4 or higher in which case inlining can hap-
pen automatically, if you use the inline specifier, or
if you are using cross-file optimization.
For example, suppose library ABC has a default alloca-
tor function that can be used by library clients, and
is also used internally in the library:
void* ABC_allocator(size_t size) { return malloc(size);
}
If you build the library at -xO4 or higher, the com-
piler inlines calls to ABC_allocator that occur in
library components. If a library client wants to
replace ABC_allocator with a customized version, the
replacement will not occur in library components that
called ABC_allocator. The final program will include
different versions of the function.
Library functions declared with the __hidden or __sym-
bolic specifiers can be generated inline when building
the library. They are not supposed to be overridden by
clients. For more information, see chapter 2 "C-
Compiler Implementation Specific Information" in the C
User's Guide.
Library functions declared with the __global specifier,
should not be declared inline, and should be protected
from inlining by use of the -xinline compiler option.
See Also
-xinline, -xO, ld(1).
-xlibmieee
Forces IEEE 754 style return values for math routines
in exceptional cases. In such cases, no exception mes-
sage will be printed, and errno should not be relied
on.
-xlibmil
Inlines some library routines for faster execution.
This option selects the appropriate assembly language
inline templates for the floating-point option and
platform for your system. -xlibmil inlines a function
regardless of any specification of the function as part
of the -xinline flag.
However, these substitutions can cause the setting of
errno to become unreliable. If your program depends on
the value of errno, avoid this option. See the NOTES
section at the end of this man page for more informa-
tion.
-xlibmopt
Enables the compiler to use a library of optimized math
routines. You must use default rounding mode by speci-
fying -fround=nearest when you use this option.
The math routine library is optimized for performance
and usually generates faster code. The results may be
slightly different from those produced by the normal
math library. If so, they usually differ in the last
bit.
However, these substitutions can cause the setting of
errno to become unreliable. If your program depends on
the value of errno, avoid this option. See the NOTES
section at the end of this man page for more informa-
tion.
The order on the command line for this library option
is not significant.
Interactions:
This option is implied by the -fast option.
See also:
-fast
-xnolibmopt
-xlic_lib=sunperf
(Obsolete) Use -library=sunperf to link with the Sun
Performance Library.
-xlicinfo
This option is silently ignored by the compiler.
-xlinkopt[=level]
(SPARC) Instructs the compiler to perform link-time
optimizations on relocatable object files.
The post-optimizer performs a number of advanced per-
formance optimizations on the binary object code at
link-time. The value level sets the level of optimiza-
tions performed, and must be 0, 1, or 2.
The optimization levels are:
0 The post-optimizer is disabled. (This is the
default.)
1 Perform optimizations based on control flow
analysis, including instruction cache coloring
and branch optimizations, at link time.
2 Perform additional data flow analysis, includ-
ing dead-code elimination and address computa-
tion simplification, at link time.
Specifying -xlinkopt without the level parameter
implies -xlinkopt=1.
These optimizations are performed at link time by
analyzing the object binary code. The object files are
not rewritten but the resulting executable code may
differ from the original object codes.
This option is most effective when you use it to com-
pile the whole program, and with profile feedback.
If you compile in separate steps, -xlinkopt must appear
on both compile and link steps:
example% cc -c -xlinkopt a.c b.c
example% cc -o myprog -xlinkopt=2 a.o
For a complete list of compiler options that must be
specified at both compile time and at link time, see
the C User's Guide.
Note that the level parameter is only used when the
compiler is linking. In the example above, the post-
optimization level used is 2 even though the object
binaries were compiled with an implied level of 1.
Do not use the -zcombreloc linker option when you com-
pile with -xlinkopt.
You must use -xlinkopt on at least some of the compila-
tion commands for -xlinkopt to be useful at link time.
The optimizer can still perform some limited optimiza-
tions on object binaries not compiled with -xlinkopt.
-xlinkopt optimizes code coming from static libraries
that appear on the compiler command line, but it skips
and does not optimize code coming from shared (dynamic)
libraries that appear on the command line. You can also
use -xlinkopt when you build shared libraries (compil-
ing with -G ).
The link-time post-optimizer is most effective when you
use it with run-time profile feedback. Profiling
reveals the most and least used parts of the code and
directs the optimizer to focus its effort accordingly.
This is particularly important with large applications
where optimal placement of code performed at link time
can reduce instruction cache misses. Typically, this
would be compiled as follows:
example% cc -o progt -xO5 -xprofile=collect:profdir file.c
example% progt
example% cc -o prog -xO5 -xprofile=use:profdir -xlinkopt file.c
For details on using profile feedback, see -xprofile.
Note that compiling with this option increases link
time slightly. Object file sizes also increase, but
the size of the executable remains the same. Compiling
with -xlinkopt and -g increases the size of the excut-
able by including debugging information.
-xloopinfo
Shows which loops are parallelized and which are not.
This option is normally for use with the -xautopar
option.
-xM Runs only the preprocessor on the named C programs,
requesting that it generate makefile dependencies and
send the result to the standard output (see make (1)
for details about makefiles and dependencies).
-xM1 Same as -xM except that -xM1 is not supported in -Xs
mode nor does -xM1 report dependencies for /usr/include
header files. For example:
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
Compiling with -xM1 does not report header file dependencies:
example% cc -xM1 hello.c
hello.o: hello.c
-xMD Generates makefile dependencies like -xM but compila-
tion continues. -xMD generates an output file for the
makefile-dependency information derived from the -o
output filename, if specified, or the input source
filename, replacing (or adding) the filename suffix
with .d . If you specify -xMD and -xMF, the preproces-
sor writes all makefile dependency information to the
file specified with -xMF. Compiling with -xMD -xMF or
-xMD -o filename with more than one source file is not
allowed and generates an error. The dependency file is
overwritten if it already exists.
-xMF filename
Use this option to specify a file for the makefile-
dependency output. There is no way to specify indivi-
dual filenames for multiple input files with -xMF on
one command line. Compiling with -xMD -xMF or -xMMD
-xMF with more than one source file is not allowed and
generates an error. The dependency file is overwritten
if it already exists.
-xMMD
Use this option to generate makefile dependencies
excluding system header files. This is the same func-
tionality as -xM1, but compilation continues. -xMMD
generates an output file for the makefile-dependency
information derived from the -o output filename, if
specified, or the input source filename, replacing (or
adding) the filename suffix with .d . If you specify
-xMF, the compiler uses the filename you provide
instead. Compiling with -xMMD -xMF or -xMMD -o
filename with more than one source file is not allowed
and generates an error. The dependency file is
overwritten if it already exists.
-xMerge
Directs cc to merge the data segment with the text seg-
ment. Data initialized in the object file produced by
this compilation is read-only and (unless linked with
ld -N) is shared between processes.
-xMerge -ztext -xprofile=collect should not be used
together. While -xMerge forces statically initialized
data into read-only storage, -ztext prohibits
position-dependent symbol relocations in read-only
storage, and -xprofile=collect generates statically
initialized, position-dependent symbol relocations in
writable storage.
-xmaxopt[=v]
This command limits the level of pragma opt to the
level specified. The default value is -xmaxopt=off
which causes pragma opt to be ignored. If you specify
-xmaxopt without supplying an argument, that is the
equivalent of specifying -xmaxopt=5.
If you specify both -xO and -xmaxopt, the optimization
level set with -xO must not exceed the -xmaxopt value.
-xmemalign=ab
(SPARC) Use the -xmemalign option to control the
assumptions the compiler makes about the alignment of
data. By controlling the code generated for potentially
misaligned memory accesses and by controlling program
behavior in the event of a misaligned access, you can
more easily port your code to SPARC.
Specify the maximum assumed memory alignment and
behavior of misaligned data accesses. There must be a
value for both a (alignment) and b (behavior). a speci-
fies the maximum assumed memory alignment and b speci-
fies the behavior for misaligned memory accesses.
For memory accesses where the alignment is determinable
at compile time, the compiler generates the appropriate
load/store instruction sequence for that alignment of
data.
For memory accesses where the alignment cannot be
determined at compile time, the compiler must assume an
alignment to generate the needed load/store sequence.
For memory accesses where the alignment is determinable
at compile time, the compiler generates the appropriate
load/store instruction sequence for that alignment of
data.
For memory accesses where the alignment cannot be
determined at compile time, the compiler must assume an
alignment to generate the needed load/store sequence.
If actual data alignment at runtime is less than the
specified alignment, the misaligned access attempt (a
memory read or write) generates a trap. The two possi-
ble responses to the trap are as follows:
o The OS converts the trap to a SIGBUS signal. If the
program does not catch the signal, the program aborts.
Even if the program catches the signal, the misaligned
access attempt will not have succeeded.
o The OS handles the trap by interpreting the
misaligned access and returning control to the program
as if the access had succeeded normally.
Values
Accepted values for a are:
1 Assume at most 1 byte alignment.
2 Assume at most 2 byte alignment.
4 Assume at most 4 byte alignment.
8 Assume at most 8 byte alignment.
16 Assume at most 16 byte alignment.
Accepted values for b are:
i Interpret access and continue execution.
s Raise signal SIGBUS.
f For 64-bit SPARC programs (-m64) only. Raise
signal SIGBUS for alignments less than or
equal to 4, otherwise interpret access and
continue execution. For 32-bit programs, the
f flag is equivalent to i.
You must also specify -xmemalign whenever you want to
link to an object file that was compiled with the value
of b set to either i or f. For a complete list of com-
piler options that must be specified at both compile
time and at link time, see the C User's Guide.
Defaults
The default for 64-bit SPARC programs (-m64) is
-xmemalign=8s.
The default for 32-bit SPARC programs (-m32) is
-xmemalign=8i.
If you do specify -xmemalign but do not provide a
value, the default is -xmemalign=1i for all platforms.
-xmodel=[a]
(x86) The -xmodel option determines the data address
model for shared objects on the Oracle Solaris x64
platforms and should only be specified for the compila-
tion of such objects.
This option is valid only when -m64 is also specified
on 64-bit enabled x64 processors.
a is one of the following:
small
This option generates code for the small model in
which the virtual address of code executed is
known at link time and all symbols are known to be
located in the virtual addresses in the range from
0 to 2^31 - 2^24 - 1.
kernel
Generates code for the kernel model in which all
symbols are defined to be in the range from 2^64 -
2^31 to 2^64 - 2^24.
medium
Generates code for the medium model in which no
assumptions are made about the range of symbolic
references to data sections. Size and address of
the text section have the same limits as the small
code model. Applications with large amounts of
static data might require -xmodel=medium when com-
piling with -m64.
This option is not cumulative so the compiler sets the
model value according to the rightmost instance of
-xmodel on the command-line.
If you do not specify -xmodel, the compiler assumes
-xmodel=small. Specifying -xmodel without an argument
is an error.
It is not necessary to compile all translation units
with this option. You can compile select files as long
as you ensure the object you are accessing is within
reach.
Be aware that not all Linux system support the medium
model.
-xnolib
Does not link any libraries by default; that is, no -l
options are passed to the linker ld. Normally, the cc
driver passes -lc to ld.
When you use -xnolib, you must pass all -l options
explicitly yourself.
-xnolibmil
Does not inline math library routines. Use -xnolibmil
after the -fast option:
cc -fast -xnolibmil ...
-xnolibmopt
Do not link with the optimized math routine library by
turning off any previously specified -xlibmopt options.
Use this option after the -fast option on the command
line, as in:
example% cc -fast -xnolibmopt ...
-xnorunpath
Do not build a runtime search path for shared libraries
into the executable.
Normally cc does not pass any -R path to the linker.
There are a few options that do pass -R path to the
linker such as -xliclib=sunperf and -xopenmp. The
-xnorunpath option can be used to prevent this.
This option is recommended for building executables
that will be shipped to customers who may have a dif-
ferent path for the shared libraries that are used by
the program.
-xOn Specifies optimization level (n). (Note the uppercase
letter O, followed by a digit 1, 2, 3, 4, or 5)
Generally, the higher the level of optimization with
which a program is compiled, the better runtime perfor-
mance obtained. However, higher optimization levels may
result in increased compilation time and larger execut-
able files.
There are five levels that you can use with -xOn. The
actual optimizations performed by the compiler at each
level may change with each compiler release. They are
only summarized here.
If the optimizer runs out of memory, it attempts to
proceed over again at a lower level of optimization,
resuming compilation of subsequent routines at the ori-
ginal level.
Values:
-xO1 Do only the basic local optimizations.
-xO2 Do basic local and global optimization. This level
usually gives minimum code size.
-xO3 Adds global optimizations at the function level.
In general, this level, and -xO4, usually result
in the minimum code size when used with the
-xspace option.
-xO4 Adds automatic inlining of functions in the same
file. In general, -xO4 results in larger code
unless combined with -xspace.
See -inline to control which routines are inlined.
-xO5 Does the highest level of optimization, suitable
only for the small fraction of a program that uses
the largest fraction of computer time. Uses optim-
ization algorithms that take more compilation time
or that do not have as high a certainty of improv-
ing execution time. Optimization at this level is
more likely to improve performance if it is done
with profile feedback. See -xprofile=collect|use.
The default is no optimization. However, this is only
possible if you do not specify an optimization level.
If you specify an optimization level, there is no
option for turning optimization off.
If you are trying to avoid setting an optimization
level, be sure not to specify any option that implies
an optimization level. For example, -fast is a macro
option that sets optimization at -xO5. All other
options that imply an optimization level give a warning
message that optimization has been set. The only way to
compile without any optimization is to delete all
options from the command line or make file that specify
an optimization level.
If you use -g and the optimization level is -xO3 or
lower, the compiler provides best-effort symbolic
information with almost full optimization. Tail-call
optimization and back-end inlining are disabled.
If you use -g and the optimization level is -xO4 or
higher, the compiler provides best-effort symbolic
information with full optimization.
Debugging with -g does not suppress -xOn, but -xOn lim-
its -g in certain ways. For example, the optimization
options reduce the utility of debugging so that you
cannot display variables from dbx, but you can still
use the dbx where command to get a symbolic traceback.
For more information, see Debugging a Program With dbx.
If you specify both -xO and -xmaxopt, the optimization
level set with -xO must not exceed the -xmaxopt value.
See also:
-xldscope, -fast, -xprofile=p, csh(1) man page
Performance Analyzer discusses the effects of the dif-
ferent levels of optimization on the Analyzer's data.
-xopenmp[=i]
Use the -xopenmp option to enable explicit paralleliza-
tion with OpenMP directives.
Use the OMP_NUM_THREADS environment variable to specify
the number of threads to use when running an OpenMP. If
OMP_NUM_THREADS is not set, the default number of
threads used is 2. To use more threads, set
OMP_NUM_THREADS to a higher value. Set OMP_NUM_THREADS
to 1 to run with just one thread. In general, set
OMP_NUM_THREADS to the available number of virtual pro-
cessors on the running system, which can be determined
by using the Oracle Solaris psrinfo(1) command. See
the OpenMP API User's Guide for more information.
To enable nested parallelism, you must set the
OMP_NESTED environment variable to TRUE. Nested paral-
lelism is disabled by default. See the Oracle Solaris
Studio OpenMP API User's Guide for details.
The following table details the -xopenmp values:
Value Meaning
parallel Enables recognition of OpenMP pragmas. The
optimization level under -xopenmp=parallel is
-xO3. The compiler changes the optimization
level to -xO3 if necessary and issues a warn-
ing. This flag also defines the preprocessor
token _OPENMP.
The _OPENMP token is defined to have the
decimal value yyyymm where yyyy and mm are the
year and month designations of the version of
the OpenMP API that the implementation sup-
ports. Refer to the Oracle Solaris Studio
OpenMP API User's Guide for the value of the
_OPENMP macro for a particular release.
noopt Enables recognition of OpenMP pragmas. The
compiler does not raise the optimization level
if it is lower than -O3. If you explicitly set
the optimization lower than -O3, as in cc -O2
-xopenmp=noopt, the compiler issues an error.
If you do not specify an optimization level
with -xopenmp=noopt, the OpenMP pragmas are
recognized, the program is parallelized
accordingly, but no optimization is done. This
flag also defines the preprocessor token
_OPENMP.
none This flag is the default and does not enable
recognition of OpenMP pragmas, makes no change
to the optimization level of your program, and
does not predefine any preprocessor tokens.
If you specify -xopenmp, but do not include an argu-
ment, the compiler assumes -xopenmp=parallel. This
default could change in future releases. If you do not
specify -xopenmp, the compiler assumes -xopenmp=none.
If you are debugging an OpenMP program with dbx, com-
pile with -g -xopenmp=noopt so you can breakpoint
within parallel regions and display the contents of
variables.
The default for -xopenmp might change in future
releases. You can avoid warning messages by explicitly
specifying an appropriate optimization.
If you compile and link in seperate steps, specify
-xopenmp in both the compilation step and the link
step. This is important if you are building a shared
object. The compiler which was used to compile the exe-
cutable must not be any older than the compiler that
built the .so with -xopenmp. This is especially impor-
tant when you compile libraries that contain OpenMP
directives.
Make sure that the latest patch of the OpenMP runtime
library, libmtsk.so, is installed on the system for
best performance.
For information that is specific to the C implementa-
tion of OpenMP, see the C User's Guide.
For a complete summary of the OpenMP Fortran 95, C, and
C++ application program interface (API) for building
multiprocessing applications, see the OpenMP API User's
Guide.
-xP Performs only syntax and semantic checking on the
source file in order to print prototypes for all K&R C
functions. This option does not produce any object or
executable code.
-xpagesize=n
Set the preferred page size for the stack and the heap.
The n value must be one of the following:
On SPARC: /br
4k 8K 64K 512K 2M 4M 32M 256M 2G 16G or default.
On x86/x64 platforms:
4K 2M 4M 1G or default.
You must specify a valid page size for the target plat-
form. If you do not specify a valid pagesize, the
request is silently ignored at run-time.
Use the pagesize(1) Oracle Solaris command to determine
the number of bytes in a page. The Oracle Solaris
operating system offers no guarantee that the page size
request will be honored.
You can use pmap(1) or meminfo(2) to determine page
size of the target platform.
The -xpagesize option has no effect unless you use it
at compile time and at link time. For a complete list
of compiler options that must be specified at both com-
pile time and at link time, see the C User's Guide.
If you specify -xpagesize=default, the operating system
sets the page size.
Compiling with this option has the same effect as set-
ting the LD_PRELOAD environment variable to mpss.so.1
with the equivalent options, or running the Oracle
Solaris command ppgsz(1) with the equivalent options
before running the program. See the Oracle Solaris man
pages for details.
This option is a macro for -xpagesize_heap and
-xpagesize_stack. These two options accept the same
arguments as -xpagesize. You can set them both with the
same value by specifying -xpagesize=n or you can
specify them individually with different values.
-xpagesize_heap=n
Set the page size in memory for the heap.
The n value is the same as for -xpagesize.
You must specify a valid page size for the target plat-
form. If you do not specify a valid pagesize, the
request is silently ignored at run-time.
See -xpagesize for details.
-xpagesize_stack=n
Set the page size in memory for the stack.
The n value is the same as described for -xpagesize.
You must specify a valid page size for the Oracle
Solaris operating system on the target platform. If you
do not specify a valid pagesize, the request is
silently ignored at run-time.
See -xpagesize for details.
-xpch=v
This compiler option activates the precompiled-header
feature. v can be auto, autofirst,
collect:pch_filename, or use:pch_filename. You can take
advantage of this feature through the -xpch and
-xpchstop options in combination with the #pragma
hdrstop directive.
Use the -xpch option to create a precompiled-header
file and improve your compilation time. The
precompiled-header file is designed to reduce compile
time for applications whose source files share a common
set of include files containing a large amount of
source code. A precompiled header works by collecting
information about a sequence of header files from one
source file, and then using that information when
recompiling that source file, and when compiling other
source files that have the same sequence of headers.
Creating a Precompiled-Header File Automatically
You can let the compiler generate the precompiled-
header file for you automatically. Choose between one
of the following two ways to do this. One way is for
the compiler to create the precompiled-header file from
the first include file it finds in the source file. The
other way is for the compiler to select from the set of
include files found in the source file starting with
the first include file and extending through a well-
defined point that determines which include file is the
last one. Use one of the following two flags to deter-
mine which method the compiler uses to automatically
generate a precompiled header:
-xpch=auto
The contents of the precompiled-header file is
based on the longest viable prefix (see the fol-
lowing section for an explanation of how a viable
prefix is identified) that the compiler finds in
the source file. This flag produces a precompiled
header file that consists of the largest possible
number of header files.
-xpch=autofirst
This flag produces a precompiled-header file that
contains only the first header found in the source
file.
Creating the Precompiled-Header File Manually
If you decide to create your precompiled-header file
manually, you must start by first using -xpch and
specifying the collect mode. The compilation command
that specifies -xpch=collect must only specify one
source file. In the following example, the -xpch option
creates a precompiled-header file called myheader.cpch
based on the source file a.c:
cc -xpch=collect:myheader a.c
A valid precompiled-header filename always has the suf-
fix .cpch. When you specify pch_filename, you can add
the suffix or let the compiler add it for you. For
example, if you specify cc -xpch=collect:foo a.c, the
precompiled-header file is called foo.cpch.
How the Compiler Handles an Existing Precompiled-Header
File
If the compiler cannot use the precompiled-header file,
under -xpch=auto and -xpch=autofirst, it will generate
a new precompiled-header file. If the compiler cannot
use the precompiled-header file under -xpch=use, a
warning is issued and the compilation is done using the
real headers.
Directing the Compiler to Use a Specific Precompiled-
Header File
You can also direct the compiler to use a specific
precompiled header. Specify -xpch=use:pch_filename to
do this. You can specify any number of source files
with the same sequence of include files as the source
file used to create the precompiled-header file. For
example, your command in use mode could look like this:
cc -xpch=use:foo.cpch foo.c bar.c foobar.c
You should only use an existing precompiled-header file
if the following is true. If any of the following is
not true, you should recreate the precompiled-header
file:
- The compiler that you are using to access the
precompiled-header file is the same as the compiler
that created the precompiled-header file. A
precompiled-header file created by one version of the
compiler may not be usable by another version of the
compiler.
- Except for the -xpch option, the compiler options you
specify with -xpch=use must match the options that were
specified when the precompiled-header file was created.
- The set of included headers you specify with
-xpch=use is identical to the set of headers that were
specified when the precompiled header was created.
- The contents of the included headers that you specify
with -xpch=use is identical to the contents of the
included headers that were specified when the precom-
piled header was created.
- The current directory (that is, the directory in
which the compilation is occurring and attempting to
use a given precompiled-header file) is the same as the
directory in which the precompiled-header file was
created.
- The initial sequence of pre-processing directives,
including #include directives, in the file you speci-
fied with -xpch=collect are the same as the sequence of
pre-processing directives in the files you specify with
-xpch=use.
The Viable Prefix
In order to share a precompiled-header file across mul-
tiple source files, those source files must share a
common set of include files as their initial sequence
of tokens. A token is a keyword, name or punctuation
mark. Comments and code that is excluded by #if direc-
tives are not recognized by the compiler as tokens.
This initial sequence of tokens is known as the viable
prefix. In other words, the viable prefix is the top
portion of the source file that is common to all source
files. The compiler uses this viable prefix as the
basis for creating a precompiled-header file and
thereby determining which header files from the source
are pre-compiled.
The viable prefix that the compiler finds during the
current compilation must match the viable prefix that
it used to create the precompiled-header file. In other
words, the viable prefix must be interpreted con-
sistently by the compiler across all the source files
that use the same precompiled-header file.
The viable prefix consists of any of the following
pre-processor directives:
#include
#if/ifdef/ifndef/else/elif/endif
#define/undef
#ident
#pragma
Any of these may reference macros. The #else, #elif,
and #endif directives must match within the viable pre-
fix. Comments are ignored.
The compiler determines the end point of the viable
prefix automatically when you specify -xpch=auto or
-xpch=autofirst and is defined as follows. For
-xpch=collect or -xpch=use, the viable prefix ends with
a #pragma hdrstop.
- The first declaration/definition statement
- The first #line directive
- A #pragma hdrstop directive
- After the named include file if you specify
-xpch=auto and -xpchstop
- The first include file if you specify -xpch=autofirst
Note: An end point within a conditional statement gen-
erates a warning and disables the automatic creation of
a precompiled-header file. Also, if you specify both
the #pragma hdrstop and the -xpchstop option, then the
compiler uses the earlier of the two stop points to
terminate the viable prefix.
Within the viable prefix of each file that shares a
precompiled-header file, each corresponding #define and
#undef directive must reference the same symbol (in the
case of #define, each one must reference the same
value). Their order of appearance within each viable
prefix must be the same as well. Each corresponding
pragma must also be the same and appear in the same
order across all the files sharing a precompiled
header.
Screening Header Files for Problems
What makes a header file precompileable? A header file
is precompileable when it is interpreted consistently
across different source files. Specifically, when it
contains only complete declarations. That is, a
declaration in any one file must stand alone as a valid
declaration. Incomplete type declarations, such as
struct S;, are valid declarations. The complete type
declaration can appear in some other file. Consider
these example header files:
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
*/
A header file that is incorporated into a precompiled-
header file must not violate the following. The results
of compiling a program that violate any of these con-
straints is undefined.
- The header file must not use __DATE__ and __TIME__.
- The header file must not contain #pragma hdrstop.
The Precompiled-Header File Cache
When the compiler creates a precompiled-header file
automatically, the compiler writes it to the
SunWS_cache directory. This directory always resides in
the location where the object file is created. Updates
to the file are preformed under a lock so that it works
properly under dmake.
If you need to force the compiler to rebuild
automatically-generated precompiled-header files, you
can clear the precompiled-header file cache-directory
with the CCadmin tool. See the CCadmin(1) man page for
more information.
Warnings
o Do not specify conflicting -xpch flags on the command
line. For example, specifying both -xpch=collect and
-xpch=auto, or specifying both -xpch=autofirst with
-xpchstop=<include> generates an error.
o If you specify -xpch=autofirst or you specify
-xpch=auto without -xpchstop, any declaration, defini-
tion, or #line directive that appears prior to the
first include file, or appears prior to the include
file that is specified with -xpchstop for -xpch=auto,
generates a warning and disables the automatic genera-
tion of the precompiled-header file.
o A #pragma hdrstop before the first include file under
-xpch=autofirst or -xpch=auto disables the automatic
generation of the precompiled-header file.
Precompiled-Header File Dependencies and make Files
The compiler generates dependency information for
precompiled-header files when you specify
-xpch=collect. You need to create the appropriate rules
in your make files to take advantage of these dependen-
cies. Consider this sample make file:
%.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
$(c) foo.o bar.o foobar.o
clean :
rm -f *.o shared.cpch .make.state a.out
These make rules, along with the dependencies generated
by the compiler, force a manually created precompiled-
header file to be recreated if any source file you used
with -xpch=collect, or any of the headers that are part
of the precompiled-header file, have changed. This
prevents the use of an out of date precompiled-header
file.
For -xpch=auto or -xpch=autofirst, you do not have to
create any additional make rules in your makefiles.
See Also: -xpchstop
-xpchstop=[file|<include>]
where file is the last include file to be considered in
creating a precompiled-header file. Using -xpchstop on
the command line is equivalent to placing a hdrstop
pragma (See the C User's Guide) after the first
include-directive that references file in each of the
source files that you specify with the cc command.
Use -xpchstop=<include> with -xpch=auto to create a
precompiled-header file that is based on header files
up through and including <include>. This flag overrides
the default -xpch=auto behavior of using all header
files contained in the entire viable prefix.
See Also: -xpch
-xpec[={yes|no}]
(Oracle Solaris) Generates a Portable Executable Code
(PEC) binary.
Generates a Portable Executable Code (PEC) binary. This
option puts the program intermediate representations in
the object file and the binary. This binary may be used
later for tuning and troubleshooting.
A binary that is built with -xpec is usually five to
ten times larger than if it is built without -xpec.
If you do not specify -xpec, the compiler sets it to
-xpec=no. If you specify -xpec, but do not supply a
flag, the compiler sets it to -xpec=yes.
-xpentium
(x86) Generates code for the Pentium processor.
-xpg Prepares the object code to collect data for profiling
with gprof(1). Invokes a runtime recording mechanism
that produces a gmon.out file (at normal termination).
Note: There is no advantage for -xprofile if you
specify -xpg. The two do not prepare or use data pro-
vided by the other.
Profiles are generated by using prof or gprof on 64 bit
Oracle Solaris platforms or just gprof on 32 bit Oracle
Solaris platforms include approximate user CPU times.
These times are derived from PC sample data (see pcsam-
ple(2)) for routines in the main executable and rou-
tines in shared libraries specified as linker arguments
when the executable is linked. Other shared libraries
(libraries opened after process startup using
dlopen(3DL)) are not profiled.
On 32 bit Oracle Solaris systems, profiles generated
using prof(1) are limited to routines in the execut-
able. 32 bit shared libraries can be profiled by link-
ing the executable with -xpg and using gprof(1).
Current Oracle Solaris releases do not include system
libraries compiled with -p. As a result, profiles col-
lected on current Oracle Solaris platforms do not
include call counts for system library routines.
Note: On x86 systems, -xpg is incompatible with
-xregs=frameptr because the gprof runtime library
requires a valid frame pointer to determine the return
address of a profiled routine. Note also that compil-
ing with -fast on x86 systems will invoke
-xregs=frameptr. Compile with the following instead:
-fast -xregs=no%frameptr -xpg
If you specify -xpg at compile time, you must also
specify it at link time. See the C User's Guide for a
complete list of options that must be specified at both
compile time and link time.
Note: Binaries compiled with -xpg for gprof profiling
should not be used with binopt(1), as they are incompa-
tible and can result in internal errors.
-xprefetch[=val[,val]]
Enables prefetch instructions on those architectures
that support prefetch. You must compile withoptimiza-
tion level 3 orgreater with this option.
val must be one of the following:
auto Enable automatic generation of prefetch
instructions.
no%auto Disable automatic generation
explicit Enable explicit prefetch macros
Explicit prefetching should only be used
under special circumstances that are
supported by measurements.
no%explicit Disable explicit prefetch macros
latx:factor (SPARC) You can only combine this option
with -xprefetch=auto. Adjust the
compiler's assumed prefetch-to-load and
prefetch-to-store latencies by the
specified factor. The factor must be a
positive number of the form n.n .
The prefetch latency is the hardware
delay between the execution of a pre-
fetch instruction and the time the data
being prefetched is available in the
cache.
The compiler assumes a prefetch latency
value when determining how far apart to
place a prefetch instruction and the
load or store instruction that uses the
prefetched data.
Note - the assumed latency between a
prefetch and a load may not be the same
as the assumed latency between a pre-
fetch and a store.
The compiler tunes the prefetch mechan-
ism for optimal performance across a
wide range of machines and applications.
This tuning may not always be optimal.
For memory-intensive applications, espe-
cially applications intended to run on
large multiprocessors, you may be able
to obtain better performance by increas-
ing the prefetch latency values. To
increase the values, use a factor that
is greater than 1 (one). A value
between .5 and 2.0 will most likely pro-
vide the maximum performance.
For applications with datasets that
reside entirely within the external
cache, you may be able to obtain better
performance by decreasing the prefetch
latency values. To decrease the values,
use a factor that is less than one.
To use the latx:factor suboption, start
with a factor value near 1.0 and run
performance tests against the applica-
tion. Then increase or decrease the fac-
tor, as appropriate, and run the perfor-
mance tests again. Continue adjusting
the factor and running the performance
tests until you achieve optimum perfor-
mance. When you increase or decrease the
factor in small steps, you will see no
performance difference for a few steps,
then a sudden difference, then it will
level off again.
yes Obsolete - do not use. Use
-xprefetch=auto,explicit instead.
no Obsolete - do not use. Use
-xprefetch=no%auto,no%explicit instead.
Defaults
If you do not specify -xprefetch, the default is now
-xprefetch=auto,explicit, not -xprefetch=yes. If you
specify -xprefetch without a value, it is also
equivalent to -xprefetch=auto,explicit. This change
adversely affects applications that have essentially
non-linear memory access patterns. To disable the
change, specify -xprefetch=no%auto,no%explicit.
The sun_prefetch.h header file provides the macros that
you can use to specify explicit prefetch instruction.
The prefetches will be approximately at the place in
the executable that corresponds to where the macros
appear.
-xprefetch_auto_type=[a]
Where a is [no%]indirect_array_access.
Use this option to determine whether or not the com-
piler generates indirect prefetches for the loops indi-
cated by the option -xprefetch_level in the same
fashion the prefetches for direct memory accesses are
generated.
If you do not specify a setting for
-xprefetch_auto_type, the compiler sets it to
-xprefetch_auto_type=no%indirect_array_access.
Options such as -xdepend, -xrestrict, and -xalias_level
can affect the aggressiveness of computing the indirect
prefetch candidates and therefore the aggressiveness of
the automatic indirect prefetch insertion due to better
memory alias disambiguation information.
-xprefetch_level=l
Use this option to control the aggressiveness of
automatic insertion of prefetch instructions as deter-
mined with -xprefetch=auto.
l must be 1, 2, or 3.
Prefetch levels 2 and 3 may not be effective on older
SPARC and x86 platforms.
-xprefetch_level=1 enables automatic generation of pre-
fetch instructions. -xprefetch_level=2 enables addi-
tional generation beyond level 1 and -xprefetch=3
enables additional generation beyond level 2.
You must compile with optimization level 3 or greater
and generate code for a platform that supports pre-
fetch.
The default is -xprefetch_level=1 when you specify
-xprefetch=auto.
-xprofile=p
Collects data for a profile or use a profile to optim-
ize.
p must be collect[:profdir], use[:profdir], or
tcov[:profdir]
This option causes execution frequency data to be col-
lected and saved during execution, then the data can be
used in subsequent runs to improve performance. Profile
collection is safe for multithreaded applications. That
is, profiling a program that does its own multitasking
( -mt ) produces accurate results. This option is only
valid when you specify -xO2 or greater level of optimi-
zation.
If compilation and linking are performed in separate
steps, the same -xprofile option must appear on the
compile as well as the link step. See the C User's
Guide for a complete list of options that must be
specified at both compile time and link time.
collect[:profdir]
Collects and saves execution frequency for later
use by the optimizer with -xprofile=use. The com-
piler generates code to measure statement
execution-frequency.
-xMerge -ztext -xprofile=collect should not be
used together. While -xMerge forces statically
initialized data into read-only storage, -ztext
prohibits position-dependent symbol relocations in
read-only storage, and -xprofile=collect generates
statically initialized, position-dependent symbol
relocations in writable storage.
The profile directory name profdir, if specified,
is the pathname of the directory where profile
data are to be stored when a program or shared
library containing the profiled object code is
executed. If the pathname is not absolute, it is
interpreted relative to the current working direc-
tory when the program is compiled with the option
-xprofile=use:profdir.
If no profile directory name is specified with
-xprofile=collect:prof_dir or
-xprofile=tcov:prof_dir, profile data are stored
at run time in a directory named program.profile
where program is the basename of the profiled
process's main program. In this case, the
environment variables SUN_PROFDATA and
SUN_PROFDATA_DIR can be used to control where the
profile data are stored at run time. If set, the
profile data are written to the directory given by
$SUN_PROFDATA_DIR/$SUN_PROFDATA.
If a profile directory name is specified at compi-
lation time, SUN_PROFDATA_DIR and SUN_PROFDATA
have no effect at run time. These environment
variables similarly control the path and names of
the profile data files written by tcov, as
described in the tcov(1) man page.
If these environment variables are not set, the
profile data is written to the directory
profdir.profile in the current directory, where
profdir is the name of the executable or the name
specified in the -xprofile=collect:profdir flag.
-xprofile does not append .profile to profdir if
profdir already ends in .profile. If you run the
program several times, the execution frequency
data accumulates in the profdir.profile directory;
that is, output from prior executions is not lost.
Example[1]: to collect and use profile data in
the directory myprof.profile located in the same
directory where the program is built:
cc -xprofile=collect:myprof.profile -xO5 prog.c -o prog
./prog
cc -xprofile=use:myprof.profile -xO5 prog.c -o prog
Example[2]: to collect profile data in the direc-
tory /bench/myprof.profile and later use the col-
lected profile data in a feedback compilation at
optimization level -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
If you are compiling and linking in separate
steps, make sure that any object files compiled
with -xprofile=collect are also linked with
-xprofile=collect.
See also the ENVIRONMENT section of this man page
below for descriptions of environment variables
that control asynchronous profile collections.
use[:profdir]
Uses execution frequency data collected from code
compiled with -xprofile=collect[:profdir] or
-xprofile=tcov[:profdir] to optimize for the work
performed when the profiled code was executed.
profdir is the pathname of a directory containing
profile data collected by running a program that
was compiled with -xprofile=collect[:profdir] or
-xprofile=tcov[:profdir].
To generate data that can be used by both tcov and
-xprofile=use[:profdir], the same profile direc-
tory must be specified at compilation time, using
the option -xprofile=tcov[:profdir]. To minimize
confusion, specify profdir as an absolute path-
name.
The profdir is optional. If profdir is not speci-
fied, the name of the executible binary is used.
a.out is used if -o is not specified. The compiler
looks for profdir.profile/feedback, or
a.out.profile/feedback without profdir specified.
For example:
cc -xprofile=collect -o myexe prog.c
cc -xprofile=use:myexe -xO5 -o myexe prog.c
The program is optimized by using the execution
frequency data previously generated and saved in
the feedback files written by a previous execution
of the program compiled with -xprofile=collect.
Except for the -xprofile option, the source files
and other compiler options must be exactly the
same as those used for the compilation that
created the compiled program which in turn gen-
erated the feedback file. The same version of the
compiler must be used for both the collect build
and the use build as well.
If compiled with -xprofile=collect:profdir, the
same profile directory name profdir must be used
in the optimizing compilation:
-xprofile=use:profdir.
See also -xprofile_ircache for speeding up compi-
lation between collect and use phases.
tcov[:profdir]
Instrument object files for basic block coverage
analysis using tcov(1).
If the optional :profdir argument is specified,
the compiler will create a profile directory at
the specified location. The data stored in the
profile directory can be used either by tcov(1) or
by the compiler with -xprofile=use:profdir .
If the optional :profdir argument is omitted, a
profile directory will be created when the pro-
filed program is executed. The data stored in the
profile directory can only be used by tcov(1).
The location of the profile directory can be con-
trolled using environment variables SUN_PROFDATA
and SUN_PROFDATA_DIR. See ENVIRONMENT below.
If the location specified by :profdir is not abso-
lute, it is interpreted relative to the current
working directory when the program is compiled.
If :profdir is specified for any object file, the
same location must be specified for all object
files in the same program. The directory whose
location is specified by :profdir must be accessi-
ble from all machines where the profiled program
is to be executed. The profile directory should
not be deleted until its contents are no longer
needed, because data stored there by the compiler
cannot be restored except by recompilation.
Example 1: if object files for one or more pro-
grams are compiled with
-xprofile=tcov:/test/profdata, a directory named
/test/profdata.profile will be created by the com-
piler and used to store data describing the pro-
filed object files. The same directory will also
be used at execution time to store execution data
associated with the profiled object files.
Example 2: if a program named "myprog" is compiled
with -xprofile=tcov and executed in the directory
/home/joe, the directory /home/joe/myprog.profile
will be created at run time and used to store run-
time profile data.
-xprofile_ircache[=path]
(SPARC) Use -xprofile_ircache[=path] with
-xprofile=collect|use to improve compilation time dur-
ing the use phase by reusing compilation data saved
from the collect phase.
With large programs, compilation time in the use phase
can improve significantly because the intermediate data
is saved. Note that the saved data could increase disk
space requirements considerably.
When you use -xprofile_ircache[=path], path overrides
the location where the cached files are saved. By
default, these files are saved in the same directory as
the object file. Specifying a path is useful when the
collect and use phases happen in two different direc-
tories.
Here's a typical sequence of commands:
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
-xprofile_pathmap=collect_prefix:use_prefix
(SPARC) Use the -xprofile_pathmap option when you are
also specifying the -xprofile=use command. Use
-xprofile_pathmap when both of the following are true
and the compiler is unable to find profile data for an
object file that is compiled with -xprofile=use.
o You are compiling the object file with -xprofile=use
in a directory that is different from the directory
in which the object file was previously compiled
with -xprofile=collect.
o Your object files share a common basename in the profile
but are distinguished from each other by their loca-
tion in different directories.
The collect-prefix is the prefix of the UNIX pathname
of a directory tree in which object files were compiled
using -xprofile=collect.
The use-prefix is the prefix of the UNIX pathname of a
directory tree in which object files are to be compiled
using -xprofile=use.
If you specify multiple instances of -xprofile_pathmap,
the compiler processes them in the order of their
occurrence. Each use-prefix specified by an instance
of -xprofile_pathmap is compared with the object file
pathname until either a matching use-prefix is identi-
fied or the last specified use-prefix is found not to
match the object file pathname.
-xreduction
Analyzes loops for reduction in automatic paralleliza-
tion. This option is valid only if -xautopar is also
specified. Otherwise the compiler issues a warning.
When a reduction recognition is enabled, the compiler
parallelizes reductions such as dot products, maximum
and minimum finding. These reductions yield different
roundoffs from those obtained by unparallelized code.
-xregs=r[,r...]
Specify the usage of registers for the generated code.
r is a comma-separated list of one or more of the fol-
lowing suboptions: appl, float, frameptr.
Prefixing a suboption with no% disables that suboption.
Example: -xregs=appl,no%float
Note that -xregs suboptions are restricted to specific
hardware platforms.
appl (SPARC)
Allow the compiler to generate code using the
application registers as scratch registers.
The application registers are:
g2, g3, g4 (on 32-bit platforms)
g2, g3 (on 64-bit platforms)
It is strongly recommended that all system
software and libraries be compiled using
-xregs=no%appl. System software (including
shared libraries) must preserve these regis-
ters' values for the application. Their use is
intended to be controlled by the compilation
system and must be consistent throughout the
application.
In the SPARC ABI, these registers are
described as application registers. Using
these registers can increase performance
because fewer load and store instructions are
needed. However, such use can conflict with
some old library programs written in assembly
code.
For more information on SPARC instruction
sets, see -xarch.
float (SPARC)
Allow the compiler to generate code by using
the floating-point registers as scratch regis-
ters for integer values. Use of floating-point
values may use these registers regardless of
this option. To generate binary code free of
all references to floating point registers,
use -xregs=no%float and make sure your source
code does not in any way use floating point
types.
frameptr (x86)
Allow the compiler to use the frame-pointer
register (%ebp on IA32, %rbp on x86 64-bit
platforms) as a general-purpose register.
The default is -xregs=no%frameptr.
The C++ compiler ignores -xregs=frameptr
unless exceptions are also disabled with
-features=no%except. Note also that
-xregs=frameptr is part of -fast, but is
ignored by the C++ compiler unless
-features=no%except is also specified.
With -xregs=frameptr the compiler is free to
use the frame-pointer register to improve pro-
gram performance. However, some features of
the debugger and performance measurement tools
may be limited. Stack tracing, debuggers, and
performance analyzers cannot report on func-
tions compiled with -xregs=frameptr.
Also, C++ calls to Posix pthread_cancel() will
fail trying to find cleanup handlers.
Mixed C, Fortran, and C++ code should not be
compiled with -xregs=frameptr if a C++ func-
tion, called directly or indirectly from a C
or Fortran function, can throw an exception.
If compiling such mixed source code with
-fast, add -xregs=no%frameptr after the -fast
option on the command line.
With more available registers on 64-bit plat-
forms, compiling with -xregs=frameptr has a
better chance of improving 32-bit code perfor-
mance than 64-bit code.
Note: -xregs=frameptr is ignored and a warning
is issued by the compiler if you also specify
-xpg.
Also, -xkeepframe overrides -xregs=frameptr.
The SPARC default is -xregs=appl,float.
The x86 default is -xregs=no%frameptr.
-xregs=frameptr is included in the expansion of -fast
on x86.
It is strongly recommended that you compile code
intended for shared libraries that will link with
applications, with -xregs=no%appl,float. At the very
least, the shared library should explicitly document
how it uses the application registers so that applica-
tions linking with those libraries are aware of these
register assignments.
For example, an application using the registers in some
global sense (such as using a register to point to some
critical data structure) would need to know exactly how
a library with code compiled without -xregs=no%appl is
using the application registers in order to safely link
with that library.
-xrestrict[=f]
Treats pointer-valued function parameters as restricted
pointers. f is %all, %none or a comma-separated list of
one or more function names. This command-line option
can be used on its own, but is best used with optimiza-
tion of -xO3 or greater.
If a function list is specified with this option,
pointer parameters in the specified functions are
treated as restricted; if -xrestrict=%all is specified,
all pointer parameters in the entire C file are treated
as restricted.
The default is %none. Specifying -xrestrict is
equivalent to specifying -xrestrict=%all.
See Also: 'Restricted Pointers' in the C User's Guide
-xs Allows debugging by dbx without object files.
This option causes all the debug information to be
copied into the executable. This has little impact on
dbx performance or the run-time performance of the pro-
gram, but it does take more disk space.
-xsafe=mem
(SPARC) Allow the compiler to assume that no memory
protection violations occur.
This option allows the compiler to use the non-faulting
load instruction in 64-bit SPARC architecture.
Because non-faulting loads do not cause a trap when a
fault such as address misalignment or segmentation vio-
lation occurs, you should use this option only for pro-
grams in which such faults cannot occur. Because few
programs incur memory-based traps, you can safely use
this option for most programs. Do not use this option
for programs that explicitly depend on memory-based
traps to handle exceptional conditions.
This option takes effect only when used with optimiza-
tion level -xO5 and one of the following -xarch values:
sparc, sparcvis, sparcvis2, or sparcvis3 for both -m32
and -m64.
-xsfpconst
Represents unsuffixed floating-point constants as sin-
gle precision, instead of the default mode of double
precision. Not valid with -Xc.
-xspace
Does no optimizations that increase code size. Does not
parallelize loops if it increases code size. Example:
Does not unroll loops.
-xstrconst
This option may be deprecated in a future release, use
-features=[no%]conststrings instead.
The -xstrconst option inserts string literals into the
read-only data section of the text segment instead of
the default data segment. Duplicate strings will be
eliminated and the remaining copy shared amongst refer-
ences in the code.
-xtarget=t
Specifies the target system for the instruction set and
optimization.
t must be one of: native, native64, generic, generic64,
or system-name.
The -xtarget option permits a quick and easy specifica-
tion of the -xarch, -xchip, and -xcache combinations
that occur on real systems. The only meaning of -xtar-
get is in its expansion. See the -xdryrun explanation
for details on how to see the expansion of macro
options such as -xtarget.
-xtarget=native is equivalent to -m32, -xarch=native,
-xchip=native, -xcache=native.
-xtarget=native64 is equivalent to -m64,
-xarch=native64, -xchip=native64, -xcache=native.
-xtarget=generic is equivalent to -m32,
-xarch=generic, -xchip=generic, -xcache=generic.
-xtarget=generic64 is equivalent to -m64,
-xarch=generic64, -xchip=generic64, -xcache=generic.
The -fast macro option includes -xtarger=native in its
expansion.
The -xtarget command itself is a macro option which
acts like a macro expansion on the command line for the
-xarch -xchip and -xcache options. Therefore, you can
override any of the expanded options by following
-xtarget with the desired option. Use the -xdryrun
option to determine the expansion of -xtarget=native on
a running system.
Note: The expansion of -xtarget for a specific host
platform might not expand to the same -xarch, -xchip,
or -xcache settings as -xtarget=native when compiling
on that platform.
On SPARC platforms:
Compiling for 64-bit Oracle Solaris software on 64-bit
SPARC architectures is indicated by the -m64 option. If
you specify -xtarget with a flag other than native64 or
generic64, you must also specify the -m64 option as
follows:
-xtarget=ultra4 ... -m64
otherwise the compiler uses a 32-bit memory model.
Value Meaning
native Set the parameters for the best performance
on the host environment (assumes a 32-bit
architecture).
native64 Set the parameters for the best performance
on the host environment (assumes a 64-bit
architecture).
generic This is the default and sets the parameters
for the best performance over most 32-bit
platform architectures.
generic64 Set the parameters for the best performance
over most 64-bit platform architectures.
system-name
Get the best performance for the specified
system.
Valid SPARC platform names are shown below.
Commonly used platform names:
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, sparc64vi, sparc64vii,
sparc64viiplus.
On x86 platforms
Compiling for 64-bit Oracle Solaris software on 64-bit
x86 platforms is indicated by the -m64 option. If you
specify -xtarget with a flag other than native64 or
generic64, you must also specify the -m64 option as
follows:
-xtarget=opteron ... -m64
otherwise the compiler uses a 32-bit memory model.
Value Meaning
o generic This is the default and yields the best per-
formance for generic architecture, chip and
cache on most 32-bit systems.
o generic64
Gets the best performance for generic archi-
tecture, chip and cache on most 64-bit sys-
tems.
o native The compiler generates code for the best per-
formance on the host system. This flag deter-
mines the available architecture, chip, and
cache properties of the machine on which the
compiler is running and assumes a 32-bit
architecture.
o native64
Set the parameters for the best performance
on the host system. This flag determines the
available architecture, chip, and cache pro-
perties of the machine on which the compiler
is running and assumes a 64-bit architecture.
o processor-name
Generate code for the best performance on the
indicated x86 processor-name. The following
processors are recognized:
barcelona, nehalem, opteron, pentium,
pentium_pro, pentium3, pentium4, penryn,
sandybridge, westmere, woodcrest
The actual expansion of an -xtarget suboption might
change and improve with each compiler release. Use the
-dryrun option to see the actual expansion:
cc -dryrun -xtarget=ultra4 |& grep ###
### command line files and options (expanded):
### -dryrun -xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2
-xtemp= dir
Sets the directory the compiler uses for temporary
files to dir. No space is allowed within this option
string. Without this option, temporary files go into
/tmp. -xtemp has precedence over the TMPDIR environment
variable.
-xthreadvar[=o]
Works in conjunction with the __thread declaration
specifier to take advantage of the compiler's thread-
local storage facility. After you declare the thread
variables with the __thread specifier, use -xthreadvar
to enable the use of thread-local storage with position
dependent code (non-PIC code) in dynamic (shared)
libraries. For more information on how to use __thread,
see the C User's Guide.
o must be the following:
Value Meaning
[no%]dynamic Compile variables for dynamic loading.
Prefix no% disables the option. Access
to thread variables is significantly
faster when -xthreadvar=no%dynamic but
you cannot use the object file within a
dynamic library. That is, you can only
use the object file in an executable
file.
If you do not specify -xthreadvar, the default used by
the compiler depends upon whether or not position-
independent code is enabled. If position-independent
code is enabled, the option is set to
-xthreadvar=dynamic. If position- independent code is
disabled, the option is set to -xthreadvar=no%dynamic.
If you specify -xthreadvar but do not specify any argu-
ments, the option is set to -xthreadvar=dynamic.
If there is non-position-independent code within a
dynamic library, you must specify -xthreadvar.
The linker cannot support the thread-variable
equivalent of non-PIC code in dynamic libraries. Non-
PIC thread variables are significantly faster, and
hence should be the default for executables.
If there is non-position-independent code within a
dynamic library, you must specify -xthreadvar.
Using thread variables on different versions of Oracle
Solaris software requires different options on the com-
mand line.
See Also: -xcode, -KPIC, -Kpic
-xtime
Reports the time and resources used by each compila-
tion.
-xtransition
Issues warnings for differences between K&R C and ISO
C. The -xtransition option issues messages in conjunc-
tion with the -Xa and -Xt options. You can eliminate
all warning messages about differing behavior through
appropriate coding.
-xtrigraphs[=[yes|no]]
Enables or disables recognition of trigraph sequences
as defined by the ISO C standard.
-xtrigraphs=yes enables recognition of trigraph
sequences in the source code.
-xtrigraphs=no disables recognition of trigraph
sequences in the source code.
Defaults:
If the -xtrigraphs option is not specified,
-xtrigraphs=no is assumed.
If only -xtrigraphs is specified -xtrigraphs=yes is
assumed.
-xunroll=n
Specifies whether or not the compiler optimizes
(unrolls) loops. n is a positive integer. When n is
1, it is a command and the compiler unrolls no loops.
When n is greater than 1, -xunroll=n allows the com-
piler to unroll loops n times.
-xustr={ascii_utf16_ushort|no}
Specify -xustr=ascii_utf16_ushort if you need to
support an internationalized application that uses
ISO10646 UTF-16 string literals. In other words, use
this option if your code contains string literals that
you want the compiler to convert to UTF-16 strings in
the object file. Without this option, the compiler nei-
ther produces nor recognizes sixteen-bit character
string literals. This option enables recognition of the
U"ASCII_string" string literals as an array of unsigned
short int. Since such strings are not yet part of any
standard, this option enables recognition of non-
standard C.
You can turn off compiler recognition of
U"ASCII_string" string literals by specifying
-xustr=no. The rightmost instance of this option on the
command line overrides all previous instances.
The default is -xustr=no. If you specify -xustr without
an argument, the compiler won't accept it and instead
issues a warning. The default can change if the C or
C++ standards define a meaning for the syntax.
It is not an error to specify
-xustr=ascii_ustf16_ushort without also specifying a
U"ASCII_string" string literal.
Not all files have to be compiled with this option.
The following example shows a string literal in quotes
that is prepended by U. It also shows a command line
that specifies -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
-xvector[=a]
Enables automatic generation of calls to the vector
library or the generation of the SIMD (Single Instruc-
tion Multiple Data) instructions on x86 processors that
support SIMD. You must use default rounding mode by
specifying -fround=nearest when you use this option.
The -xvector option requires optimization level -xO3 or
greater. Compilation will not proceed if the optimiza-
tion level is unspecified or lower than -xO3, and a
message is issued.
a is the equivalent of the following. Prefix no%
disables a suboption.
[no%]lib
(SOLARIS Only) Enables the compiler to transform
math library calls within loops into single calls
to the equivalent vector math routines when such
transformations are possible. This could result in
a performance improvement for loops with large
loop counts. Use no%lib to disable this option.
[no%]simd
(x86 only) Directs the compiler to use the native
x86 SSE SIMD instructions to improve performance
of certain loops. Streaming extensions are used on
x86 by default at optimization level 3 and above
where beneficial. Use no%simd to disable this
option.
The compiler will use SIMD only if streaming
extensions exist in the target architecture; that
is, if target ISA is at least SSE2. For example,
you can specify -xtarget=woodcrest,
-xarch=generic64, -xarch=sse2, -xarch=sse3, or
-fast on a modern platform to use it. If the tar-
get ISA has no streaming extensions, the suboption
will have no effect.
%none
Disables this option entirely.
yes This option is deprecated, specify -xvector=lib
instead.
no This option is deprecated, specify -xvector=%none
instead.
The default is -xvector=simd on x86 and -xvector=%none
on SPARC platforms. If you specify -xvector without a
suboption, the compiler assumes -xvector=simd,lib on
x86 Oracle Solaris, -xvector=lib on SPARC Oracle
Solaris, and -xvector=simd on Linux platforms.
This option overrides previous instances so
-xvector=%none undoes a previously specified
-xvector=lib.
The compiler includes the libmvec libraries in the
load step.
NOTE: -xvector=%none should be used when compiling Ora-
cle Solaris kernel code for x86 platforms.
If you compile and link with separate commands, be sure
to use the same option for both compilation and link-
ing.
-xvis[={yes|no}]
(SPARC) Compile with -xvis=yes when including the
<vis.h> header to generate VIS instructions, or when
using assembler inline code (.il) that uses VIS
instructions. The default is -xvis=no. Specifying -xvis
is equivalent to specifying -xvis=yes.
The VIS[tm] instruction set is an extension to the
SPARC V9 instruction set. Even though the UltraSPARC
processors are 64-bit, there are many cases, especially
in multimedia applications, when the data are limited
to eight or 16 bits in size. The VIS instructions can
process four 16-bit data with one instruction so they
greatly improve the performance of applications that
handle new media such as imaging, linear algebra, sig-
nal processing, audio, video and networking.
-xvpara
Issues warnings about potential parallel-programming
related problems that may cause incorrect results when
using OpenMP. Use with -xopenmp and OpenMP API direc-
tives.
The compiler issues warnings when it detects the fol-
lowing situations:
o Loops are parallelized using MP directives when there
are data dependencies between different loop iterations
o OpenMP data-sharing attributes-clauses are prob-
lematic. For example, declaring a variable "shared"
whose accesses in an OpenMP parallel region may cause
data race, or declaring a variable "private" whose
value in a parallel region is used after the parallel
region.
No warnings appear if all parallelization directives
are processed without problems.
Example:
cc -xopenmp -xvpara any.c
Note: Oracle Solaris Studio compilers support OpenMP
3.1 API parallelization. Consequently, the MP pragmas
are deprecated. See the OpenMP API User's Guide for
information on migrating to the OpenMP API.
-Yc, dir
Specifies a new directory dir for the location of com-
ponent c. c can consist of any of the characters
representing tools listed under the -W option.
If the location of a tool is being specified, then the
new path name for the tool will be dir/tool. If more
than one -Y option is applied to any one item, then
the last occurrence holds.
-YA, dir
Specifies a directory dir to search for all compiler
components. If a component is not found in dir, the
search reverts to the directory where the compiler is
installed.
-YI, dir
Changes default directory searched for include files.
-YP, dir
Changes default directory for finding libraries files.
-YS, dir
Changes default directory for startup object files.
-Zll Creates the program database for lock_lint, but does
not generate executable code.
cc recognizes -a, -e, -r, -t, -u, and -z and passes these
options and their arguments to ld. cc also passes any
unrecognized options to ld with a warning.
NOTES
errno
Certain floating-point math library routines will return
error status in the errno variable (defined in errno.h).
With options -fast, -xbuiltin, -xlibmieee, -xlibmil, -xlib-
mopt the compiler is free to replace calls to floating point
functions with equivalent optimized code that does not set
the errno variable. Further, -fast also defines the macro
__MATHERR_ERRNO_DONTCARE, which allows the compiler to
assume that math functions need not set errno. As a result,
user code that relies on the value of errno or a floating-
point exception being raised after a floating point function
call could produce inconsistent results.
One way around this problem is to avoid compiling such codes
with -fast.
However, if -fast optimization is required and the code
depends on the value of errno being set properly or an
appropriate floating-point exception being raised after
floating-point library calls, you should compile with the
options
-xbuiltin=none -U__MATHERR_ERRNO_DONTCARE \
-xnolibmopt -xnolibmil
following -fast on the command line to inhibit the compiler
from optimizing out such library calls and to to ensure that
calls to math functions set errno as documented.
New Shared Libraries
For Solaris release 10, new shared libraries libxprof.so.1,
libxprof_audit.so.1, and libtdf.so.1 must be installed in
order to use the -xprofile option. These libraries are pre-
installed on the latest Oracle Solaris releases.
PRAGMAS
The following #pragmas are recognized by the compilation
system:
#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
See also the OpenMP API User's Guide for a list of supported
OpenMP 2.5 directives.
SPARC Only:
#pragma nomemorydepend
#pragma no_side_effect
#pragma pipeloop
#pragma unroll
Refer to the C User's Guide for more information on these
pragmas.
ENVIRONMENT
The following is a list of environment variables that you
can set along with a brief description of their function.
LINT_OPTIONS
A default set of options to lint. LINT_OPTIONS
is interpreted by lint as though its value had
been placed on the command line, immediately fol-
lowing the name used to invoke lint, as in:
lint $LINT_OPTIONS ... other-arguments ...
OMP_DYNAMIC
Enable or disable dynamic adjustment of the number
of threads.
OMP_NESTED
Enable or disable nested parallelism. See the
OpenMP API User's Guide.
OMP_NUM_THREADS
This variable tells the runtime system the maximum
number of threads the program can create. Default
is 2. See the OpenMP API User's Guide.
OMP_SCHEDULE
Set the run-time schedule type and chunk size. See
the OpenMP API User's Guide.
PARALLEL Same as OMP_NUM_THREADS.
STACKSIZE The executing program maintains a main memory
stack for the master thread and distinct stacks
for each slave thread. Stacks are temporary memory
address spaces used to hold arguments and
automatic variables over subprogram invocations.
The default size of the main stack is about eight
megabytes. Use the limit(1) command to display the
current main stack size as well as set it.
Each slave thread of a multithreaded program has
its own thread stack. This stack mimics the main
stack of the master thread but is unique to the
thread. The thread's private arrays and variables
(local to the thread) are allocated on the thread
stack.
All slave threads have the same stack size, which
is four megabytes for 32-bit applications and
eight megabytes for 64-bit applications by
default. The size is set with the STACKSIZE
environment variable.
Setting the thread stack size to a value larger
than the default may be necessary for some paral-
lelized code.
The syntax of the STACKSIZE environment variable
accepts a keyword for denoting the slave thread
stacksize: B for Bytes, K for Kilobytes, M for
Megabytes, G for Gigabytes.
For example, setenv STACKSIZE 8192 sets the slave
thread stack size to 8 MB. 1235B sets the slave
thread stack size for 1235 Bytes. 1235G sets it
for 1235 Gigabytes. The default for an integer
value without a suffix letter is still Kilobytes.
Sometimes the compiler may generate a warning mes-
sage that indicates a bigger stack size is needed.
However, it may not be possible to know just how
large to set it, except by trial and error, espe-
cially if private/local arrays are involved. If
the stack size is too small for a thread to run,
the program will abort with a segmentation fault.
TMPDIR cc normally creates temporary files in the direc-
tory /tmp. You may specify another directory by
setting the environment variable TMPDIR to your
chosen directory. (If TMPDIR isn't a valid direc-
tory, then cc will use /tmp). The -xtemp option
has precedence over the TMPDIR environment vari-
able.
SUNPRO_SB_INIT_FILE_NAME
Obsolete - the source browser functionality is no
longer supported.
SUN_PROFDATA=profdir
If set, store profile data collected from a pro-
gram compiled with -xprofile=collect in a direc-
tory named profdir in the current working direc-
tory at the time that the program is executed. If
the optional argument :profdir was specified in
-xprofile=collect[:profdir] at compilation time,
SUN_PROFDATA as no effect.
SUN_PROFDATA_DIR=dirname If set, store profile
data collected from a program compiled with
-xprofile=collect in a directory whose UNIX dir-
name is dirname. If dirname is not absolute, it
is interpreted relative to the current working
directory at the time that the program is exe-
cuted. If the optional argument :profdir was
specified in -xprofile=collect[:profdir] at compi-
lation time, SUN_PROFDATA_DIR has no effect.
SUNW_MP_THR_IDLE
Controls end-of-task status of each helper thread
and can be set to spin or sleep ns. The default is
sleep. See the OpenMP API User's Guide for
details.
SUNW_MP_WARN
Set this environment variable to TRUE to print
warning messages from the OpenMP and other paral-
lelization runtime-systems. If you registered a
function by using sunw_mp_register_warn() to han-
dle warning messages, then SUNW_MP_WARN prints no
warning messages, even if you set it to TRUE. If
you did not register a function and set
SUNW_MP_WARN to TRUE, SUNW_MP_WARN prints the
warning messages to stderr. If you do not register
a function and you do not set SUNW_MP_WARN, no
warning messages are issued. For more information
on sunw_mp_register_warn() see the C User's Guide.
SUN_PROFDATA_REPLACE={objfile,program,all}
The value of the environment variable
SUN_PROFDATA_REPLACE indicates the scope of pro-
file data to be reset when a changed version of an
object file is detected at runtime. Use
SUN_PROFDATA_REPLACE to ensure that profile data
are consistent with the profiled program within
the specified unit of program scope.
The values of SUN_PROFDATA_REPLACE and their mean-
ings are as follows:
objfile
reset profile data of changed object file
program
reset profile data of all object files in
program containing changed object file
all reset entire contents of profile directory if
any object file has changed
The default setting of SUN_PROFDATA_REPLACE is
SUN_PROFDATA_REPLACE=objfile .
Example:
% setenv SUN_PROFDATA_REPLACE program (csh)
$ export SUN_PROFDATA_REPLACE=program (ksh)
With this setting, when a program containing a
changed object file is executed, all object files
in the program will have their profile data reset.
Relevant options include -xOn and -xipo=n.
SUN_PROFDATA_ASYNC_INTERVAL=async_interval
Set this environment variable to enable asynchro-
nous profile collection. In asynchronous profile
collection, profile data are collected from a run-
ning process at regular intervals whose duration
is specified in units of seconds.
SUN_PROFDATA_ASYNC_INTERVAL has no effect unless
one of the environment variables LD_AUDIT,
LD_AUDIT_32, or LD_AUDIT_64 is set to
/usr/lib/{,64}/libxprof_audit.so.1.
Asynchronous profile collection requires an MT-
safe, mmap based memory allocator, such as
libumem(3) with mmap-based allocation specified by
setting UMEM_OPTIONS to backend=mmap.
Example: to enable asynchronous profile collection
from a 64 bit process at 1 minute
intervals,specify the following environment vari-
ables:
$ 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]
SUN_PROFDATA_ASYNC_VERBOSE=verbose
If set nonzero, enables verbose messages from
asynchronous collector to stderr.
SUN_PROFDATA_ASYNC_VERBOSE has no effect unless
asynchronous profile collection is enabled.
FILES
a.out executable output file
bb_link.o tcov support
file.a library of object files
file.c C source file
file.d tcov(1) test coverage input file
file.i C source file after preprocessing
file.il inline(1) expansion file
file.ll lock_lint database
file.o object file
file.profile The directory for data used by -xprofile
file.s assembler source file
file.so dynamic library
file.tcov output from tcov(1)
acomp compiler front end
cc compiler command line driver
cg code generator (SPARC)
crt1.o runtime startup code
crti.o runtime startup code
crtn.o runtime startup code
fbe assembler
gcrt1.o startup for profiling with gprof(1)
gmon.out default profile file for -xpg
ipo Interprocedural optimizer (SPARC)
ir2hf intermediate code translator (x86)
iropt global optimizer
libredblack.so bids support
mcrt1.o start-up for profiling with prof(1) and
intro(3)
misalign.o misalign data support (SPARC)
mon.out default profile file for -p
postopt postoptimizer (SPARC)
ssbd Static synchronization bug detection (Oracle
Solaris Operating Environment)
stack_grow.o stack overflow checking (SPARC)
SunWS_cache The directory used to store data when the
-xpch option is used.
ube optimizer, code generator (x86)
ube_ipa Interprocedural analyzer (x86)
values-xa.o -Xa support
values-xc.o -Xc support
values-xpg4.o xpg4 support
values-xpg6.o SUSv3 support
values-xs.o -Xs support
values-xt.o -Xt support
xprof_fini.o Initialization and finalization handlers for
programs compiled with -xprofile=collect
SEE ALSO
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(3S), version(1).
C User's Guide
OpenMP API User's Guide
The ISO/IEC 9899-1990 Programming Language - C standard,
The ISO/IEC 9899-1999 Programming Language - C standard,