This chapter provides information about the following:
This section provides a brief overview of the new C compiler features and functionality introduced in the Sun Studio 12 C 5.9 Compiler release.
The C compiler is now available on the following Linux distributions (x86 and x64)
SuSE Linux Enterprise Server 9 with Service Pack 3 (or later).
Red Hat Enterprise Linux 4.
Other Linux distributions based on the 2.6 kernel though these are not officially supported.
New -m32|-m64 options to determine the memory model.
New flags for -xarch replace obsolete flags.
New values for -xtarget and -xchip provide code generation for the UltraSPARC T2 and SPARC64vi processors.
New flag -fma=fused to enable generation of fused multiply-add instructions on processors that support them.
Explicit prefetch macros accepted on x86 platforms as well as SPARC platforms. (-xprefetch=explicit)
A new -xMD option which generates makefile dependencies. This is the same functionality as with -xM, but includes compilation.
A new -xMF filename options allows you to specify a filename for makefile-dependency output.
A new -xMMD option generates makefile dependencies excluding system headers.
The way to specify compilation of a 32-bit or 64-bit binary has changed in this release. The B.2.68 -xarch=isaoption no longer carries an implicit memory model, 32-bit ILP32 or 64-bit LP64, with each definition, and is now used only to specify the instruction set of the target processor.
Use the new B.2.41 -m32|-m64 options to specify the memory model of the target compilation.
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 Solaris and Linux OS also support large files and large arrays under the LP64 memory model.
When you compile with -m64, the resulting executable works only on 64-bit UltraSPARC(R) or x86 processors under 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 Solaris or Linux OS that supports 64-bit execution.
There are some important issues to be aware of when compiling for x86 Solaris platforms.
The legacy Sun-style parallelization pragmas are not available on x86. Use OpenMP instead. See the Sun Studio 12: OpenMP API User’s Guide for information on converting legacy parallelization directives to OpenMP.
Programs compiled with -xarch set to sse, sse2, sse2a, or sse3 must be run only on platforms that provide these extensions and features.
Solaris OS releases starting with Solaris 9 4/04 are SSE/SSE2-enabled on Pentium 4-compatible platforms. Earlier versions of Solaris OS are not SSE/SSE2-enabled. If an instruction set selected by -xarch is not enabled in the running Solaris OS, the compiler will not be able to generate or link code for that instruction set.
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 x-arch=sse2 if the hardware supports SSE2.
Numerical results can also differ between Solaris and Linux because the intrinsic math libraries (for example, sin(x)) are not the same.
Starting with Sun Studio 11 and the Solaris 10 OS, program binaries compiled and built using these specialized -xarch hardware flags are verified that they are being run on the appropriate platform.
On systems prior to Solaris 10, no verification is done and it is the user's responsibility to ensure objects built using these flags are deployed on suitable hardware.
Running programs compiled with these -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 instructions and extensions.
The term C99 used in this book refers to the ISO/IEC 9899:1999 C programming language. The term C90 refers to the ISO/IEC 9899:1990 C programming language.
This compiler supports most of the language features specified in the ISO/IEC 9899:1999, Programming Language - C standard on operating systems earlier than Solaris 10 software. This compiler is in full compliance with the C99 standard on Solaris 10 software when you specify -xc99=all,lib.
This compiler also conforms with the ISO/IEC 9899:1990, Programming Languages- C standard.
Because the compiler also supports traditional K&R C (Kernighan and Ritchie, or pre-ANSI C), it can ease your migration to ISO C.
For information on C90 implementation-specific behavior, see D.1.17 _Pragma.
For more information on supported C99 features, see Table C–6.
The C compiler’s readme file highlights important information about the compiler, including:
Information discovered after the manuals were printed
New and changed features
Software corrections
Problems and workarounds
Limitations and incompatibilities
To view the text version of the C readme file, type the following at a command prompt:
example% cc -xhelp=readme |
To access the HTML version of the readme, in your Netscape Communicator 4.0 or compatible version browser, open the following file:
/opt/SUNWspro/docs/index.html
(If your C compiler-software is not installed in the /opt directory, ask your system administrator for the equivalent path on your system.) Your browser displays an index of HTML documents. To open the readme, find its entry in the index, then click the title.
Online manual (man) pages provide immediate documentation about a command, function, subroutine, or collection of such things.
You can display a man page by running the command:
example% man topic |
Throughout the C documentation, man page references appear with the topic name and man section number: cc(1) is accessed with man cc. Other sections, denoted by ieee_flags(3M) for example, are accessed using the -s option on the man command:
example% man -s 3M ieee_flags |
The C compilation system consists of a compiler, an assembler, and a link editor. The cc command invokes each of these components automatically unless you use command-line options to specify otherwise.
Table A–15 discusses all the options available with cc.
The following figure shows the organization of the C compilation system.
The following table summarizes the components of the compilation system.
Table 1–1 Components of the C Compilation System
Component |
Description |
Notes on Use |
---|---|---|
Preprocessor |
-Xs only |
|
Compiler (preprocessor built in for non-Xs modes) | ||
Static synchronization bug detection |
(SPARC) |
|
Code optimizer |
-O, -xO2, -xO3, -xO4, -xO5, -fast |
|
Assembler | ||
Code generator, inliner, assembler |
(SPARC) |
|
Interprocedural Optimizer |
(SPARC) |
|
Postoptimizer |
(SPARC) |
|
Intermediate code translator |
(x86) |
|
Code generator |
(x86) |
|
Interprocedure analyzer |
(x86) |
|
Linker | ||
Manipulate comment section |
-mr |
There are a number of tools available to aid in developing, maintaining, and improving your C programs. The two most closely tied to C, cscope and lint, are described in this book. In addition, a man page exists for each of these tools.
Other tools for source browsing, debugging and performance analysis are available. See Accessing Sun Studio Documentation for more information.