この章では、Oracle Solaris Studio C コンパイラに関する基本的な情報を紹介します。
C コンパイラの現在のリリースには、次の新機能と変更された機能があります。
ABI の変更により再コンパイルが必要に C コンパイラの変更により、複雑な型が含まれる構造体が 64 ビットモードの SPARC プロセッサで渡されて返される方法が修正されます。以前は、これらの構造体の値は間違ったレジスタで渡されて返され、gcc により作成されるバイナリと互換性がないバイナリが作成されることがありました。この変更は、C コンパイラに実装されている既存の ABI の要素に影響を与えるため、複雑なフィールドを持つ構造体を使用するソースファイルがアプリケーション内にある場合は、間違った応答が返される可能性をなくすため、そのアプリケーションのソースベース全体を再コンパイルする必要があります。32 ビットの SPARC プロセッサ向けと、32 ビットまたは 64 ビットの x86 プロセッサ向けのコンパイルは、この変更の影響を受けません。
SPARC-V9 ISA の SPARC VIS3 バージョンのサポートが追加されました。-xarch=sparcvis3 オプションを使用してコンパイルすると、SPARC-V9 命令セットの命令、UltraSPARC および UltraSPARC-III 拡張機能、積和演算 (FMA) 命令、および VIS (Visual Instruction Set) バージョン 3.0 をコンパイラが使用できるようになります。(「B.2.74 -xarch=isa」)
x86 ベースのシステムに基づく -xvector オプションのデフォルト値が -xvector=simd に変更されました。(「B.2.157 -xvector[= a]」)
AMD SSE4a 命令セットのサポートが -xarch=amdsse4a オプションで使用できるようになりました。(「B.2.74 -xarch=isa」)
-traceback オプションを使用すると、重大なエラーが発生した場合に実行可能ファイルでスタックトレースを出力できます。(「B.2.62 -traceback[={ %none|common|signals_list}]」)
-mt オプションが -mt=yes または -mt=no に変更されています。(「B.2.50 -mt[={ yes|no}]」)
#warning コンパイラ指令により、指令内のテキストが警告として発行され、コンパイルが続行されます。(「2.10 警告とエラー」)
新しいプラグマ does_not_read_global_data、does_not_write_global_data、および no_side_effect が追加されました。(「2.11 プラグマ」)
ヘッダーファイル mbarrier.h を使用できるようになりました。このヘッダーファイルは、SPARC プロセッサと x86 プロセッサでマルチスレッドコードのさまざまなメモリーバリアー組み込み関数を定義します。(「3.9 メモリーバリアー組み込み関数」)
-xprofile=tcov オプションが拡張されて、オプションのプロファイルディレクトリパス名がサポートされるようになりました。また、tcov 互換のフィードバックデータも生成できます。(「B.2.136 –xprofile=p」)
このリリースでは、-xMD オプションと -xMMD オプションにより記述された依存関係ファイルにより、既存のファイルがすべて上書きされます。(「B.2.111 -xMD」)
x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
-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 システムの Solaris Studio 11 以降では、Solaris 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 または 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 ファイルでは、コンパイラに関する重要な情報について説明しています。これは、『Oracle Solaris Studio 12.2 リリースの新機能』ガイドの一部となりました。次の内容が含まれています。
マニュアルの印刷後に判明した情報
新規および変更された機能
ソフトウェアの非互換性
問題および解決方法
制限および互換性の問題
『新機能』ガイドを参照するには、http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation にある Oracle Solaris Studio 12.2 のドキュメントページにアクセスしてください。
オンラインマニュアル (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) |
|
中間コード翻訳 |
(x86) |
|
コードジェネレータ |
(x86) |
|
リンカー | ||
コメントセクションの操作 |
-mr |
C プログラムの開発、保守、改良を行うときに役立つツールは多数あります。本書では、C にもっとも密接な 2 つのツール、cscope と lint について説明します。また、ツールごとにマニュアルページが用意されています。