この章では、Sun Studio C コンパイラに関する基本的な情報を紹介します。
C コンパイラの現在のリリースには、次の新機能と変更された機能があります。
アプリケーションコードの中に _m128/_m64 データ型を使用するパラメータまたは戻り値が関係する関数が含まれている場合は、x86 プラットフォームの Solaris OS、または Linux OS 上のコンパイラで作成されたオブジェクトファイルと、コンパイラの以前のバージョンには互換性がありません。このような関数を呼び出す .il インライン関数ファイル、アセンブラコード、または asm インライン文を使用しているユーザーは、この非互換性について認識する必要があります。
-xtarget の新しい値は、woodcrest、penryn、nehalem、core2 の各 x86 プロセッサ、および ultraT2plus と sparc64vii の各 SPARC プロセッサ用です。
-xarch の新しい値は、ssse3、sse4__1、sse4__2 の各 x86 アーキテクチャー、および sparcima の各 SPARC アーキテクチャー用です。
—xchip の新しい値は、sparc64vii、ultraT2plus の各 SPARC プロセッサ用です。—xchip の新しい値は、core2、penryn、 nehalem の各 x86 プロセッサ用です。
-xprofile=collect と -xprofile=use の各オプションは、マルチスレッド化された動的リンクアプリケーションのサポートを改善します。
-xcrossfile=1 オプションは、-xipo=1 オプションの別名になります。-xcrossfile=0 オプションは、もう効果がなくなりました。明示的に表記すると、-xcrossfile=1 および -xcrossfile=0 は、-xipo=1 と同等です。
Solaris プラットフォームでは、-xpec[=yes| no] オプションを指定すると、自動チューニングシステム (Automatic Tuning System、ATS) と組み合わせて使用するために再コンパイル可能な PEC バイナリを生成します。
-Y オプションは、i を引数として受け入れません。
SPARCSPARC プラットフォームでは、-xdepend オプションは -x03 レベル以上の最適化では暗黙的に有効になり、-fast オプションの展開の中にはもう含まれなくなりました。
OpenMP 3.0 のサポートには、libmtsk ライブラリが含まれます。OpenMP プログラムは、Solaris OS 内の libmtsk ライブラリの代わりに、デフォルトでこのライブラリにリンクします。
-xannotate[=yes|no ] (SPARC プラットフォームのみ) は、binopt(1) のようなバイナリ変更ツールを使用してあとで変換できるバイナリを作成するようコンパイラに指示します。
-Wi オプションはもう、内部手続きオプティマイザに引数を渡す目的では受け入れられなくなりました。
-xsb および -xsbfast の各オプションは廃止され、削除されました。
新しいフラグ [no%]init_local が、-xcheck オプションに追加されています。
__FUNCTION__ と __PRETTY_FUNCTION__ は定義済みの識別子であり、字句を包含する関数の名前が含まれています。これらは、c99 の定義済みの識別子である __func__ に相当する機能です。Solaris プラットフォームの -Xs および -Xc の各モードでコンパイルするときは、これらは使用できません。
標準 C では、switch 文内にある case のラベルに、ただ 1 つの値を関連付けることができます。Sun Studio C コンパイラでは、case 範囲 として知られる、一部のコンパイラに見られる拡張を許可しています。
条件付きの式では、2 番目のオペランドを省略できます。最初のオペランドが 0 以外である場合は、条件付きの式の値は、最初のオペランドと同じ値になります。
読み取り専用メモリー内で文字列リテラルの配置を有効および無効にする -features=[no%] conststrings オプションでは、デフォルトは -features=conststrings であり、これは非推奨の -xstrconst オプションを置き換えます。
プリプロセッサのインクルードファイルを指定するための -include filename オプションが追加されました。
プリプロセッサの ## 演算子に関する新しい動作: コンパイラは、未定義の ## 演算に対して警告の診断を発行するようになりました (C 規格、3.4.3 節)。未定義とは、## を前処理したときの結果に、単一のトークンではなく、複数のトークンが含まれていることを意味します (C 規格、6.10.3.3(3) 節)。未定義の ## 演算の結果は、現在では、## のオペランドを連結することによって作成された文字列をプリプロセスすることによって生成された個別のトークンのうち最初のものと定義されます。
グローバル asm 文。基本的な asm 文は、asm(assembly code) と表現されます。この文は、与えられたアセンブラテキストをアセンブリファイルに直接出力します。関数スコープではなくファイルスコープで宣言された基本的な asm 文は、「グローバル asm 文」と呼びます。ほかのコンパイラはこの文を「トップレベル asm 文」と呼びます。
x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
従来の Sun 仕様の並列化プログラムは、x86 では使用できません。代わりに OpenMP を使用してください。従来の並列化指令を OpenMP へ変換する方法については、『Sun Studio: OpenMP API ユーザーズガイド』を参照してください。
-xarch を sse、sse2、sse2a、または sse3 以降に設定してコンパイルしたプログラムは、必ずこれらの拡張と機能を提供するプラットフォームでのみ実行してください。
Solaris 9 4/04 以降の Solaris OS リリースは、Pentium 4 互換プラットフォームでは SSE/SSE2 に対応しています。これより前のバージョンの Solaris OS は SSE/SSE2 に対応していません。-xarch で選択した命令セットが、実行中の Solaris OS で有効ではない場合、コンパイラはその命令セットのコードを生成またはリンクできません。
コンパイルとリンクを個別に行う場合は、必ずコンパイラを使ってリンクし、同じ -xarch 設定で正しい起動ルーチンがリンクされるようにしてください。
x86 の 80 ビット浮動小数点レジスタが原因で、x86 での演算結果が SPARC の結果と異なる場合があります。この差を最小にするには、-fstore オプションを使用するか、ハードウェアが SSE2 をサポートしている場合は -xarch=sse2 でコンパイルします。
Solaris と Linux でも、固有の数学ライブラリ (たとえば、sin(x)) が同じではないため、演算結果が異なることがあります。
Solaris システムの Sun Studio 11 以降では、Sun Studio コンパイラによってコンパイルされたプログラムのバイナリには、そのコンパイル済みバイナリによって想定されている命令セットを示すアーキテクチャーハードウェアフラグが付いています。実行時にこれらのマーカーフラグが検査され、実行しようとしているハードウェアで、そのバイナリが実行できることが確認されます。
これらのアーキテクチャーハードウェアフラグを含まないプログラムを、適切な機能または命令セット拡張に対応していないプラットフォームで実行すると、セグメント例外、または明示的な警告メッセージなしの不正な結果が発生することがあります。
このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3 の命令、およびより新しい命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。
ILP32 32 ビットモデル用にコンパイルするには、—m 32 オプションを使用します。ILP64 64 ビットモデル用にコンパイルするには、—m64 オプションを使用します。
C 言語の int、long、およびポインタデータ型を指定する ILP32 モデルは、すべて 32 ビット拡張です。long およびポインタデータ型を指定する LP64 モデルは、すべて 64 ビット拡張です。Solaris および Linux OS は、LP64 メモリーモデルの大きなファイルや配列もサポートします。
—m64 を使用してコンパイルを行う場合、結果の実行可能ファイルは、64 ビットカーネルを実行する Solaris OS または Linux OS 配下の 64 ビット UltraSPARC(R) プロセッサまたは x86 プロセッサでのみ動作します。コンパイル、リンク、および 64 ビットオブジェクトの実行は、64 ビット実行をサポートする Solaris または Linux OS でのみ行うことができます。
このマニュアルで使用される C99 という用語は、ISO/IEC 9899:1990 の C プログラミング言語を表します。C90 という用語は、ISO/IEC 9899:1990 の C プログラミング言語を意味します。
Solaris プラットフォーム上では、このコンパイラは、C99 規格に完全に準拠しています (-xc99=all,lib —Xc を指定した場合)。
このコンパイラはまた、『Programming Language - C (ISO/IEC 9899:1999)』規格にも準拠しています。
このコンパイラは従来の K&R C (Kernighan と Rithcie、つまり ANSI C の前段階) もサポートしているため、ISO C への移行が容易に行えます。
C90 の実装固有の動作については、「D.1.17 _Pragma」を参照してください。
C99 機能の詳細は、表 C–6 を参照してください。
C コンパイラの readme ファイルでは、次に示すようなコンパイラに関する重要な情報について説明しています。
マニュアルの印刷後に判明した情報
新規および変更された機能
ソフトウェアの非互換性
問題および解決方法
制限および互換性の問題
Sun Studio のこのリリースと以前のリリースに関する C コンパイラの Readme は、Sun Developer Network の Sun Studio ポータル http://developers.sun.com/sunstudio/documentation で入手できます。
オンラインマニュアル (man) ページは、コマンド、関数、サブルーチン、およびそれらの集合について即座に参照できるマニュアルを提供します。
次のコマンドを実行することにより、C コンパイラのマニュアルページを表示できます。
example% man cc |
C のマニュアル全体を通して、マニュアルページのリファレンスは、トピック名とマニュアルのセクション番号で表示されます。cc(1) を表示するには、man cc と入力 します。たとえば ieee_flags(3M) など、ほかのセクションを表示するには、man コマンドに -s オプションを使用します。
example% man -s 3M ieee_flags |
C コンパイルシステムはコンパイラ、アセンブラ、およびリンカーから構成されます。cc コマンドは、コマンド行オプションでほかの指定をしないかぎり、この 3 つの構成要素をそれぞれ自動的に起動します。
表 A–15 では、cc コマンドで使用できるオプションについて説明しています。
次の図に C コンパイルシステムの構成を示します。
コンポーネント |
内容の説明 |
使用時の注意 |
---|---|---|
プリプロセッサ (前処理系) |
-Xs のみ |
|
コンパイラ (-Xs 以外のモードではプリプロセッサが組み込まれている) | ||
静的同期バグ検出 |
(SPARC) |
|
コードオプティマイザ |
-O、-xO2、-xO3、-xO4、-xO5、-fast |
|
アセンブラ | ||
コード生成、インライン機能、アセンブラ |
(SPARC) |
|
内部手続きオプティマイザ |
(SPARC) |
|
ポストオプティマイザ |
(SPARC) |
|
中間コード翻訳 |
(x86) |
|
コードジェネレータ |
(x86) |
|
リンカー | ||
コメントセクションの操作 |
-mr |
C プログラムの開発、保守、改良を行うときに役立つツールは多数あります。本書では、C にもっとも密接な 2 つのツール、cscope と lint について説明します。また、ツールごとにマニュアルページが用意されています。