更新日付: 2004年 5 月 27 日

Sun[tm] Studio 9、C コンパイラ Readme

目次

  1. はじめに
  2. Sun Studio 9、C コンパイラについて
  3. 新規および変更された機能
  4. ソフトウェアの修正事項
  5. 問題点と回避策
  6. 制限事項と互換性の問題
  7. 記述の誤りの訂正

 


A. はじめに

この文書には、Sun[tm] Studio 9、C コンパイラに関する情報が記載されています。このリリースで導入された新機能、ソフトウェアの修正事項、既知の問題点、制限事項、互換性の問題について説明します。この文書の記載内容は、このリリースのマニュアルの記載内容に優先します。

製品マニュアル

この文書のテキスト版を表示するには、コマンドプロンプトで次のコマンドを入力します。

   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 に変更

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 チップを活用することを意図しています。新しいフラグは次のとおりです。

実際のコンパイル時の適切な -xarch-xchip、および -xtarget のフラグの組み合わせは、次のガイドラインに基づいて決定することができます。

-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 の形式は次のとおりです。

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
このレベルでは、たいていの場合で安全でない、または検査することの難しいソースコードの構文がないかどうかを検査します。このレベルの検査には、以下があります。

このレベルで警告が生成されるソースコードはバグと考えてください。問題のコードを変更することを推奨します。どんな場合でも、単純明快でより安全な別の方法があります。

lint -errsecurity=standard
このレベルの検査には、core レベルの検査に加えて、安全かもしれないが、より良い別の方法がある構文の検査があります。新しく作成したコードの検査には、このレベルを推奨します。このレベルで追加される検査には、以下があります。

このレベルで警告を生成するソースコードは、新しいコードまたは大幅に修正したコードに書き換えてください。ただし、従来のコードに含まれるこうした警告に対処することと、アプリケーションを不安定にするリスクとのバランスを検討してください。

lint -errsecurity=extended
このレベルでは、core および standard レベルの検査を含む完全な検査が行われます。また、状況によっては安全でない可能性がある構文について、多数の警告が生成されます。このレベルの検査は、コードを見直す際の一助になりますが、許容しうるソースコードが守る必要のある基準と考える必要はありません。このレベルで追加される検査には、以下があります。

このレベルで警告が生成されるコードを見直して、安全上の潜在的な問題があるかどうかを判定することができます。

-errsecurity の値が指定されていない場合、コンパイラは -errsecury=%none に設定します。-errsecurity は指定されているが、引数が指定されていない場合は、-errsecurity=standard に設定します。

 


D. ソフトウェアの修正事項

現時点では新しい情報はありません。

 


E. 問題点と回避策

ここでは、これまでにわかっているソフトウェアの問題点とその回避策について説明します。最新情報またはパッチについては、http://developers.sun.com/prodtech/cc/support_index.html を参照してください。


F. 制限事項と互換性の問題

ここでは、制限事項およびシステムまたはその他のソフトウェアとの互換性の問題について説明します。Sun Studio 9 リリースの最新情報については、http://docs.sun.com から入手可能なリリースノートを確認してください。

この文書の発行時点で判明している問題点はありません。


G. 記述の誤りの訂正

現時点では新しい情報はありません。

 


Copyright © 2004 Sun Microsystems, Inc., All rights reserved. Use is subject to license terms.