更新日付: 2004年 5 月 27 日 |
Sun[tm] Studio 9、C コンパイラ Readme |
目次
A. はじめに
この文書には、Sun[tm] Studio 9、C コンパイラに関する情報が記載されています。このリリースで導入された新機能、ソフトウェアの修正事項、既知の問題点、制限事項、互換性の問題について説明します。この文書の記載内容は、このリリースのマニュアルの記載内容に優先します。
製品マニュアル
- リリースノート (Solaris プラットフォーム): http://docs.sun.com から入手可能です。リリースノートの情報は、各製品の Readme ファイルの情報に優先します。
- Sun Studio 9 のドキュメント: 製品のマニュアルページ、README の HTML バージョン、およびマニュアルは、/installation_directory/SUNWspro/docs/ja/index.html からアクセスできます。デフォルトの installation_directory は /opt です。index.html ページから以下のマニュアルにアクセスできます。
- C ユーザーズガイド
- C++ ユーザーズガイド
- 数学ライブラリ Readme
- 数値計算ガイド
- インクリメンタルリンカー Readme
- Sun Performance Library Readme
- Sun Performance Library Reference Manual
- Sun Performance Library User's Guide for Fortran and C
- 統合開発環境 (IDE) のドキュメント: IDE にある「ヘルプ」メニューから Sun Studio 9 IDE の各コンポーネントのオンラインヘルプにアクセスできます。
- 開発者向けリソースのポータル: 技術資料、サンプルコード、ドキュメント、ナレッジベースについては、開発者向けポータルの http://developers.sun.com/prodtech/cc を参照してください。
この文書のテキスト版を表示するには、コマンドプロンプトで次のコマンドを入力します。
cc -xhelp=readme
この文書の HTML 版を表示するには、デフォルトのインストールディレクトリにある次のファイルを開きます。
file:/opt/SUNWspro/docs/index.html注 - Sun Studio 9 ソフトウェアが /opt 以外のディレクトリにインストールされている場合は、ご使用のシステムにおける実際のパスを、システム管理者に確認してください。
B. Sun Studio 9、C コンパイラについて
このリリースの C コンパイラは、SPARC (R); プラットフォーム版 Solaris[tm] オペレーティング環境のバージョン 8、9、10、および x86 プラットフォーム版 Solaris オペレーティング環境のバージョン 8、9、10 で利用できます。
Solaris 10 より前のオペレーティングシステム上では、このコンパイラは、ISO/IEC 9899:1999, Programming Language - C 規格に規定されている言語機能の大部分に対応しています。Solaris 10 では、このコンパイラは、C99 規格に完全に準拠しています (-xc99=all,lib を指定した場合)。このコンパイラはまた、ISO/IEC 9899:1990, Programming Languages - C 規格にも準拠しています。
今回の開発リリースの 64 ビット SPARC アーキテクチャ機能は、C の国際規格と -xarch=v9 に対応しています。
C. 新規および変更された機能
ここでは、このリリースで C コンパイラの新しく追加された機能と変更された機能について説明します。
-xarch のデフォルトを v8plus に変更
- -xarch、-xcode、-xmemalign、および -xprefetch オプションのデフォルトを変更、-fast および -O オプションの展開の変更によるパフォーマンスの向上
- Intel アーキテクチャ向けに -xarch、-xtarget、および -xchip のフラグと -flteval オプションを追加
- -xlibmopt、-xnolibmopt、-xipo_archive、および -xprefetch_auto_type オプションによる実行時パフォーマンスの向上
- -xpch でのプリコンパイル済みヘッダーファイルの自動生成によるコンパイル時パフォーマンスの向上
- -xchip および -xtarget のフラグの追加による SPARC のサポート拡張
- extern インライン関数、指示付きの初期化子、汎用文字名 など、Solaris 10 上での 1999 C ISO 機能の完全サポート
- lint ユーティリティのセキュリティ検査機能の追加
C コンパイラがコードを生成するときのデフォルトのアーキテクチャが、v8plus (UltraSPARC) になりました。今後のリリースで、v7 のサポートは廃止される予定です。
新しいデフォルトでは、現在使用されているほぼあらゆるマシンで実行時のパフォーマンスが向上します。ただし、UltraSPARC 以前のコンピュータへの配備を意図したアプリケーションは、そうしたコンピュータ上ではデフォルトで動作しなくなります。アプリケーションがそうしたコンピュータで動作するようにするには、-xarch=v8 でコンパイルしてください。
v8 システムに配備する場合は、各コンパイラコマンド行だけでなく、すべてのリンク時コマンドでも -xarch=v8 オプションを明示的に指定する必要があります。提供のシステムライブラリは、v8 アーキテクチャで動作します。
v7 システムに配備する場合は、各コンパイラコマンド行だけでなく、すべてのリンク時コマンドでも -xarch=v7 オプションを明示的に指定する必要があります。提供のシステムライブラリは、v8 命令セットを利用します。Sun Studio 9 リリースの場合、v7 についてサポートされているオペレーティングシステムは、Solaris 8 リリースだけです。v8 命令が検出された場合、Solaris 8 オペレーティングシステムはソフトウェアでその命令を解釈します。このためプログラムは実行されますが、パフォーマンスは低下します。
x86 の場合、-xarch はデフォルトで generic になります。x86 の場合、-fast は -xarch=native に展開されることに注意してください。
-xarch の詳細は、C マニュアルページの cc(1) を参照してください。
-xcode のデフォルトを変更(SPARC のみ) v9 の場合、デフォルトは -xcode=abs44 です。v8 の場合は、-xcode=abs32 のままです。
-xcode の詳細は、C マニュアルページの cc(1) を参照してください。
-xmemalign のデフォルトを変更(SPARC のみ) v8 アーキテクチャの場合、-xmemalign は -xmemalign=8i になります。v9 アーキテクチャの場合は、デフォルトは -xmemalign=8s です。
-xmemalign の詳細は、C マニュアルページの cc(1) を参照してください。
-xprefetch のデフォルトを変更(SPARC のみ) -xprefetch のデフォルトが -xprefetch=auto,explicit になりました。基本的に非線形のメモリーアクセスパターンを持つアプリケーションには、この変更が良くない影響をもたらします。この変更を無効にするには、-xprefetch=no%auto,no%explicit を指定します。
-xprefetch の詳細は、C マニュアルページの cc(1) を参照してください。
-fast の展開を変更-fast オプションが -xlibmopt にも展開されるようになりました。
-O の展開を変更(SPARC および x86) -O マクロは、-xO2 ではなく、-xO3 に展開されるようになりました。
このデフォルトの変更によって、実行時のパフォーマンスが向上します。ただし、あらゆる変数を自動的に volatile と見なすことを前提にするプログラムの場合、-xO3 は不適切になることがあります。このことを前提とする代表的なプログラムとしては、専用の同期方式を実装するデバイスドライバや古いマルチスレッドアプリケーションがあります。回避策は、-o ではなく、-xO2 を使ってコンパイルすることです。
-O の詳細は、C マニュアルページの cc(1) を参照してください。
Intel アーキテクチャ向けの -xarch、-xtarget、-xchip のフラグを追加C コンパイラが、Intel 向けに -xarch、-xtarget、および -xchip 用の新しいフラグをサポートするようになりました。これらの新しいフラグは、Intel プラットフォーム上での Solaris ソフトウェアによる sse および sse2 命令のサポートとの組み合わせで Pentium 3 および Pentium 4 チップを活用することを意図しています。新しいフラグは次のとおりです。
- -xchip=pentium3 は Pentium 3 方式のプロセッサ用に最適化します。
- -xchip=pentium4 は Pentium 4 方式のプロセッサ用に最適化します。
- -xtarget=pentium3 は、-xarch=sse、-xchip=pentium3、-xcache=16/32/4:256/32/4 に設定します。
- -xtarget=pentium4 は、-xarch=sse2、-xchip=pentium4、-xcache=8/64/4:256/128/8 に設定します。
- -xarch=sse は、pentium_pro 命令セットアーキテクチャに SSE 命令セットを追加します。
- -xarch=sse2 は、SSE が許可する命令セットに SSE2 命令セットを追加します。
x86 に関する特記事項
Solaris x86 SSE/SSE2 Pentium 4 互換プラットフォームで動作するよう -xarch={sse | sse2} を付けてコンパイルしたプログラムは、SSE/SSE2 対応のプラットフォームでのみ実行する必要があります。SSE/SSE2 に対応していないプラットフォームでそうしたプログラムを実行すると、セグメント例外が発生したり、明示的な警告メッセージなしに不正な結果が発生したりすることがあります。SSE/SSE2 でコンパイルされたバイナリが SSE/SSE2 に対応していないプラットフォームで実行されることのないようにするための OS およびコンパイラに対するパッチが、後日提供されるかもしれません。Pentium 4 互換プラットフォームの場合、Solaris 9 update 6 以降の OS リリースが SSE/SSE2 に対応しています。これより前のバージョンの Solaris OS は SSE/SSE2 に対応していません。
このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE/SSE2 命令を利用している __asm() アセンブラコードにも当てはまります。
コンパイルとリンクを別々に行う場合は、必ずコンパイラを使ってリンクし、-xarch={sse | sse2} で適切な起動ルーチンがリンクされるようにしてください。
実際のコンパイル時の適切な -xarch、-xchip、および -xtarget のフラグの組み合わせは、次のガイドラインに基づいて決定することができます。
Solaris 9 update 6 か、それ以前の Solaris を実行する Pentium 3 または Pentium 4 で構築を行い、-fast、-xarch=native、または -xtarget=native を指定するかどうか。
この場合、コンパイラは次のように展開します。
Solaris 9 update 5 またはそれ以前の Solaris オペレーティングシステムは、sse および sse2 命令をサポートしないため、-xarch は pentium_pro に設定されます (期待されるような pentium3 あるいは pentium4 ではありません)。
注: これらのバージョンの Solaris ソフトウェアを使用しているかどうかに関係なく、-xarch=sse あるいは -xarch=sse2 を指定することができますが、Solaris 9 update 6 以降および Solaris 10 は SSE および SSE2 命令をサポートしているため、構築で生成された実行可能ファイルは、そうしたバージョンの Solaris ソフトウェアを実行するマシンで実行する必要があります。
- -xchip は、適宜 pentium3 または pentium4 に設定されます。
-xcache は、Pentium 3 プロセッサの場合 16/32/4:256/32/4、Pentium 4 プロセッサの場合 8/64/4:256/128/8 に設定されます。
Solaris 9 update 6 以降の Solaris を実行する Pentium 3 または Pentium 4 で構築を行い、-fast、-xarch=native、または -xtarget=native を指定するかどうか。
この場合、コンパイラは次のように展開します。
- -xarch は、Pentium 3 の場合 sse、Pentium 4 の場合 sse2 に設定されます。
- -xchip は、適宜 pentium3 または pentium4 に設定されます。
- -xcache は、Pentium 3 プロセッサの場合 16/32/4:256/32/4、Pentium 4 プロセッサの場合 8/64/4:256/128/8 に設定されます。
-xarch、-xtarget、および -xchip の詳細は、C マニュアルページの cc(1) を参照してください。
-xlibmopt および -xnolibmopt オプションの追加-xlibmopt オプションは、最適化された数学ルーチンのライブラリを使用するようコンパイラに指示します。このオプションを使用するときは -fround=nearest を指定することによって、デフォルトの丸めモードを使用する必要があります。数学ルーチンライブラリは最高のパフォーマンスが得られるように最適化されており、通常、高速なコードを生成します。この結果は、通常の数学ライブラリが生成する結果と少し異なることがあります。その場合、通常、異なるのは最後のビットです。
このライブラリは、コマンド行で新たに追加された -xnolibmopt オプションを指定することによって明示的に無効にすることができます。
-xlibmopt および -xnolibmopt の詳細は、C マニュアルページの cc(1) を参照してください。
-xipo_archive オプションの追加新しい -xipo_archive オプションは、-xipo を使ってコンパイルされ、実行可能ファイルを生成する前にアーカイブライブラリ (.a) に存在するオブジェクトファイルを使って、リンカーに渡すオブジェクトファイルを最適化するよう指示します。コンパイル中に最適化されたライブラリに含まれるオブジェクトファイルはすべて、その最適化されたバージョンに置き換えられます。
-xipo_archive の詳細は、cc(1) のマニュアルページを参照してください。
-xprefetch_auto_type を追加新しいオプション -xprefetch_auto_type を利用することによって、直接メモリーアクセスに対してプリフェッチが生成されるのと同じ方法で、-xprefetch_level=[1|2|3] が指示するループに対して間接プリフェッチを生成することができます。
-xdepend、-xrestrict、-xalias_level などのオプションと組み合わせると、-xprefetch_auto_type の最適化のメリットを増すことができます。これらのオプションはメモリー別名のあいまいさを排除する情報を生成するのに役立つため、間接プリフェッチ候補の計算の積極性に影響し、自動的な間接プリフェッチの挿入を促進します。
-xprefetch_auto_type オプションの詳細は、cc(1) のマニュアルページを参照してください。
-xpch によるプリコンパイル済みヘッダーファイルの自動生成このリリースの C コンパイラでは、プリコンパイル済みのヘッダー機能が拡張され、コンパイラの側でプリコンパイル済みヘッダーファイルを自動的に生成できるようになっています。ただし、これまでどおり、プリコンパイル済みヘッダーファイルを手動で生成することもできます。コンパイラの新しい機能の詳細は、cc(1) のマニュアルページの -xpch オプションの説明をお読みください。また、CCadmin(1) のマニュアルページも参照してください。
-xchip および -xtarget のフラグの追加による SPARC のサポート拡張(SPARC のみ) -xchip および -xtarget オプションが、値として ultra3i および ultra4 をサポートするようになりました。このため、UltraSPARC IIIi および UltraSPARC IV 用に最適化されたアプリケーションを構築できます。
extern インライン関数のサポートインライン関数の定義および extern インライン関数が、1999 C ISO 規格の仕様どおりに機能するようになりました。
インライン関数定義とは、キーワード inline を使い、static または extern キーワードなしで定義された関数です。ソース (またはインクルードファイル) 内に含まれるあらゆるプロトタイプにも、static または extern キーワードなしでキーワード inline が含まれます。
インライン関数定義は、関数に外部定義を提供しません。インライン定義を含むソースファイルに現れる関数呼び出しはどれも、呼び出し位置で関数定義をインライン化するか、外部定義された関数を参照することによって実現されます。
最適化による利点を考慮した結果、コンパイラは、-xO3 以上が指定された場合にのみインライン定義に対する呼び出しをインライン化します。これ以外の場合は、外部関数に対する呼び出しが行われます。このため、インライン定義を含むプログラムは、extern 関数定義を含むオブジェクトファイルとリンクさせることを推奨します。
関数定義とともに (あるいは関数定義を伴うファイル内の任意のプロトタイプ宣言上で) extern および inline 両方のキーワードを使用すると、外部関数がそのオブジェクトファイル内に定義されます。C++ のリンクとの互換性を維持するため、extern インライン関数の定義を複数含むオブジェクトをリンクする場合、リンカーは、そうした関数のうちの 1 つだけを選択し、すべての外部参照を実現します。
規格に適合した動作を実現するには、最新のコンパイラを使って古いコードをコンパイルする必要があります。ただし、古い C および C++ バイナリ (C/C++ 5.6 より前) で extern インライン関数を使用していて、その古いバイナリの動作を変更することなく、新しい C および C++ バイナリとリンクする場合は、-features=no%extinl を指定します。
-features の詳細は、C マニュアルページの cc(1) を参照してください。
指示付きの初期化子指示付きの初期化子は、数値プログラミングで一般的なスパース配列を初期化する仕組みです。
指示付きの初期化子によって、システムプログラミングで一般的なスパース構造体を初期化したり、先頭メンバーであるかどうかに関係なく、任意のメンバーを使って共用体を初期化したりできます。
例を挙げて考えてみます。最初の例は、指示付きの初期化子を使用して配列を初期化する方法を示しています。
enum { first, second, third }; const char *nm[] = { [third] = "third member", [first] = "first member", [second] = "second member", };次の例は、指示付きの初期化子を使用して構造体のフィールドを初期化する方法を示しています。
division_t result = { .quot = 2, .rem = -1 };この例は、指示付きの初期化子を使用し、これ以外の方法では誤解を生むおそれがある複雑な構造体を初期化する方法を示しています。
struct { int z[3], count; } w[] = { [0].z = {1}, [1].z[0] = 2 };1 つの指示子で両端から配列を作成することができます。
int z[MAX] = {1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0};MAX が 10 より大きい場合、この配列の中央には値ゼロの要素が含まれます。MAX が 10 より小さい場合、最初の 5 つの初期化子が提供する値の一部は、2 つ目の 5 つ値によって置き換えられます。共用体のすべてのメンバーを初期化することができます。
union { /* ... */ } u = { .any_member = 42 };汎用文字名 (UCN)UCN では、C のソースで英字ばかりでなく、任意の文字を使用することができます。UCN の形式は次のとおりです。
- \u 4 桁の 16 進値
- \U 8 桁の 16 進値
UCN には、00A0 未満で 0024 ($)、0040 (@)、0060 (?) 以外の値、あるいは D800 〜 DFFF の範囲の値を指定できません。
識別子や文字定数、文字列リテラルで UCN を使用して、C の基本文字セットにはない文字を表すことができます。
UCN \Unnnnnnnn は、8 桁の短い識別子 (ISO/IEC 10646 で定義) が nnnnnnnn の文字を表します。同様に汎用文字名 \unnnn は、4桁の短い識別子が nnnn (または 8 桁の短い識別子が 0000nnnn) の文字を表します。
-flteval オプションの追加(Intel のみ) このオプションは、浮動小数点式の評価方法の制御に使用します。
-flteval の詳細は、cc(1) のマニュアルページを参照してください。
lint のセキュリティ検査機能の追加このリリースの lint ユーティリティには、新しいセキュリティ検査機能が追加されています。コンパイルの前に新しい -errsecurity オプションを使用し、セキュリティに問題がないかどうかコードを検査することができます。
-errsecurity[={core, standard, extended, %none}]
lint -errsecurity=coreこのレベルでは、たいていの場合で安全でない、または検査することの難しいソースコードの構文がないかどうかを検査します。このレベルの検査には、以下があります。
- printf() および scanf() 系の関数での変数書式文字列の使用
- scanf() 関数における非結合文字列 (%s) 形式の使用
- 安全な使用法のない関数の使用 (gets()、cftime()、ascftime()、creat())
- O_CREAT と組み合わせた open() の不正使用
このレベルで警告が生成されるソースコードはバグと考えてください。問題のコードを変更することを推奨します。どんな場合でも、単純明快でより安全な別の方法があります。
lint -errsecurity=standardこのレベルの検査には、core レベルの検査に加えて、安全かもしれないが、より良い別の方法がある構文の検査があります。新しく作成したコードの検査には、このレベルを推奨します。このレベルで追加される検査には、以下があります。
- strlcpy() 以外の文字列コピー関数の使用
- 脆弱な乱数関数の使用
- 安全でない関数を使った一時ファイルの生成
- fopen() を使ったファイルの作成
- シェルを呼び出す関数の使用
このレベルで警告を生成するソースコードは、新しいコードまたは大幅に修正したコードに書き換えてください。ただし、従来のコードに含まれるこうした警告に対処することと、アプリケーションを不安定にするリスクとのバランスを検討してください。
lint -errsecurity=extendedこのレベルでは、core および standard レベルの検査を含む完全な検査が行われます。また、状況によっては安全でない可能性がある構文について、多数の警告が生成されます。このレベルの検査は、コードを見直す際の一助になりますが、許容しうるソースコードが守る必要のある基準と考える必要はありません。このレベルで追加される検査には、以下があります。
- ループ内での getc() または fgetc() の呼び出し
- パス名競合になりがちな関数の使用
- exec() 系の関数の使用
- stat() と他の関数との間の競合
このレベルで警告が生成されるコードを見直して、安全上の潜在的な問題があるかどうかを判定することができます。
-errsecurity の値が指定されていない場合、コンパイラは -errsecury=%none に設定します。-errsecurity は指定されているが、引数が指定されていない場合は、-errsecurity=standard に設定します。
D. ソフトウェアの修正事項
現時点では新しい情報はありません。
E. 問題点と回避策
ここでは、これまでにわかっているソフトウェアの問題点とその回避策について説明します。最新情報またはパッチについては、http://developers.sun.com/prodtech/cc/support_index.html を参照してください。
- 5044272 -flteval=2 のとき、単純なコードシーケンスで SIGSEGV になる
コンパイラが、誤って ldouble を double に変換しています。次のテストは、この問題が発生する例です。
% cat t.c #pragma STDC FENV_ACCESS ON #pragma STDC FP_CONTRACT OFF int NumFail = 0; int NumPass = 0; int main(void) { double d = 5.; auto double d3_aut = 3; d3_aut = 3; if (d == (d3_aut += 2.L)) { NumPass++; } else { NumFail++; } return (NumFail); } % cc t.c -flteval=2 % ./a.out % echo $status 1- 5044281 -flteval=2 モードのとき非常に単純な構造に不正なコードが生成される
% more t.c #include <stdio.h> static const float f_one = 1.f; static const float f_zero = 0.f; int main(void) { int NumFail = 0, NumPass = 0; if ((f_zero ? f_one : f_zero) == f_zero) { NumPass++; } else { NumFail++; } return (NumFail); } % cc t.c -flteval=2 % ./a.out % echo $status 1- 5044322 -flteval=2 のとき、for: ld = f += 1.f; に不正なコードが生成される
ynh% cat t.c int NumFail = 0uL; int NumPass = 0uL; long double ld; float f; int main() { f = 0x1p-23f / 2.f; ld = f += 1.f; if (ld == 1.L) { NumPass++; } else { NumFail++; } return (NumFail); } ynh% /set/mercury/dist/intel-S2/bin/cc t.c -flteval=2 ynh% ./a.out ynh% echo $status 1 ynh%
F. 制限事項と互換性の問題
ここでは、制限事項およびシステムまたはその他のソフトウェアとの互換性の問題について説明します。Sun Studio 9 リリースの最新情報については、http://docs.sun.com から入手可能なリリースノートを確認してください。
この文書の発行時点で判明している問題点はありません。
G. 記述の誤りの訂正
現時点では新しい情報はありません。
Copyright © 2004 Sun Microsystems, Inc., All rights reserved. Use is subject to license terms.