この章では、Oracle Solaris Studio のこのリリースのコンパイラに関する新機能および変更された機能について説明します。
次に、C、C++、および Fortran コンパイラに共通する、前のリリースからの重要な変更点を一覧します。詳細は、コンパイラのマニュアルページおよびユーザーガイドを参照してください。
コンパイラは、SPARC-V9 ISA の SPARC VIS3 バージョンをサポートします。-xarch=sparcvis3 オプションを指定してコンパイルすると、コンパイラは、SPARC-V9 命令セットの命令に加えて、Visual Instruction Set (VIS) バージョン 1.0 を含む UltraSPARC 拡張機能、Visual Instruction Set (VIS) バージョン 2.0 の積和演算 (FMA) 命令を含む UltraSPARC-III 拡張機能、および Visual Instruction Set (VIS) バージョン 3.0 を使用できます。
x86 ベースのシステムでは、-xvector オプションのデフォルトが -xvector=simd に変更されました。最適化レベル 3 以上でメリットがある場合、x86 ベースのシステムではストリーミング拡張機能がデフォルトで使用されます。サブオプション no%simd を使用することで、それを無効にできます。SPARC ベースのシステムでは、デフォルトは -xvector=%none です。
AMD SSE4a 命令セットのサポートを使用できるようになりました。-xarch=amdsse4a オプションによりコンパイルします。
マニュアルページで、-xtarget の値 ultra3、ultra3i、ultra3cu、ultra4、および ultra4plus が正しく展開されるように更新されました。
新しい -traceback オプションを使用すると、サーバーエラーが発生した場合に実行可能ファイルはスタックトレースを出力できます。このオプションを指定すると、実行可能ファイルは、一連のシグナルをトラップして、実行の前にスタックトレースとコアダンプを出力します。複数のスレッドがシグナルを生成する場合、最初のスレッドに対するスタックトレースだけが生成されます。トレースバックを使用するには、f95、cc、または CC とプログラムをリンクするときに、-traceback オプションを追加します。便宜上、このオプションはコンパイル時にも受け付けられますが、無視されます。-traceback オプションと -G オプションを使用して共有ライブラリを作成すると、エラーが発生します。-traceback オプションについての詳細は、コンパイラのマニュアルページを参照してください。
-mt オプションは、-mt=yes または -mt=no に変更されました。-mt=yes オプションにより、ライブラリが適切な順序でリンクされることが保障されます。詳細は、コンパイラのマニュアルページを参照してください。
新しいプラグマが C および C++ に追加されました。詳細は、コンパイラのユーザーガイドを参照してください。
#warning コンパイラディレクティブ (C および C++) は、ディレクティブ内のテキストを警告として発行し、コンパイルを続行します。
ヘッダーファイル mbarrier.h (C および C++) が使用できるようになりました。このヘッダーファイルでは、SPARC および x86 プロセッサでのマルチスレッドコード用のさまざまなメモリーバリアー組み込み関数が定義されています。詳細は、コンパイラのユーザーガイドを参照してください。
-xprofile=tcov[: prof_dir] オプションは、省略可能なプロファイルディレクトリのパス名引数を受け付けます。プロファイルディレクトリのパス名を指定した場合は、コンパイル済みのプログラムは、tcov(1) または -xprofile=use:prof_dir を指定したフィードバックコンパイルで使用できるデータを生成します。詳細は、コンパイラのユーザーガイドを参照してください。
このリリースでは、-xMD および -xMMD オプション (C/C++) によって書き込まれる依存関係ファイルは、以前の既存ファイルを上書きします。ファイル名は、-o filename (指定されている場合)、入力ソースファイル名に .d 接尾辞を追加したもの、または -xMF オプションで指定されているファイル名が使用されます。-o filename または -xMF filename が -xMD または -xMMD オプションとともに指定されている場合は、単一のソースファイルのみが受け付けられます。この方法で複数のソースファイルをコンパイルするとエラーが発生します。
次に、C コンパイラのバージョン 5.11 のこのリリースでの新機能および変更された機能を一覧します。詳細は、『Oracle Solaris Studio 12.2: C ユーザーガイド』および cc のマニュアルページを参照してください。
C コンパイラに対する変更により、64 ビットモードの SPARC で複合型を含む struct が受け渡される方法が修正されました。以前は、このような struct 値は誤ったレジスタで受け渡される場合があり、gcc コンパイラによって作成されたバイナリと互換性のないバイナリが作成されました。この変更によって Solaris Studio の C コンパイラで実装されている既存の ABI の要素が影響を受けるので、アプリケーションのソースファイルが複合型のフィールドを含む struct を使用している場合は、アプリケーションのソースベース全体を再コンパイルして、正しくない応答が返される可能性を回避する必要があります。32 ビットの SPARC プロセッサ、および 32 ビットまたは 64 ビットの x86 プロセッサに関するコンパイルには、この変更による影響はありません。
次に、C++ コンパイラのバージョン 5.11 のこのリリースでの新機能および変更された機能を一覧します。詳細は、『Oracle Solaris Studio 12.2: C++ ユーザーズガイド』および CC のマニュアルページを参照してください。
-g オプションとともに -O または -xO オプションを指定し、+ オプションを指定しないと、インライン化が生成されます。次に例を示します。
CC -g foo.cc は、インライン化のないデバッグ可能な a.out を生成します
CC -g -O foo.cc は、インライン化のあるデバッグ可能な a.out を生成します
CC -g0 foo.cc は、インライン化のあるデバッグ可能な a.out を生成します
C++ のオプション -xalias_level=compatible は、プログラムが C++ 標準の要件を満たすことを表明します。
-features=[no%] rvalueref オプションは、非 const 参照のコンパイラの処理を一時または右辺値に戻します。
次に、Fortran コンパイラのバージョン 8.5 のこのリリースでの新機能および変更された機能を一覧します。詳細は、『Oracle Solaris Studio 12.2: Fortran ユーザーズガイド』および f95 のマニュアルページを参照してください。
新しい -xkeepframe[=[ %all,%none, name, no% name] オプションは、名前付き関数のスタック関係の最適化を禁止します。%all は、すべてのコードに対するスタック関係の最適化を禁止します。%none は、すべてのコードに対するスタック関係の最適化を許可します。デフォルトは -xkeepframe=%none です。
IVDEP 指令は、最適化の目的でループ内で検索する配列参照の一部または全部のループによる依存関係を無視するよう、コンパイラに指示します。これによりコンパイラは、この指令がなければ不可能だったさまざまなループ最適化を実行できます。-xivdep オプションを使用すると、IVDEP 指令を無効にしたり、指令の解釈方法を指定したりできます。
次に、このリリースの C、C++、および Fortran コンパイラによって実装される OpenMP 3.0 共有メモリー API の新機能および変更された機能を一覧します。詳細は、『Oracle Solaris Studio 12.2: OpenMP API ユーザーガイド』を参照してください。
dbx デバッガでの OpenMP デバッグのサポートdbx に対して次の拡張が行われました。
OpenMP の領域、タスク、およびスレッドセットについての情報を表示するための新しいコマンド。
print —s、thread —info、whatis、および where の各コマンドに対する拡張。
新しい OpenMP 同期イベント。
自動スコープ宣言がタスク領域に拡張されました。この機能により、プログラマは並列領域およびタスク領域内の変数のスコープを明示的に決定する必要がなくなります。コンパイラが、コードを分析してスマートルールを適用することで、変数のスコープを決定します。
新しい SUNW_MP_WAIT_POLICY 環境変数は、プログラムでのスレッドの待機動作を改善し、処理を待機 (アイドル) するスレッド、バリアーで待機するスレッド、および taskwait で待機するスレッドの動作をプログラマが細かく制御できるようにします。
SUNW_MP_WARN OpenMP 環境変数に新しい機能が追加されました。OpenMP 実行時ライブラリによって発行される警告メッセージの制御に加えて、SUNW_MP_WARN を TRUE に設定すると、ユーザーによって明示的に設定された環境変数やライブラリによってデフォルトで設定される環境変数など、すべての環境変数の設定が実行時ライブラリによって情報提供用に出力されます。
Oracle Solaris プラットフォームでの SUNW_MP_PROCBIND 環境変数によって制御される動作が変わりました。SUNW_MP_PROCBIND を TRUE に設定すると、メインスレッドはバインド時に実行しているプロセッサにバインドされます。バインド時とは、並列領域が最初に発生するとき、または omp_set_num_threads() など OpenMP の実行時ルーチンを最初に呼び出すときを指します。スレーブスレッドは、メインスレッドがバインドされているプロセッサから始めてラウンドロビン方式でバインドされます。
OpenMP プログラムでのデータの競合およびデッドロックを検出するには、スレッドアナライザツールを使用します。このリリースでは、スレッドアナライザの機能が、再コンパイルを行わなくてもバイナリ内のデータの競合を検出できるように拡張されました。詳細は、『Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド』を参照してください。