この章では、C コンパイラオプションについてアルファベット順に説明します。機能別のオプションは、付録 A 機能別コンパイラオプションを参照してください。たとえば、表 A–1 には、最適化とパフォーマンスのすべてのオプションがまとめられています。
C コンパイラは、デフォルトでは 1999 ISO/IEC C 規格の構文の一部を認識します。特に、サポートされている機能については、付録 D C99 でサポートされている機能を参照してください。コンパイラで 1990 ISO/IEC C 規格の機能だけを使用する場合は、-xc99=none コマンドを使用します。
K&R (Kernighan と Ritchie) C プログラムを ISO C に移植する場合、互換性フラグに関する節、「B.2.68 -X[c|a|t|s]」をよく参照してください。それらのオプションを使用することで、ISO C への移行が容易になります。また、「5.4 メモリー参照の制限の例」の移行に関する説明も参照してください。
% cc [options] filenames [libraries]... |
ここで
options は、表 A–15 で説明している各種のオプションで、複数指定可能です。
filename; は、実行可能プログラムの作成に使用するファイル名で、複数指定可能です。
C コンパイラは filename;で指定されたファイルリストに含まれている C ソースファイルとオブジェクトファイルのリストを受け取ります。生成された実行可能コードは、-o オプションを使用した場合を除いて a.out に出力されます。-o オプションを使用した場合には、コードは -o オプションで指定したファイルに出力されます。
C コンパイラを使用すると、次のファイルのどのような組み合わせに対しても、コンパイルとリンクを行うことができます。
接尾辞 .c の C ソースファイル
接尾辞 .il のインラインテンプレートファイル (.c ファイルで指定される場合のみ)
接尾辞 .i の前処理済みソースファイル
接尾辞 .o のオブジェクトコードファイル
接尾辞 .s のアセンブラソースファイル
リンク後、C コンパイラは実行可能コードの形式になったリンク済みファイルを、a.out ファイルまたは -o オプションで指定したファイルに出力します。コンパイラが .i または .c の各入力ファイルに対応するオブジェクトコードを生成する場合は、現在の作業ディレクトリにオブジェクト (.o) ファイルを作成します。
ライブラリは複数の標準ライブラリやユーザー提供のライブラリです。ライブラ リには関数、マクロ、そして定数の定義が含まれます。
オプションライブラリの検索に使用するデフォルトのディレクトリを変更する場合は、-YP,dir を参照してください。dir には、複数のパスをコロンで区切って指定します。デフォルトのライブラリ検索順序を表示するには、-### または -xdryrun オプションを使用し、ld 起動時の -Y オプションを検査します。
cc は getopt を使用してコマンド行オプションの構文を解析します。オプションは単一文字、または後ろに引数を 1 つとる単一文字によって指定します。getopt(3c) を参照してください。
この節では、cc オプションについてアルファベット順に説明します。これらの説明は cc(1) のマニュアルページでも見ることができます。1 行に要約した説明が必要な場合は、cc -flags オプションを使用してください。
特定のプラットフォームに固有と表記されたオプションを別のプラットフォームで使用してもエラーは起きません。単に無視されます。
冗長モードをオンに設定し、コマンドオプションの展開を表示します。要素が呼び出されるごとにその要素を表示します。
呼び出された各構成要素が表示されますが、実行はされません。また、コマンドオプションの展開内容を表示します。
#assert 前処理指令に似せて、指定の tokens を使用し name を述語として関連付けます。事前表明 (preassertion) は次のとおりです。
system(unix)
machine(sparc) (SPARC)
machine(i386) (x86)
cpu(sparc) (SPARC)
cpu(i386) (x86)
-Xc モードの場合、これらの事前表明は有効になりません。
-A のあとに続く文字がハイフン (-) だけの場合は、事前定義のマクロ ( __ から始まる以外のマクロ) および事前定義の表明はすべて失われます。
リンク時に結合するライブラリを静的と動的のどちらにするかを指定します。static (静的) と指定するとライブラリが非共有ライブラリであることを示し、dynamic (動的) と指定すると共有ライブラリであることを示します。
-Bdynamic を指定すると、-lx オプションが指定されていれば、リンカーは libx.so というファイルを探し、次に libx.a というファイルを探します。
-Bstatic を指定すると、リンカーは libx.a というファイルだけを探します。このオプションは、コマンド行中で何度も指定して、切り替えることができます。このオプションと引数は ld(1) に渡されます。
Solaris の 64 ビットコンパイル環境では、多くのシステムライブラリ (libc など) は、動的ライブラリのみ使用することができます。このため、コマンド行の最後に -Bstatic を使用しないでください。
このオプションと引数はリンカーに渡されます。
C プリプロセッサがコメントを削除しないようにします。ただし前処理指令の行にあるコメントは削除されます。
C コンパイラ ld(1) によるリンクを行わず、ソースファイルごとに o ファイルを作成します。-o オプションを使用すると、1 つのオブジェクトファイルを明示的に指定することができます。コンパイラが .i または .c の各入力ファイルに対応するオブジェクトコードを生成する場合は、現在の作業ディレクトリにオブジェクト (.o) ファイルを作成します。リンクを行わないと、オブジェクトファイルの削除も行われません。
#define 前処理マクロが指令によって定義されるのと同様に、オプションの引数を使用してマクロを定義します。=expansion が指定されていない場合は、コンパイラは 1 であると仮定します。
コンパイラの定義済みマクロのリストについては、cc(1) のマニュアルページを参照してください。
-dy はリンクエディタに動的なリンクを指定します (デフォルト)。
-dn はリンクエディタに静的なリンクを指定します。
このオプションとその引数は ld(1) に渡されます。
このオプションを動的ライブラリと組み合わせて使用すると、重大なエラーが発生します。ほとんどのシステムライブラリは、動的ライブラリでのみ使用できます。
(SPARC) 廃止。このオプションは使わないでください。代わりに -xmemalign=8s を使用してください。詳細は、「B.2.116 -xmemalign=ab」 を参照してください。廃止オプションの全一覧は、「A.1.15 廃止オプション」を参照してください。x86 プラットフォームでは、このオプションはメッセージを表示せずに無視されます。
プリプロセッサのみでソースファイルを処理し、出力を stdout に送ります。プリプロセッサはコンパイラ内部に直接組み込まれます。/usr/ccs/lib/cpp が直接呼び出される -Xs モードの場合は除きます。プリプロセッサの行番号付け情報も含みます。-P オプションも参照してください。
このオプションは、エラーメッセージの最初に「error:」という接頭辞を追加して、警告メッセージと区別しやすくする場合に使用します。接頭辞は、-errwarn によってエラーに変換された警告にも追加されます。
表 B–1 -errfmt のフラグ
フラグ |
意味 |
---|---|
error |
すべてのエラーメッセージに接頭辞「error: 」を追加します。 |
no%error |
エラーメッセージに接頭辞「error: 」を追加しません。 |
このオプションを指定しない場合は、-errfmt=no%errorに設定されます。-errfmt を値なしで指定した場合は、コンパイラでは -errfmt=error が指定されます。
ヘッダーファイルからの警告を、次のフラグによって示されたヘッダーファイルグループに限定します。
表 B–2 —errhdr オプション
値 |
意味 |
---|---|
%all |
使用しているすべてのヘッダーファイルを検査します。 |
%none |
ヘッダーファイルを検査しません。 |
%user |
/usr/include とそのサブディレクトリにあるものを除き、すべてのユーザーヘッダーファイルを検査します。また、コンパイラによって提供されたすべてのヘッダーファイルを検査します。これはデフォルト値です。 |
このコマンドは、C コンパイラの警告メッセージを無効にします。エラーメッセージには影響しません。このオプションは、-errwarn でゼロ以外の終了状態を発生させるように指定されているかどうかにかかわらず、すべての警告メッセージに適用されます。
t には、次の 1 つまたは複数の項目をコンマで区切って指定します。tag、no%tag、%all、%none。指定順序によって実行内容が異なります。たとえば、「%all,no%tag」と指定すると、tag 以外のすべての警告メッセージを抑制します。次の表は、-erroff の値を示しています。
表 B–3 -erroff のフラグ
フラグ |
意味 |
---|---|
tag |
tag のリストに指定されているメッセージを抑制します。-errtags=yes オプションで、メッセージのタグを表示することができます。 |
no%tag |
tag 以外のすべての警告メッセージを抑制します。 |
%all |
すべての警告メッセージを抑制します。 |
%none |
すべてのメッセージの抑制を解除します (デフォルト)。 |
デフォルトは -erroff=%none です。-erroff と指定すると、-erroff=%all を指定した場合と同じ結果が得られます。
-erroff オプションで無効にできるのは、C コンパイラのフロントエンドで -errtags オプションを指定したときにタグを表示する警告メッセージだけです。無効にするエラーメッセージをさらに詳細に設定することができます。「2.11.6 error_messages」を参照してください。
このオプションは、コンパイラで型の不一致が検出されたときに生成されるエラーメッセージの詳細さを設定する場合に使用します。大きな集合体が関係する型の不一致がコンパイラで検出される場合にこのオプションを使用すると特に便利です。
i には、次のいずれかを指定します。
表 B–4 -errshort のフラグ
フラグ |
意味 |
---|---|
short |
エラーメッセージは、型の展開なしの簡易形式で出力されます。集合体のメンバー、関数の引数、戻り値の型は展開されません。 |
full |
エラーメッセージは、完全な冗長形式で出力されます。不一致の型が完全に展開されます。 |
tags |
エラーメッセージは、タグ名がある型の場合はそのタグ名付きで出力されます。タグ名がない場合は、型は展開された形式で出力されます。 |
-errshort を指定しない場合は、コンパイラでは -errshort=full が指定されます。-errshort を値なしで指定した場合は、コンパイラでは -errshort=tags が指定されます。
このオプションは累積されず、コマンド行で最後に指定した値が有効になります。
C コンパイラのフロントエンドで出力される警告メッセージのうち、-erroff オプションで無効にできる、または -errwarn オプションで重大なエラーに変換できるメッセージのメッセージタグを表示します。C コンパイラのドライバおよび C のコンパイルシステムのほかのコンポーネントから出力されるメッセージにはエラータグが含まれないため、-erroff で無効にしたり、-errwarn で重大なエラーに変換したりすることはできません。
a には yes または no のいずれかを指定します。デフォルトは -errtags=no です。-errtags だけを指定すると、-errtags=yes を指定するのと同じことになります。
指定した警告メッセージが生成された場合に、重大なエラーを出力して C コンパイラを終了する場合は、-errwarn オプションを使用します。
t には、次の 1 つまたは複数の項目をコンマで区切って指定します。tag、no%tag、%all、%none。このとき、順序が重要になります。たとえば、%all,no%tag と指定すると、tag 以外のすべての警告メッセージが生成された場合に、重大なエラーを出力して cc を終了します。
C コンパイラで生成される警告メッセージは、コンパイラのエラーチェックの改善や機能追加に応じて、リリースごとに変更されます。-errwarn=%all を指定してエラーなしでコンパイルされるコードでも、コンパイラの次期リリースではエラーを出力してコンパイルされる可能性があります。
-errwarn オプションを使用して、障害状態で C コンパイラを終了するように指定できるのは、C コンパイラのフロントエンドで -errtags オプションを指定したときにタグを表示する警告メッセージだけです。
-errwarn の値を次の表に示します。
表 B–5 -errwarn のフラグ
フラグ |
意味 |
---|---|
tag |
tag に指定されたメッセージが警告メッセージとして発行されると、cc は致命的エラーステータスを返して終了します。tag に指定されたメッセージが発行されない場合は無効です。 |
no%tag |
tag に指定されたメッセージが警告メッセージとしてのみ発行された場合に、cc が致命的なエラーステータスを返して終了しないようにします。tag に指定されたメッセージが発行されない場合は無効です。このオプションは、tag または %all を使用して以前に指定したメッセージが警告メッセージとして発行されても cc が致命的エラーステータスで終了しないようにする場合に使用してください。 |
%all |
警告メッセージが何か発行される場合にコンパイラが致命的なエラーステータスを返して終了します。%all に続いて no%tag を使用して、特定の警告メッセージを対象から除外することもできます。 |
%none |
どの警告メッセージが発行されてもコンパイラが致命的なエラーステータスを返して終了することがないようにします。 |
デフォルトは -errwarn=%none です。-errwarn だけを指定した場合、-errwarn=%all を指定したことと同じになります。
このオプションは、実行ファイルの実行時のパフォーマンスのチューニングで効果的に使用することができるマクロです。-fast は、コンパイラのリリースによって変更される可能性があるマクロで、ターゲットのプラットフォーム固有のオプションに展開されます。-# オプションまたは -xdryrun を使用して -fast の展開を調べ、-fast の該当するオプションを使用して実行可能ファイルのチューニングを行なってください。
-fast の展開には、コンパイラが最適化済み数学ルーチンのライブラリを使用できるようにする -xlibmopt オプションが含まれます。詳細は、「B.2.104 -xlibmopt」を参照してください。
-fast オプションは、errno の値に影響します。詳細は、「2.13 errno の値の保持」を参照してください。
-fast を指定してコンパイルしたモジュールは、-fast を指定してリンクする必要があります。「A.1.2 コンパイル時とリンク時のオプション」に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
-fast オプションは、特にコンパイルするマシンとは異なるターゲットで実行するプログラムでは使用できません。そのような場合は、-fast のあとに適切な -xtarget オプションを指定します。次に例を示します。
cc -fast -xtarget=generic ... |
SUID によって規定された例外処理に依存する C モジュールに対しては、-fast のあとに -xnolibmil を指定します。
% cc -fast -xnolibmil |
-xlibmil を使用すると、例外発生時でも errno が設定されず、また、matherr(3m) が呼び出されません。
-fast オプションは、厳密な IEEE 754 規格準拠を必要とするプログラムには適していません。
次に、-fast により指定されるオプションをプラットフォームごとに示します。
表 B–6 -fast 展開時のフラグ
オプション |
SPARC |
x86 |
---|---|---|
X |
X |
|
X |
X |
|
X |
X |
|
- |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
- |
|
-xO5 |
X |
X |
-xprefetch=auto,explicit |
X |
- |
-xregs=frameptr |
- |
X |
-xtarget=native |
X |
X |
一部の最適化では、プログラムの動作が特定の動作になることを想定しています。プログラムの動作がその想定に適合していない場合は、アプリケーションがクラッシュする、または誤った結果が生成されることがあります。プログラムが -fast を指定したコンパイルに適しているかどうかを特定するには、各オプションの説明を参照してください。
これらのオプションにより最適化を実行した場合は、プログラムの動作が ISO C および IEEE の規格での定義と異なることがあります。詳細については、各オプションの説明を参照してください。
-fast はコマンド行でマクロ展開のように動作します。したがって、最適化レベルとコード生成の内容を -fast のあとに指定したオプションで指定した場合は、-fast での指定は無視されます。「-fast -xO4」でコンパイルすることは「-xO2 -xO4」の組み合わせでコンパイルすることと同じで、後ろの指定が優先されます。
x86 では、—fast オプションに —xregs=frameptr が含まれます。特に C、Fortran、および C++ の混合ソースコードをコンパイルする場合は、その詳細について、このオプションの説明を参照してください。
このオプションは、IEEE 規格例外処理に依存するプログラムには使用しないでください。数値結果が異なったり、プログラムが途中で終了したり、予想外の SIGFPE シグナルが発生する可能性があります。
実行中のプラットフォームで -fast の実際の展開を表示するには、次のものを使用します。
% cc -fast -xdryrun |
値 |
意味 |
---|---|
[no%]conststrings |
読み取り専用メモリー内で文字列リテラルの配置を有効または無効にします。デフォルトは -features=conststrings であり、文字列リテラルを読み取り専用データセクションに配置します。文字列リテラルのあるメモリー上の位置に書き込みを行おうとするプログラムを、このオプションを指定してコンパイルすると、セグメント例外が発生することに注意してください。 |
extensions |
サイズがゼロの構造体または共用体の宣言、および有効な値を返す return 文を持つ void 関数を使用できます。 |
extinl |
extern インライン関数を大域関数として生成します。これがデフォルトで、1999 C 規格に準拠しています。-features=no%extinl を指定して新しいコードをコンパイルすると、extern インライン関数は、C および C++ コンパイラの古いバージョンで提供されていたのと同じ処理を受けます。 |
no%extinl |
extern インライン関数を静的関数として生成します。 |
%none |
このオプションを無効にします。 |
古い C および C++ オブジェクト (このリリースより前の Solaris Studio コンパイラで作成されたオブジェクト) は、そのオブジェクトの動作変更なしに、新しい C および C++ オブジェクトとリンクできます。規格に適合した動作を実現するには、最新のコンパイラを使って古いコードをコンパイルする必要があります。
-features に値を指定しない場合は、-features=extinl に設定されます。
(x86) このオプションは、浮動小数点式の評価方法の制御に使用します。
表 B–8 -flteval のフラグ
フラグ |
意味 |
---|---|
2 |
浮動小数点式を long dboule 型で評価します。 |
any |
式を構成している変数および定数の型の組み合わせに基づいて浮動小数点式を評価します。 |
-flteval が指定されない場合は、-flteval=any に設定されます。値を付けずに -flteval が指定された場合は、-flteval=2 に設定されます。
-flteval=2 を指定する場合、次のオプションは指定してはいけません。
「D.1.1 浮動小数点評価における精度」も参照してください。
(SPARC) 浮動小数点の積和演算 (FMA) 命令の自動生成を有 効にします。-fma=none を指定すると、これらの命令の生成を無効にします。-fma=fused を指定すると、コンパイラは浮動小数点の積和演算 (FMA) 命令を使用して、コードのパフォーマンスを改善する機会を検出しようとします。
デフォルトは -fma=none です。
コンパイラが積和演算 (FMA) 命令を生成するための最小要件は、-xarch=sparcfmaf と、最適化レベルが -xO2 以上であることです。積和演算 (FMA) 命令をサポートしていないプラットフォームでプログラムが 実行されないようにするため、コンパイラは積和演算 (FMA) 命令を生成する場合、バイナリプログラムにマーク付けをします。
積和演算 (FMA) により、積と和 (乗算と加算) の間で中間の丸め手順が排除されます。その結果、-fma=fused を指定してコンパイルしたプログラムは、精度は減少ではなく増加する傾向にありますが、異なる結果になることがあります。
(SPARC) このオプションは、-fns および -ftrap=common 用のマクロです。
(SPARC) SPARC の非標準の浮動小数点モードに切り替えます。
デフォルトは -fns=no であり、SPARC 標準の符号小数点モードと同じです。 -fns は、-fns=yes と同じことを意味します。
オプションの =yes または =no を使用すると、-fast のように、-fns を含むほかのマクロフラグに続く -fns フラグを切り替えることができます。
一部の SPARC システムでは、非標準の浮動小数点モードは「段階的アンダーフロー」を無効にします。つまり、小さな結果は、非正規数にはならず、ゼロに切り捨てられます。また、非正規オペランドはメッセージなしにゼロに変更されます。このような SPARC システムでは、ハードウェアの段階的アンダーフローや非正規数がサポートされておらず、このオプションを使用するとプログラムのパフォーマンスを著しく改善することができます。
非標準モードを有効にすると、浮動小数点演算は IEEE 754 規格に準拠しない結果を生成する場合があります。詳細は、『数値計算ガイド』を参照してください。
このオプションは、SPARC システム上だけで有効であり、さらに、メインプログラムをコンパイルするときに使用する場合だけ有効です。x86 システムでは、このオプションは無視されます。
(x86) SSE flush-to-zero モードを選択します。利用可能な場合には、denormals-are-zero モードが選択されます。
このオプションは、非正規数の結果をゼロにフラッシュします。また利用可能な場合には、非正規数オペランドもゼロとして扱われます。
このオプションは、SSE や SSE2 命令セットを利用しない従来の x86 浮動小数点演算には影響しません。
-KPIC と同義です。
-Kpic と同義です。
(x86) -fprecision={single, double, extended}
浮動小数点制御ワードの丸め精度モードのビットを、単精度 (24 ビット)、倍精度 (53 ビット) または拡張精度 (64 ビット) に設定します。デフォルトの浮動小数点丸め精度モードは拡張モードです。
x86 では、浮動小数点丸め精度モードの設定は精度に対してのみ影響します。指数の有効範囲に対しては影響しません。
このオプションは、x86 システムでメインプログラムのコンパイル時に使用する場合にのみ有効で、64 ビット (-m64) または SSE2 対応 (-xarch=sse2) プロセッサでコンパイルする場合は無視されます。SPARC システムでも無視されます。
プログラム初期化中に、実行時に確立される IEEE 754 丸めモードを設定します。
r は、nearest、 tozero、negative、positive のいずれかです。
デフォルトは、-fround=nearest です。
ieee_flags サブルーチンと同等です。
r を tozero、negative、positive のいずれかにすると、プログラムが実行を開始するときに、丸め方向モードがそれぞれ、ゼロの方向に丸める、負の無限の方向に丸める、正の無限の方向に丸めるに設定されます。r が nearest のとき、あるいは -fround フラグを使用しないとき、丸め方向モードは初期値から変更されません (デフォルトは nearest)。
このオプションは、メインプログラムをコンパイルするときにだけ有効です。
オプティマイザが浮動小数点演算に関する前提事項を単純化できるようにします。
デフォルトは -fsimple=0 です。-fsimple は -fsimple=1 と同義です。
n を指定する場合、0、1、2 のいずれかにしなければいけません。
表 B–9 -fsimple のフラグ
本来浮動小数点例外を発生しないプログラムならば、-fsimple=2 を指定してもオプティマイザが浮動小数点例外を発生させることはありません。
最適化が精度に与える影響の詳細は、『Techniques for Optimizing Applications: High Performance Computing』(Rajat Garg と Ilya Sharapov 著) をお読みください。
-Xt モードまたは -Xs モードの場合にかぎり、float 式を倍精度ではなく単精度で評価します。-Xa モードまたは -Xc モードを使用している場合、 float 式はすでに単精度として評価されているのでこのオプションは無効です。
(x86) 浮動小数点式または関数が、ある変数に代入されるか、より小さい型の浮動小数点にキャストされる場合に、コンパイラがその値をレジスタに残さないで、代入値の左側に表記される型に変換するようにします。小数点の丸めおよび切り上げを行うため、結果はレジスタの値から生成される数値と異なる可能性があります。これは、デフォルトのモードです。
このオプションを解除するには、オプション -nofstore を使用してください。
SIGFPE ハンドラを組み込まずに、起動時に有効にする IEEE トラップモードの設定のみ行います。トラップの設定と SIGFPE ハンドラの組み込みを同時に行うには、ieee_handler(3M) か fex_set_handling(3M) を使用します。複数の値を指定すると、それらの値は左から右に処理されます。
t には次の値のいずれかを指定できます。
表 B–10 -ftrap フラグ
フラグ |
意味 |
---|---|
[no%]division |
ゼロによる除算をトラップします [しません]。 |
[no%]inexact |
正確でない結果をトラップします [しません]。 |
[no%]invalid |
無効な操作をトラップします [しません]。 |
[no%]overflow |
オーバーフローをトラップします [しません]。 |
[no%]underflow |
アンダーフローをトラップします [しません]。 |
%all |
前述のすべてをトラップします。 |
%none |
前述のどれもトラップしません。 |
common |
無効、ゼロ除算、オーバーフローをトラップします。 |
[no%] 形式のオプションは、下の例に示すように、%all や commonフラグの意味を変更するときだけ使用します。[no%] 形式のオプション自体は、特定のトラップを明示的に無効にするものではありません。
-ftrap を指定しない場合、コンパイラは -ftrap=%none とみなします。
たとえば、-ftrap=%all,no%inexact は、inexact 以外のすべてのトラップを設定することを意味します。
1 つのルーチンを -ftrap=t オプションでコンパイルした場合は、そのプログラムのルーチンすべてを、-ftrap=t オプションを使用してコンパイルしてください。途中から異なるオプションを使用すると、予想に反した結果が生じることがあります。
-ftrap=inexact のトラップは慎重に使用してください。-ftrap=inexact では、浮動小数点の値が正確でないとトラップが発生します。たとえば、次の文ではこの条件が発生します。
x = 1.0 / 3.0; |
このオプションは、メインプログラムをコンパイルするときにだけ有効です。このオプションを使用する際には注意してください。IEEE トラップを有効にするには -ftrap=common を使用してください。
動的にリンクされた実行可能ファイルではなく、共有オブジェクトを生成します。このオプションは ld(1) に渡されます。このオプションは -dn オプションと併用することはできません。
-G オプションを使用すると、コンパイラはデフォルトの -l オプションを ld に渡しません。共有ライブラリを別の共有ライブラリに依存させる場合は、必要な -l オプションをコマンド行に渡す必要があります。
コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションと -G オプションを組み合わせて共有ライブラリを作成した場合は、生成された共有オブジェクトとのリンクでも、必ず同じオプションを指定してください。
「B.2.86 -xcode[= v]」で説明しているように、共有オブジェクトの作成では、-xarch=v9 を付けてコンパイルしたすべてのオブジェクトファイルもまた、明示的な -xcode 値を付けてコンパイルする必要があります。
dbx(1) およびパフォーマンスアナライザ analyzer(1) によるデバッグ用のシンボルテーブル情報を生成します。
-xO3 以下の最適化レベルで -g を指定すると、ほとんど完全な最適化と可能なかぎりのシンボル情報を取得することができます。末尾呼び出しの最適化とバックエンドのインライン化は無効です。
-xO4 以下の最適化レベルで -g を指定すると、完全な最適化と可能なかぎりのシンボル情報が得られます。
-g オプションでコンパイルすると、パフォーマンスアナライザの機能をフルに利用できます。 一部のパフォーマンス分析機能は -g を必要としませんが、注釈付きのソースコード、一部の関数レベルの情報、およびコンパイラの注釈メッセージを確認するには、-g でコンパイルする必要があります。詳細は、analyzer(1) のマニュアルページおよび『プログラムのパフォーマンス解析』のマニュアルを参照してください。
-g オプションで生成される注釈メッセージは、プログラムのコンパイル時にコンパイラが実行した最適化と変換について説明します。メッセージを表示するには、er_src(1) コマンドを使用します。これらのメッセージはソースコードでインタリーブされます。
以前のリリースでは、このオプションは、コンパイラのリンク専用の呼び出しにおいて、デフォルトで強制的にリンカー (ld) ではなく、インクリメンタルリンカー (ild) を使用するようにしていました。すなわち、-g が指定されたときのコンパイラは、そのデフォルトの動作として、コマンド行に -G またはソースファイルの指定がなくてもオブジェクトファイルのリンクで必ず、ld の代わりに ild を自動的に呼び出していました。現在、このようなことはありません。インクリメンタルリンカーは利用できなくなりました。
デバッグの詳細については、『dbx コマンドによるデバッグ』を参照してください。
現在のコンパイルでインクルードされたファイルのパス名を 1 行に 1 つずつ標準エラーに出力します。字下げして表示されるので、ファイルがさらにファイルをインクルードする様子を見ることができます。
次で、sample.c は stdio.h ファイルと math.h ファイルをインクルードします。math.h は floatingpoint.h ファイルをインクルードし、floatingpoint.h はさらに、sys/ieeefp.h を使用する関数をインクルードします。
% cc -H sample.c /usr/include/stdio.h /usr/include/math.h /usr/include/floatingpoint.h /usr/include/sys/ieeefp.h |
共有動的ライブラリに名前を付けます。これによって、異なったバージョンのライブラリを作成できます。一般に -h のあとの name; は、-o オプションのあとに指定するファイル名と同じです。-h と name; の間の空白は任意です。
リンカーは指定された name; をライブラリに割り当て、この名前をライブラリのイントリンシック名としてライブラリファイルに記録します。-hname; オプションがない場合、イントリンシック名はライブラリファイルに記録されません。
実行時リンカーはライブラリを実行可能ファイルにロードするとき、イントリンシック名をライブラリファイルから実行可能ファイル中の、必要とする共有ライブラリファイルのリストにコピーします。実行可能ファイルはこのリストを持っています。共有ライブラリにイントリンシック名がないと、リンカーは代わりにその共有ライブラリファイルのパス名を使用します。
-I dir は、相対ファイル名、つまり、/ (スラッシュ) から始まらないディレクトリパスを持つ #include ファイルを検索するディレクトリのリスト内の /usr/include の前に dir を追加します。
複数の -I オプションが指定された場合は、指定された順序でディレクトリが調べられます。
コンパイラの検索パターンの詳細については、「2.16.1 -I- オプションによる検索アルゴリズムの変更」を参照してください。
オプションをリンカーへ渡して、LD_LIBRARY_PATH または LD_LIBRARY_PATH_64 の設定を無視します。
このオプションを指定すると、コンパイラは filename を、主要なソースファイルの 1 行目に記述されているかのように #include プリプロセッサ指令として処理します。ソースファイル t.c の考慮:
main() { ... } |
t.c を cc -include t.h t.c コマンドを使用してコンパイルする場合は、ソースファイルに次の内容が含まれているかのようにコンパイルが進行します。
#include "t.h" main() { ... } |
コンパイラが filename を検索する最初のディレクトリは現在の作業ディレクトリであり、ファイルが明示的にインクルードされている場合のようにメインのソースファイルが存在するディレクトリになるわけではありません。たとえば、次のディレクトリ構造では、同じ名前を持つ 2 つのヘッダーファイルが異なる場所に存在しています。
foo/ t.c t.h bar/ u.c t.h |
作業ディレクトリが foo/bar であり、cc ../t.c -include t.h コマンドを使用してコンパイルする場合は、コンパイラによって foo/bar ディレクトリから取得された t.h がインクルードされますが、ソースファイル t.c 内で #include 指令を使用した場合の foo/ ディレクトリとは異なります。
-include で指定されたファイルをコンパイラが現在の作業ディレクトリ内で見つけることができない場合は、コンパイラは通常のディレクトリパスでこのファイルを検索します。複数の -include オプションを指定する場合は、コマンド行で指定された順にファイルはインクルードされます。
(SPARC) 廃止。このオプションは使わないでください。代わりに -xcode=pic32 を使用してください。
詳細は、「B.2.86 -xcode[= v]」 を参照してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
(SPARC) 廃止。このオプションは使わないでください。代わりに -xcode=pic13 を使用してください。詳細は、「B.2.86 -xcode[= v]」を参照してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
(x86) 共用ライブラリ (小型モデル) で使用するための位置に依存しないコードを生成します。最大 2**11 個の独自の外部シンボルを参照できます。
コンパイル中に作成される一時ファイルを自動的に削除しないで保持します。
ld(1) がライブラリを検索するディレクトリのリストに dir を付け加えます。このオプションとその引数は ld(1) に渡されます。
コンパイラがインストールされている位置の /usr/include、 /lib、/usr/lib を検索ディレクトリに指定しないでください。
オブジェクトライブラリlib name.so または libname .a をリンクの対象とします。シンボルは左から右へ解決されるため、コマンド行でのライブラリの指定順が重要になります。
このオプションはソースファイル引数のあとに指定してください。
コンパイルされたバイナリオブジェクトのメモリーモデルを指定します。
-m32 を使用すると、32 ビット実行可能ファイルと共有ライブラリが作成されます。-m64 を使用すると、64 ビット実行可能ファイルと共有ライブラリが作成されます。
ILP32 メモリーモデル (32 ビット int、long、ポインタデータ型) は 64 ビット対応ではないすべての Solaris プラットフォームおよび Linux プラットフォームのデフォルトです。LP64 メモリーモデル (64 ビット long、ポインタデータ型) は 64 ビット対応の Linux プラットフォームのデフォルトです。-m64 は LP64 モデル対応のプラットフォームでのみ使用できます。
-m32 を使用してコンパイルされたオブジェクトファイルまたはライブラリを、-m64 を使用してコンパイルされたオブジェクトファイルまたはライブラリにリンクすることはできません。
-m32|-m64 を指定してコンパイルしたモジュールは、-m32 |-m64 を指定してリンクする必要があります。「A.1.2 コンパイル時とリンク時のオプション」に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの一覧をまとめています。
x86/x64 プラットフォームで大量の静的データを持つアプリケーションを -m64 を使用してコンパイルするときは、-xmodel=medium も必要になることがあります。一部の Linux プラットフォームは、ミディアムモデルをサポートしていません。
以前のコンパイラリリースでは、-xarch で命令セットを選択すると、メモリーモデル ILP32 または LP64 が使用されていました。Solaris Studio 12 以降のコンパイラでは、このようなことはありません。ほとんどのプラットフォームでは、-m64 をコマンド行に追加するだけで、64 ビットオブジェクトが作成されます。
Solaris では、-m32 がデフォルトです。64 ビットプログラムをサポートする Linux システムでは、-m64 -xarch=sse2 がデフォルトです。
-xarch も参照してください。
オブジェクトファイルの .comment セクションから重複している文字列を削除します。-mc フラグを使用すると、mcs -c が起動されます。
(SPARC) 廃止。このオプションは使わないでください。代わりに -xmemalign=1i オプションを使ってください。詳細は、「B.2.116 -xmemalign=ab」を参照してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
(SPARC) 廃止。このオプションは使わないでください。代わりに -xmemalign=2i オプションを使ってください。詳細は、「B.2.116 -xmemalign=ab」を参照してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
-mr は、.comment セクションからすべての文字を削除します。このフラグを使用すると、mcs -d -a が呼び出されます。
-mr, string はオブジェクトファイルの .comment セクションからすべての文字列を削除して、string を挿入します。string に空白が含まれている場合は二重引用筆囲みます。string がなければ .comment セクションは空になります。このオプションは -d -string として mcs に渡されます。
このオプションを使用して、Solaris スレッドまたは POSIX スレッドの API を使用しているマルチスレッド化コードをコンパイルおよびリンクします。-mt=yes オプションにより、ライブラリが適切な順序でリンクされることが保証されます。
このオプションは -D_REENTRANT をプリプロセッサに渡します。
Solaris スレッドを使用するには、thread.h ヘッダーファイルをインクルードし、—mt=yes オプションを使用してコンパイルします。Solaris プラットフォームで POSIX スレッドを使用するには、pthread.h ヘッダーファイルをインクルードし、—mt=yes オプションを使用してコンパイルします。
Linux プラットフォーム上では、POSIX スレッドの API のみが使用できます (Linux プラットフォームには libthread はありません)。したがって、Linux プラットフォームで —mt=yes を使用すると、—lthread の代わりに —lpthread が追加されます。Linux プラットフォームで POSIX スレッドを使用するには、—mt を使用してコンパイルします。
—G を使用してコンパイルする場合は、—mt=yes を指定しても、—lthread と —lpthread のどちらも自動的には含められません。共有ライブラリを構築する場合は、これらのライブラリを明示的にリストする必要があります。
(OpenMP 共有メモリー並列化 API を使用するための) —xopenmp オプションには、—mt=yes が自動的に含まれます。
-mt=yes を指定してコンパイルを実行し、リンクを個別の手順でリンクする場合は、コンパイル手順と同様にリンク手順でも -mt=yes オプションを使用する必要があります。-mt=yes を使用して 1 つの変換ユニットをコンパイルおよびリンクする場合は、-mt=yes を指定してプログラムのすべてのユニットをコンパイルおよびリンクする必要があります。
-mt=yes は、コンパイラのデフォルトの動作です。この動作が望ましくない場合は、-mt=no でコンパイルします。
オプション —mt は —mt=yes と同じです。
–xnolib、Solaris 『Multithreaded Programming Guide』、および『Linker and Libraries Guide』
このオプションは、-xtarget=native と同義です。
(x86)浮動小数点式または関数がある変数に代入されるか、より小さい型の浮動小数点にキャストされる場合に、代入値の左側に表記される型に変換せずに、コンパイラがその値をレジスタに残すようにします。「B.2.31 -fstore」も参照してください。
デフォルトの最適化レベルの -xO3 を使ってください。このリリースでは、-O は、-xO2 ではなく、-xO3 に展開されます。
このデフォルトの変更によって、実行時のパフォーマンスが向上します。ただし、あらゆる変数を自動的に volatile と見なすことを前提にするプログラムの場合、 -x03 は不適切なことがあります。このことを前提とする代表的なプログラムとしては、専用の同期方式を実装するデバイスドライバや古いマルチスレッドアプリケーションがあります。回避策は、-O ではなく、-xO2 を使ってコンパイルすることです。
出力ファイルに、デフォルトの a.out の代わりに filename という名前を付けます。cc はソースファイルに上書きしないので、filename には ソースファイル と同じ名前は使用できません。このオプションとその引数は ld(1) に渡されます。
ソースファイルのプリプロセッサ処理のみを行います。.i 接尾辞の付いたファイルに結果を出力します。-E オプションと異なり、出力ファイルに C のプリプロセッサ行番号付け情報は含まれません。-E オプションも参照してください。
廃止。「B.2.132 -xpg」を参照してください。
出力ファイルに識別情報を入れるかどうかを設定します。デフォルトは -Qy です。
-Qy を指定すると、起動した各コンパイラツールの識別情報が出力ファイルの .comment 部分に追加され、mcs でのアクセスが可能になります。これはソフトウェア管理に役立ちます。
-Qn を指定すると、この情報が抑制されます。
コロンで区切られたディレクトリのリストを、ライブラリ検索ディレクトリとして、実行時リンカーに渡します。リストが空でなければ、出力オブジェクトファイルに記録され、実行時リンカーに渡されます。
LD_RUN_PATH と -R オプションの両方が指定されたときは、この -R オプションが優先されます。
cc to アセンブリソースファイルを作成しますが、アセンブルは行いません。
出力されるオブジェクトファイルからシンボリックデバッグのための情報をすべて削除します。このオプションは、-g とともに指定することはできません。
ld(1) へ引き渡します。
実行時に重大エラーが発生した場合にスタックトレースを発行します。
-traceback オプションを指定すると、プログラムによって特定のシグナルが生成された場合に、実行可能ファイルで stderr へのスタックトレースが発行されて、コアダンプが実行され、終了します。複数のスレッドが 1 つのシグナルを生成すると、スタックトレースは最初のスレッドに対してのみ生成されます。
追跡表示を使用するには、リンク時に -traceback オプションをコンパイラコマンド行に追加します。このオプションはコンパイル時にも使用できますが、実行可能バイナリが生成されない場合無視されます。-traceback を -G とともに使用して共有ライブラリを作成すると、エラーが発生します。
表 B–11 -traceback オプション
オプション |
意味 |
---|---|
common |
sigill、sigfpe、sigbus、sigsegv、または sigabrt の共通シグナルのいずれかのセットが発生した場合にスタックトレースを発行することを指定します。 |
signals_list |
スタックトレースを生成するシグナルの名前を小文字で入力してコンマで区切ったリストを指定します。sigquit、sigill、sigtrap、sigabrt、sigemt、sigfpe、sigbus、 sigsegv、sigsys、sigxcpu、sigxfsz のシグナル (コアファイルが生成されるシグナル) をキャッチできます。 これらのシグナルの前に no% を付けると、シグナルのキャッチは無効になります。 たとえば、-traceback=sigsegv,sigfpe と指定すると、sigsegv または sigfpe が発生した場合にスタックトレースとコアダンプが生成されます。 |
%none または none |
追跡表示を無効にします。 |
このオプションを指定しない場合、デフォルトは -traceback=%none になります。
= 記号を指定せずに、-traceback だけを指定すると、-traceback=common と同義になります。
注: コアダンプが不要な場合は、次を使用して coredumpsize 制限を 0 に設定できます。
% limit coredumpsize 0 |
-traceback オプションは、実行時のパフォーマンスに影響しません。
プリプロセッサシンボル name; の定義を削除します。このオプションは、コマンド行ドライバで配置された要素も含む同一コマンド行において -D で作成されたプリプロセッサシンボル name; の初期定義を削除します。
-U は、ソースファイルのプリプロセッサ指令に影響しません。コマンド行に複数の -U オプションを配置できます。
コマンド行の -D と -U に同じ name が指定された場合、オプションの配置順に関係なく、name の定義が削除されます。次の図で、-U は __sun の定義のを削除します。
cc -U__sun text.c |
test.c の次の書式のプリプロセッサ文は、__sun の定義が削除されているために有効になりません。
#ifdef(__sun) |
定義済みシンボルのリストについては、「B.2.7 -Dname[(arg[,arg])][=expasion]」 を参照してください。
コンパイラの実行時に cc によって各構成要素の名前とバージョン番号を表示します。
より厳しい意味検査およびほかの lint に似た検査を行います。次は
#include <stdio.h> main(void) { printf("Hello World.\n"); } |
支障なくコンパイルと実行ができるコードです。-v を使用すると、コンパイルは行われますが次の警告が表示されます。
"hello.c", line 5: warning: function has no return statement: main |
-v は lint(1) が発する警告をすべて表示するわけではありません。lint で前述の例を実行すると確認することができます。
指定されたコンパイラ構成要素 c に、arg を渡します。コンポーネントのリストについては、表 1–1 を参照してください。
各引数はコンマで区切ります。すべての -W arg は、通常のコマンド行引数のあとに渡されます。コンマを引数に含めるには、コンマの直前にエスケープ文字 \ (バックスラッシュ) を使用します。すべての -W arg は、通常のコマンド行引数のあとに渡されます。
たとえば、-Wa,-o,objfile は、-o と objfile を、この順番でアセンブラに渡します。また、-Wl,-I,name; を指定すると、リンク段階で動的リンカー /usr/lib/ld.so.1 のデフォルト名が無効になります。
そのほかのコマンド行オプションで引数がツールに渡される順番は、変更されることがあります。
c には、次のいずれかを指定します。
表 B–12 -W のフラグ
フラグ |
意味 |
---|---|
a |
アセンブラ : (fbe); (gas) |
c |
C コードジェネレータ : (cg) (SPARC) ; |
d |
cc ドライバ |
h |
中間コード翻訳 (ir2hf)(x86) |
l |
リンクエディタ (ld) |
m |
mcs |
O (大文字の o) |
手続き間オプティマイザ |
o (小文字の o) |
ポストオプティマイザ |
p |
プリプロセッサ (cpp) |
u |
C コードジェネレータ (ube) (x86) |
0 (ゼロ) |
コンパイラ (acomp) (ssbd, SPARC) |
2 |
オプティマイザ: (iropt) |
このオプションは error_messages プラグマを無効にします。
-X (大文字の X である点に注意) オプションでは ISO C に準拠する度合いを指定します。-xc99 の値により、-X オプションが適用される ISO C 規格のバージョンが異なります。-xc99 オプションは、デフォルトでは -xc99=all になっています。この場合は、1999 ISO/IEC C 規格のサブセットをサポートします。-xc99=none を指定した場合は、1990 ISO/IEC C 規格をサポートします。サポートされている 1999 ISO/IEC の機能については、表 C–6 を参照してください。ISO/IEC C と K&R C の相違点については、「G.1 libfast.a Library (SPARC)」を参照してください。
-Xc
(c = conformance) ISO C にない言語構造を使用しているプログラムに対してエラーや警告を発行します。このオプションは ISO C に最大限に準拠するもので、K&R C との拡張互換性はありません。--Xc オプションを指定すると事前定義されたマクロ _ _STDC_ _ の値は 1 になります。
-Xa
これは、コンパイラのデフォルトのモードです。ISO C に K&R C との拡張互換性を持たせます。ISO C に従うように意味処理を変更します。同じ言語構造に対して ISO C と K&R C の意味処理が異なる場合は ISO C に準拠した解釈を行います。-Xa オプションを -xtransition オプションと併せて使用すると、異なる意味論に関する警告が出力されます。-Xa オプションを指定すると事前定義されたマクロ _ _STDC_ _ の値は -0 になります。
-Xt
(t = 遷移) このオプションでは、ISO C で求められる意味処理の変更を行わずに ISO C と K&R C の拡張互換性が使用されます。K&R C と ISO C で同じ構文に異なる意味処理が指定される場合、コンパイラは K&R C の解釈を使用します。-Xt オプションを -xtransition オプションと併せて使用すると、異なる意味論に関する警告が出力されます。-Xt オプションを指定すると事前定義されたマクロ __STDC__ の値は 0 になります。
-Xs
(s = K&R C) ISO C と K&R C の間で動作が異なるすべての言語構造に対して警告を発行します。K&R C と互換性のあるすべての機能がコンパイルされます。このオプションでは、前処理用に cpp が呼び出され、__STDC__ は定義されません。
(x86) 廃止。このオプションは使わないでください。代わりに、-xchip=generic を使用してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
(x86) 廃止。このオプションは使わないでください。代わりに、-xchip=generic を使用してください。「A.1.15 廃止オプション」に、廃止のオプションの全一覧をまとめています。
(Solaris x86/x64 のみ) コンパイラフラグ -xaddr32=yes は、結果として生成される実行可能ファイルまたは共有オブジェクトを 32 ビットアドレス空間に制限します。
この方法でコンパイルする実行可能ファイルは、32 ビットアドレス空間に制限されるプロセスを作成する結果になります。
-xaddr32=no を指定する場合は、通常の 64 ビットバイナリが作成されます。
-xaddr32 オプションを指定しないと、-xaddr32=no が使用されます。
-xaddr32 だけを指定すると、-xaddr32=yes が使用されます。
このオプションは、-m64 のコンパイルのみ、および SF1_SUNW_ADDR32 ソフトウェア機能をサポートしている Solaris プラットフォームのみに適用できます。Linux カーネルはアドレス空間の制限をサポートしていないので、Linux では、このオプションは使用できません。
単一のオブジェクトファイルが -xaddr32=yes を指定してコンパイルされた場合は、出力ファイル全体が -xaddr32=yes を指定してコンパイルされたものと、リンク時に想定されます。
32 ビットアドレス空間に制限される共有オブジェクトは、制限された 32 ビットモードのアドレス空間内で実行されるプロセスから読み込む必要があります。
詳細は、『Linker and Libraries Guide』で説明されている SF1_SUNW_ADDR32 ソフトウェア機能の定義を参照してください。
コンパイラで -xalias_level オプションを使用して、型に基づく別名の解析による最適化でのレベルを指定します。このオプションは、コンパイル対象の変換ユニットで、指定した別名レベルを有効にします。
-xalias_level コマンドを発行しない場合、コンパイラは -xalias_level=any を仮定します。値を設定しないで -xalias_level を指定する場合、デフォルトは -xalias_level=layout になります。
-xalias_level オプションを使用するには、-xO3 以上の最適化レベルが必要です。最適化がこれよりも低く設定されている場合は、警告が表示され、-xalias_level オプションは無視されます。
-xalias_level オプションを発行しても、別名レベルごとに記述されている規則と制限を遵守しない場合、プログラムが未定義の動作をします。
l を次の表のいずれかの用語で置き換えます。
表 B–13 別名明確化のレベル
(Solaris) binopt(1) のようなバイナリ変更ツールを使用してあとで変換できるバイナリを作成するようコンパイラに指示します。これらのツールによるバイナリファイルの変更を防止するには、-xannotate=no オプションを使用します。-xannotate=yes オプションを有効にするには、最適化レベル -xO1 以上で使用する必要があります。
Linux プラットフォームでは、このオプションはありません。
対象となる命令セットアーキテクチャー (ISA) を指定します。
このオプションは、コンパイラが生成するコードを、指定した命令セットアーキテクチャーの命令だけに制限します。このオプションは、すべてのターゲットを対象とするような命令としての使用は保証しません。ただし、このオプションを使用するとバイナリプログラムの移植性に影響を与える可能性があります。
意図するメモリーモデルとして LP64 (64 ビット) または ILP32 (32 ビット) を指定するには、それぞれ -m64 または -m32 オプションを使用してください。次に示すように以前のリリースとの互換性を保つ場合を除いて、-xarch オプションでメモリーモデルを指定できなくなりました。
別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xarch の値を指定してください。
次の表に、SPARC プラットフォームでの各 -xarch キーワードの詳細を示します。
表 B–14 SPARC プラットフォームでの -xarch のフラグ
フラグ |
意味 |
---|---|
generic |
ほとんどのプロセッサに共通の命令セットを使用します。これはデフォルト値です。 |
generic64 |
多くのシステムで良好な 64 ビットパフォーマンスを得るためのコンパイルをします(Solaris のみ)。 このオプションは -m64 -xarch=generic に相当し、以前のリリースとの互換性のために用意されています。64 ビットでのコンパイルを指定するには、次のものではなく -m64 を使用してください。 - xarch=generic64 |
native |
このシステムで良好なパフォーマンスを得られるようにコンパイルします。現在コンパイルしているシステムプロセッサにもっとも適した設定を選択します。 |
native64 |
このシステムで良好なパフォーマンスを得られるようにコンパイルします (Solaris のみ)。このオプションは -m64 -xarch=native に相当し、以前のリリースとの互換性のために用意されています。 |
sparc |
SPARC-V9 ISA 用のコンパイルを実行しますが、VIS (Visual Instruction Set) は使用せず、その他の実装に固有の ISA 拡張機能も使用しません。このオプションを使用して、コンパイラは、V9 ISA で良好なパフォーマンスが得られるようにコードを生成できます。 |
sparcvis |
SPARC-V9 + VIS (Visual Instruction Set) version 1.0 + UltraSPARC 拡張機能用のコンパイルを実行します。このオプションを使用すると、コンパイラは、UltraSPARC アーキテクチャー上で良好なパフォーマンスが得られるようにコードを生成することができます。 |
sparcvis2 |
UltraSPARC アーキテクチャー + VIS (Visual Instruction Set) version 2.0 + UltraSPARC-III 拡張機能用のオブジェクトコードを生成します。 |
sparcvis3 |
SPARC VIS version 3 の SPARC-V9 ISA 用にコンパイルします。SPARC-V9 命令セット、VIS (Visual Instruction Set) version 1.0 を含む UltraSPARC 拡張機能、VIS (Visual Instruction Set) version 2.0、積和演算 (FMA) 命令、および VIS (Visual Instruction Set) version 3.0 を含む UltraSPARC-III 拡張機能の命令をコンパイラが使用できるようになります。 |
sparcfmaf |
SPARC-V9 命令セット、VIS (Visual Instruction Set) version 1.0 を含む UltraSPARC 拡張機能、VIS (Visual Instruction Set) version 2.0 を含む UltraSPARC-III 拡張機能、および浮動小数点積和演算用の SPARC64 VI 拡張機能の命令をコンパイラが使用できるようになります。 -xarch=sparcfmaf は fma=fused と組み合わせて使用し、ある程度の最適化レベルを指定することで、コンパイラが自動的に積和命令の使用を試みるようにする必要があります。 |
sparcima |
sparcima 版の SPARC-V9 ISA 用にコンパイルします。コンパイラが、SPARC-V9 命令セットに加えて、VIS (Visual Instruction Set) Version 1.0 を含む UltraSPARC 拡張機能、VIS (Visual Instruction Set) Version 2.0 を含む UltraSPARC-III 拡張機能、浮動小数点の積和演算用の SPARC64 VI 拡張機能、整数の積和演算用の SPARC64 VII 拡張機能からの命令を使用できるようにします。 |
v9 |
-m64 -xarch=sparc に相当します。64 ビットメモリーモデルを得るために -xarch=v9 を使用する古いメイクファイルとスクリプトでは、-m64 だけを使用すれば十分です。 |
v9a |
-m64 -xarch=sparcvis に相当し、以前のリリースとの互換性のために用意されています。 |
v9b |
-m64 -xarch=sparcvis2 に相当し、以前のリリースとの互換性のために用意されています。 |
また、次のことにも注意してください。
generic、sparc、sparcvis2、sparcvis3、sparcfmaf、sparcima でコンパイルされたオブジェクトライブラリファイル (.o) をリンクして、一度に実行できます。ただし、実行できるのは、リンクされているすべての命令セットをサポートしているプロセッサのみです。
特定の設定で、生成された実行可能ファイルが実行されなかったり、従来のアーキテクチャーよりも実行速度が遅くなったりする場合があります。また、4 倍精度 (REAL*16 および long double) 浮動小数点命令は、これらの命令セットアーキテクチャーのいずれにも実装されないため、コンパイラは、それらの命令を生成したコードで使用しません。
次の表に、x86 プラットフォームでの -xarch フラグを示します。
表 B–15 x86 での -xarch のフラグ
フラグ |
意味 |
---|---|
amd64 |
-m64 -xarch=sse2 に相当します (Solaris のみ)。64 ビットメモリーモデルを得るために -xarch=amd64 を使用する古いメイクファイルとスクリプトでは、-m64 だけを使用すれば十分です。 |
amd64a |
-m64 -xarch=sse2a に相当します (Solaris のみ)。 |
generic |
ほとんどのプロセッサに共通の命令セットを使用します。これはデフォルトであり、—m32 でコンパイルする場合の pentium_pro、および —m64 でコンパイルする場合の sse2 に相当します。 |
generic64 |
多くのシステムで良好な 64 ビットパフォーマンスを得るためのコンパイルをします(Solaris のみ)。このオプションは -m64 -xarch=generic に相当し、以前のリリースとの互換性のために用意されています。64 ビットでのコンパイルを指定するには、次のものではなく -m64 を使用してください。 - xarch=generic64 |
native |
このシステムで良好なパフォーマンスを得られるようにコンパイルします。現在コンパイルしているシステムプロセッサにもっとも適した設定を選択します。 |
native64 |
このシステムで良好なパフォーマンスを得られるようにコンパイルします (Solaris のみ)。このオプションは -m64 -xarch=native に相当し、以前のリリースとの互換性のために用意されています。 |
pentium_pro |
命令セットを 32 ビット pentium_pro アーキテクチャーに限定します。 |
pentium_proa |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット pentium_pro アーキテクチャーに追加します。 |
sse |
SSE 命令セットを pentium_pro アーキテクチャーに追加します。 |
ssea |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット SSE アーキテクチャーに追加します。 |
sse2 |
SSE2 命令セットを pentium_pro アーキテクチャーに追加します。 |
sse2a |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット SSE2 アーキテクチャーに追加します。 |
sse3 |
SSE3 命令セットを SSE2 命令セットに追加します。 |
ssse3 |
SSSE3 命令セットで、pentium_pro、SSE、SSE2、および SSE3 の各命令セットを補足します。 |
sse4_1 |
SSSE4.1 命令セットで、pentium_pro、SSE、SSE2、SSE3、および SSSE3 の各命令セットを補足します。 |
sse4_2 |
SSSE4.2 命令セットで、pentium_pro、SSE、SSE2、SSE3、SSSE3、および SSSE4.1 の各命令セットを補足します。 |
amdsse4a |
AMD SSE4a 命令セットを使用します。 |
x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
-xarch を sse、sse2、sse2a、または sse3 以降に設定してコンパイルしたプログラムは、必ずこれらの拡張子と機能を提供するプラットフォームでのみ実行してください。
Pentium 4 互換プラットフォームの場合、Solaris OS リリースは SSE/SSE2 に対応しています。これより前のバージョンの Solaris OS は SSE/SSE2 に対応していません。-xarch で選択した命令セットが、実行中の Solaris OS で有効ではない場合、コンパイラはその命令セットのコードを生成またはリンクできません。
コンパイルとリンクを別々に行う場合は、必ずコンパイラを使ってリンクし、-xarch 設定で適切な起動ルーチンがリンクされるようにしてください。
x86 の 80 バイト浮動小数点レジスタが原因で、x86 での演算結果が SPARC の結果と異なる数値になる場合があります。この差を最小にするには、 -fstore オプションを使用するか、ハードウェアが SSE2 をサポートしている場合は -xarch=sse2 でコンパイルします。
Solaris と Linux でも、固有の数学ライブラリ (たとえば、sin(x)) が同じではないため、演算結果が異なることがあります。
Solaris Studio 11 と Solaris 10 OS から、これらの特殊化された -xarch ハードウェアフラグを使用してコンパイルし、構築されたプログラムバイナリは、適切なプラットフォームで実行されることが確認されます。
Solaris 10 以前のシステムでは妥当性検査が行われないため、これらのフラグを使用して構築したオブジェクトが適切なハードウェアに配備されることをユーザが確認する必要があります。
これらの -xarch オプションでコンパイルしたプログラムを、適切な機能または命令セット拡張に対応していないプラットフォームで実行すると、セグメント例外や明示的な警告メッセージなしの不正な結果が発生することがあります。
このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、および SSE3 の命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。
このオプションは単体でも使用できますが、-xtarget オプションの展開の一部でもあります。したがって、特定の -xtarget オプションで設定される -xarch のオーバーライドにも使用できます。-xtarget=ultra2 は -xarch=sparcvis -xchip=ultra2 -xcache=16/32/1:512/64/1 に展開されます。次のコマンドでは、-xarch=generic は、-xtarget=ultra2 の展開で設定された -xarch=sparcvis より優先されます。
example% cc -xtarget=ultra2 -xarch=generic foo.c |
このオプションを最適化と併せて使用する場合、適切なアーキテクチャーを選択すると、そのアーキテクチャー上での実行パフォーマンスを向上させることができます。ただし、適切な選択をしなかった場合、パフォーマンスが著しく低下するか、あるいは、作成されたバイナリプログラムが目的のターゲットプラットフォーム上で実行できない可能性があります。
別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xarch の値を指定してください。
このオプションは OpenMP の並列化命令を有効にしません。
複数プロセッサ用の自動並列化を有効にします。依存性の解析 (ループの繰り返し内部でのデータ依存性の解析) およびループ再構成を実行します。最適化が -xO3 以上でない場合は -xO3 に上げられ、警告が出されます。
独自のスレッド管理を行なっている場合には、-xautopar を使用しないでください。
実行速度を上げるには、マルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたバイナリの実行速度は低下します。
並列化されたプログラムをマルチスレッド環境で実行するには、実行前に OMP_NUM_THREADS 環境変数を設定しておく必要があります。詳細は、『Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
-xautopar を使用してコンパイルとリンクを 1 度に実行する場合、リンクには自動的にマイクロタスキングライブラリおよびスレッドに対して安全な C 実行時ライブラリが含まれます。-xautopar を使用してコンパイルとリンクを別々に実行する場合、リンクにも -xautopar を指定しなければいけません。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
(SPARC) あとで最適化、変換、分析を行うために、バイナリを準備します。binopt(1) を参照してください。このオプションは、実行可能ファイルまたは共有オブジェクトの構築に使用できます。このオプションを有効にするには、最適化レベル -xO1 以上で使用する必要があります。このオプションを使用すると、構築したバイナリのサイズが少し増えます。
コンパイルとリンクを別々に行う場合は、両方の手順に -xbinopt を指定する必要があります。
example% cc -c -xO1 -xbinopt=prepare a.c b.c example% cc -o myprog -xbinopt=prepare a.o |
一部のソースコードがコンパイルに使用できない場合も、このオプションを使用してそのほかのコードがコンパイルされます。このとき、最終的なバイナリを作成するリンク手順で、このオプションを使用する必要があります。この場合、このオプションでコンパイルされたコードだけが最適化、変換、分析できます。
-xbinopt=prepare と -g を指定してコンパイルすると、デバッグ情報が取り込まれるので、実行可能ファイルのサイズが増えます。デフォルトは -xbinopt=off です。
標準ライブラリ関数を呼び出すコードをさらに最適化する場合、-xbuiltin[=(%all| %none)] コマンドを使用します。多くの標準ライブラリ関数 (math.h、stdio.h で定義された関数など) は、さまざまなプログラムで一般的に使用されます。このコマンドを使用すると、コンパイラは、パフォーマンス向上の見込める場所で組み込み関数またはインラインシステム関数を代用します。オブジェクトファイル内のコンパイラのコメントからコンパイラが実際に置換を行う関数を特定する方法については、er_src(1) のマニュアルページを参照してください。
ただし、こうした置換によって errno の値の信頼性が失われることがあります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。「2.13 errno の値の保持」も参照してください。
-xbuiltin を指定しない場合は、デフォルトは -xbuiltin=%none になります。この場合は、標準ライブラリの関数の代替やインライン化は行われません。-xbuiltin を引数なしで指定した場合は、デフォルトは -xbuiltin%all になります。この場合は、最適化に有効と判断されるときには、組込型関数の代替や標準ライブラリの関数のインライン化が実行されます。
-fast を指定してコンパイルする場合は、-xbuiltin は %all になります。
-xbuiltin は、システムのヘッダーファイルで定義された大域関数だけをインライン化します。ユーザー定義の静的関数はインライン化しません。
-xc99=none および -xCC を指定した場合は、コンパイラで C++ 形式のコメントが認識されます。このオプションを使用すると、// を使用してコメントの始まりを示すことができます。
-xc99 オプションは、C99 規格 (『Programming Language - C (ISO/IEC 9899:1999)』) からの実装機能に対するコンパイラの認識状況を制御します。
o には、次の項目をコンマで区切って指定します。
表 B–16 -xc99 のフラグ
フラグ |
意味 |
---|---|
[no]_lib |
1990 C 規格と 1999 C 規格の両方で使用されるルーチンの 1999 C 標準ライブラリ意味処理を有効 [無効] にします。 |
all |
サポートされている C99 言語機能に認識可能にして、1990 C 規格と 1999 C 規格の両方にあるルーチンの 1999 C 標準ライブラリ意味処理を有効にします。 |
none |
サポートされている C99 言語機能に認識不可にして、1990 C 規格と 1999 C 規格の両方にあるルーチンの 1999 C 標準ライブラリ意味処理を無効にします。 |
-xc99 を指定しない場合は、コンパイラではデフォルトで -xc99=all,no_lib が設定されます。値を指定しないで -xc99 を指定すると、オプションは -xc99=all に設定されます。
コンパイラのサポートレベルは、デフォルトでは C99 規格の言語機能になりますが、Solaris 8 および Solaris 9 オペレーティングシステムが提供している標準のヘッダーファイル (/usr/include にある) は、1999 ISO/IEC C 規格に準拠していません。エラーメッセージが生成される場合は、-xc99=none を指定して、前述のヘッダー用に 1990 ISO/IEC C 規格を使用してみてください。
1990 C 規格と 1999 C 規格の両方にあるルーチンの 1999 C 標準ライブラリ意味処理は、Solaris 8 および Solaris 9 ソフトウェアで使用できず、このため有効にすることはできません。Solaris 8 または 9 で直接または間接に -xc99=lib が指定された場合は、エラーメッセージが発行されます。
オプティマイザ用のキャッシュ特性を定義します。この定義によって、特定のキャッシュが使用されるわけではありません。
このオプションは単独で指定できますが、-xtarget オプションのマクロ展開の一部です。-xtarget オプションによって指定された値を変更するのが主な目的です。
このリリースで、キャッシュを共有できるスレッド数を指定するオプションの特性 [/ti] が導入されました。t の値を指定しない場合のデフォルトは 1 です。
c には次のいずれかを指定します。
generic
native
s1/ l1/a 1[/t1]
s1/l1/a 1[/t1]:s2/l 2/a2[ /t2]
s1/l1/a 1[/t1]:s2/l 2/a2[ /t2]:s3/l 3/a3[ /t3]
s、l、a、t の各特性の定義は次のとおりです。
si |
レベル i のデータキャッシュのサイズ (キロバイト単位) |
li |
レベル i のデータキャッシュのラインサイズ (バイト単位) |
ai |
レベル i のデータキャッシュの結合特性 |
ti |
レベル i でキャッシュを共有するハードウェアスレッドの数 |
次に、-xcache の値を示します。
表 B–17 -xcache のフラグ
フラグ |
意味 |
---|---|
generic |
これはデフォルトです。ほとんどの SPARC プロセッサに良好なパフォーマンスを提供し、どの x86、SPARC の各プロセッサでも著しいパフォーマンス低下が生じないようなキャッシュ特性を使用するように、コンパイラに指示します。 これらの最高のタイミング特性は、新しいリリースごとに、必要に応じて調整されます。 |
native |
ホスト環境に対して最適化されたパラメータを設定します。 |
s1/l1/a 1[/t1] |
レベル 1 のキャッシュ特性を定義します。 |
s1/l1/a 1[/t1]:s2/l 2/a2[ /t2] |
レベル 1 と 2 のキャッシュ特性を定義します。 |
s1/l1/a 1[/t1]:s2/l 2/a2[ /t2]:s3/l 3/a3[ /t3] |
レベル 1、2、3 のキャッシュ特性を定義します。 |
例: -xcache=16/32/4:1024/32/1 では、次の内容を指定します。
レベル 1 のキャッシュ 16K バイト ラインサイズ 32 バイト 4 ウェイアソシアティブ |
レベル 2 のキャッシュ 1024K バイト ラインサイズ 32 バイト 直接マップ結合 |
(SPARC) 廃止。このオプションは使わないでください。最新の Solaris オペレーティングシステムは、SPARC V7 アーキテクチャーをサポートしません。このオプションでコンパイルすると、現在の SPARC プラットフォームでの実行速度が遅いコードが生成されます。-O を使用して、-xarch、-xchip、および -xcache のコンパイラのデフォルトを利用します。
オプションこのオプションは、char 型が符号なしで定義されているシステムからのコード移植を簡単にするためのものです。そのようなシステムからの移植以外では、このオプションは使用しないでください。符号付きまたは符号なしであると明示的に示すように書き直す必要があるのは、符号に依存するコードだけです。
o には、次のいずれかを指定します。
表 B–18 -xchar のフラグ
フラグ |
意味 |
---|---|
signed |
char 型で定義された文字定数および変数を符号付きとして処理します。コンパイル済みコードの動作に影響しますが、ライブラリルーチンの動作には影響しません。 |
s |
signed と同義です。 |
unsigned |
char 型で定義された文字定数および変数を符号なしとして処理します。コンパイル済みコードの動作に影響しますが、ライブラリルーチンの動作には影響しません。 |
u |
unsigned と同義です。 |
-xchar を指定しない場合は、コンパイラでは -xchar=s が指定されます。
-xchar を値なしで指定した場合は、コンパイラでは -xchar=s が指定されます。
-xchar オプションは、-xchar を指定してコンパイルしたコードでだけ、char 型の値の範囲を変更します。システムルーチンまたはヘッダーファイル内の char 型の値の範囲は変更しません。特に、CHAR_MAX および CHAR_MIN の値 (limits.h で定義される) は、このオプションを指定しても変更されません。したがって、CHAR_MAX および CHAR_MIN は、通常の char で符号化可能な値の範囲を示さなくなります。
-xchar を使用するときは、マクロでの値が符号付きの場合があるため、char を定義済みのシステムマクロと比較する際には特に注意してください。これは、マクロを使用してエラーコードを戻すルーチンでもっとも一般的です。エラーコードは、一般的には負の値になっています。したがって、char をそのようなマクロによる値と比較するときは、結果は常に false になります。負の数値が符号なしの型の値と等しくなることはありません。
ライブラリを使用してエクスポートしているインタフェース用のルーチンは、-xchar を使用してコンパイルしないようにお勧めします。Solaris ABI では char 型を符号付きとして指定すると、システムライブラリが指定に応じた動作をします。char を符号なしにする影響は、システムライブラリで十分にテストされたわけではありません。このオプションを使用しないで、char 型の符号の有無に依存しないようにコードを変更してください。char 型の符号は、コンパイラやオペレーティングシステムによって異なります。
複数文字からなる定数である文字を指定されたバイト順序で配置することにより、整定数を生成します。o には、次のいずれかを指定します。
low: 複数文字定数の文字を低いバイトから順に配置する
high: 複数文字定数の文字を高いバイトから順に配置する
default: 複数文字定数の文字を、コンパイルモード 「B.2.68 -X[c|a|t|s]」 で決定された順に配置する。詳細は、「2.1.2 文字定数」を参照してください。
スタックオーバーフローに関する実行時検査を追加し、ローカル変数を初期化します。
o には、次のいずれかを指定します。
表 B–19 -xcheck のフラグ
フラグ |
意味 |
---|---|
%none |
-xcheck のチェックを実行しません。 |
%all |
-xcheck のチェックをすべて実行します。 |
stkovf |
スタックオーバーフロー検査を有効にします。-xcheck=stkovf を指定すると、シングルスレッドのプログラム内のメインスレッドのスタックオーバーフローおよびマルチスレッドプログラム内のスレーブスレッドのスタックに対する実行時検査が追加されます。スタックオーバーフローが検出された場合は、SIGSEGV が生成されます。アプリケーションで、スタックオーバーフローで生成される SIGSEGV をほかのアドレス空間違反と異なる方法で処理する必要がある場合は、sigaltstack(2) を参照してください。 |
no%stkovf |
スタックオーバーフローのチェックをオフにします。 |
init_local |
ローカル変数を初期化します。詳細は、次の説明を参照してください。 |
no%init_local |
ローカル変数を初期化しません。 |
-xcheck を指定しない場合は、コンパイラではデフォルトで -xcheck=%none が指定されます。引数を指定せずに xcheck を使用した場合は、コンパイラではデフォルトで -xcheck=%all が指定されます。
-xcheck オプションは、コマンド行で累積されません。コンパイラは、コマンドで最後に指定したものに従ってフラグを設定します。
—xcheck=init_local を指定すると、次の表に示すように、コンパイラは初期設定子を指定しないで宣言されたローカル変数を事前定義された値に初期化します (これらの値は変更される可能性があるため、信頼しないでください)。
種類 |
初期化値 |
---|---|
char, _Bool |
0x85 |
short |
0x8001 |
int, long, enum (-m32) |
0xff80002b |
long (-m64) |
0xfff00031ff800033 |
long long |
0xfff00031ff800033 |
pointer |
0x00000001 (-m32) 0x0000000000000001 (-m64) |
float, float _Imaginary |
0xff800001 |
float _Complex |
0xff80000fff800011 |
double |
SPARC: 0xfff00003ff800005 x86: 0xfff00005ff800003 |
double _Imaginary |
0xfff00013ff800015 |
long double, long double _Imaginary |
SPARC: 0xffff0007ff800009 / 0xfff0000bff80000d x86: 12 bytes (-m32): 0x80000009ff800005 / 0x0000ffff x86 - 16 bytes (-m64): 0x80000009ff800005 / 0x0000ffff00000000 |
double _Complex |
0xfff00013ff800015 / 0xfff00017ff800019 |
long double _Complex |
SPARC: 0xffff001bff80001d / 0xfff0001fff800021 / 0xffff0023ff800025 / 0xfff00027ff800029 x86 - 12 bytes (-m32): 0x7fffb01bff80001d / 0x00007fff / 0x7fffb023ff800025 / 0x00007fff x86 - 16 bytes (-m64): 0x00007fff00080000 / 0x1b1d1f2100000000 / 0x00007fff00080000 / 0x2927252300000000 |
計算された goto で使用するために宣言されたローカル変数 (単純な void * ポインタ) は、上の表に示されたポインタの説明に従って初期化されます。
ローカル変数の型である修飾された const、register、計算された goto のラベル番号、ローカルラベル、可変長配列 (VLA) は初期化されません。
基本型である struct のフィールドは、union の最初に宣言された pointer または float フィールドのように、上の表で説明されているとおりに初期化されます。この結果、未初期化の参照により目に見えるエラーが生成される可能性が最大になります。
配列要素も上の表で説明されているとおりに初期化されます。
入れ子の struct、union、配列フィールドは、ビットフィールドを含む struct、pointer または float フィールドのない union、または完全に初期化できない型の配列を除いて、上で説明されているとおりに初期化されます。これらは、double 型のローカル変数に使用される値を使用して初期化されます。可変長配列は初期化されません。
c には次のいずれかを指定します。generic、old、super、super2、micro、micro2、hyper、hyper2、powerup、ultra、 ultra2、ultra2e、ultra2i、ultra3、ultra3cu、pentium、pentium_pro
このオプションは単独でも使用できますが、-xtarget オプションが展開されたものの一部です。このオプションの主な目的は、-xtarget オプションにより指定される値を変更することです。
このオプションは、処理対象となるプロセッサを指定することによって、タイミング特性を指定します。xchip=c は次のものに影響を与えます。
命令の順序 (スケジューリング)
コンパイラが分岐を使用する方法
意味が同じもので代用できる場合に使用する命令
次の表は、SPARC プラットフォーム向けの -xchip の値をまとめています。
表 B–21 SPARC 向けの -xchip のフラグ
フラグ |
意味 |
---|---|
generic |
ほとんどの SPARC で良好なパフォーマンスとなるタイミング特性を使用します。 これはデフォルトです。ほとんどのプロセッサに良好なパフォーマンスを提供し、どのプロセッサでも著しいパフォーマンス低下が生じないような最適のタイミング特性を使用するようにコンパイラに指示します。 |
native |
ホスト環境に対して最適化されたパラメータを設定します。 |
old |
SuperSPARC 以前のプロセッサのタイミング特性を使用します。 |
sparc64vi |
SPARC64 VI プロセッサ用に最適化します。 |
sparc64vii |
SPARC64 VII プロセッサ用に最適化します。 |
super |
SuperSPARC プロセッサのタイミング特性を使用します。 |
super2 |
SuperSPARC II プロセッサのタイミング特性を使用します。 |
micro |
microSPARC プロセッサのタイミング特性を使用します。 |
micro2 |
microSPARC II プロセッサのタイミング特性を使用します。 |
hyper |
hyperSPARC プロセッサのタイミング特性を使用します。 |
hyper2 |
hyperSPARC II プロセッサのタイミング特性を使用します。 |
powerup |
Weitek PowerUP プロセッサのタイミング特性を使用します。 |
ultra |
UltraSPARC プロセッサのタイミング特性を使用します。 |
ultra2 |
UltraSPARC II プロセッサのタイミング特性を使用します。 |
ultra2e |
UltraSPARC IIe プロセッサのタイミング特性を使用します。 |
ultra2i |
UltraSPARC IIi プロセッサのタイミング特性を使用します。 |
ultra3 |
UltraSPARC III プロセッサのタイミング特性を使用します。 |
ultra3cu |
UltraSPARC III Cu プロセッサのタイミング属性を使用します。 |
ultra3i |
UltraSPARC IIIi プロセッサのタイミング特性を使用します。 |
ultra4 |
UltraSPARC プロセッサのタイミング特性を使用します。 |
ultra4plus |
UltraSPARC IVplus プロセッサのタイミング特性を使用します。 |
ultraT1 |
UltraSPARC T1 プロセッサのタイミング特性を使用します。 |
ultraT2 |
UltraSPARC T2 プロセッサのタイミング特性を使用します。 |
ultraT2plus |
UltraSPARC T2+ プロセッサのタイミング特性を使用します。 |
ultraT3 |
UltraSPARC T3 プロセッサのタイミング特性を使用します。 |
次の表は、x86 プラットフォーム向けの -xchip の値をまとめています。
表 B–22 x86 向けの -xchip のフラグ
フラグ |
意味 |
---|---|
generic |
ほとんどの x86 アーキテクチャーで良好なパフォーマンスとなるタイミング特性を使用します。 これはデフォルトです。ほとんどのプロセッサに良好なパフォーマンスを提供し、どのプロセッサでも著しいパフォーマンス低下が生じないような最適のタイミング特性を使用するようにコンパイラに指示します。 |
native |
ホスト環境に対して最適化されたパラメータを設定します。 |
core2 |
Intel Core2 プロセッサ用に最適化します。 |
nehalem |
Intel Nehalem プロセッサ用に最適化します。 |
opteron |
AMD Opteron プロセッサ用に最適化します。 |
penryn |
Intel Penryn プロセッサ用に最適化します。 |
pentium |
x86 pentium アーキテクチャーのタイミング特性を使用します。 |
pentium_pro |
x86 pentium_pro アーキテクチャーのタイミング特性を使用します。 |
pentium3 |
x86 Pentium 3 アーキテクチャーのタイミング特性を使用します。 |
pentium4 |
x86 Pentium 4 アーキテクチャーのタイミング特性を使用します。 |
amdfam10 |
AMD AMDFAM10 プロセッサ用に最適化します。 |
-xcode=pic13 または -xcode=pic32 を指定して共有オブジェクトを構築することを推奨します。-xarch=v9 -xcode=abs64 と -xarch=v8 -xcode=abs32 を指定して有効な共有オブジェクトを構築することは可能ですが、効率は悪くなります。-xarch=v9 や -xcode=abs32 または -xarch=v9、-xcode=abs44 を指定して構築した共有オブジェクトは機能しません。
v には次のいずれかを指定します。
表 B–23 -xcode のフラグ
値 |
意味 |
abs32 |
これは 32 ビットアーキテクチャーでのデフォルトです。32 ビットの絶対アドレスを生成します。コード、データ、および bss を合計したサイズは 2**32 バイトに制限されます。 |
abs44 |
これは 64 ビットアーキテクチャーでのデフォルトです。44 ビットの絶対アドレスを生成します。コード、データ、および bss を合計したサイズは 2**44 バイトに制限されます。64 ビットアーキテクチャーだけで利用できます。 |
abs64 |
64 ビットの絶対アドレスを生成します。64 ビットのアーキテクチャーでのみ利用できます。 |
pic13 |
共有ライブラリで使用する位置独立コードを生成します。-Kpic と同義です。32 ビットアーキテクチャーでは最大 2**11 まで、64 ビットアーキテクチャーでは最大 2**10 までの固有の外部シンボルを参照できます。 |
pic32 |
共有ライブラリで使用する位置独立コード (大規模モデル) を生成します。-KPIC と同義です。32 ビットアーキテクチャーでは最大 2**30 まで、64 ビットアーキテクチャーでは最大 2**29 までの固有の外部シンボルを参照できます。 |
32 ビットアーキテクチャーの場合は -xcode=abs32 です。64 ビットアーキテクチャーの場合は -xcode=abs44 です。
共有動的ライブラリを作成する場合、64 ビットアーキテクチャーでは -xcode のデフォルト値である abs44 と abs32 を使用できません。-xcode=pic13 または -xcode=pic32 を指定してください。SPARC の場合、-xcode=pic13 および -xcode=pic32 では、わずかですが、次の 2 つのパフォーマンス上の負担がかかります。
-xcode=pic13 または -xcode=pic32 のいずれかでコンパイルしたルーチンは、エントリで命令をいくつか実行することによって、共有ライブラリの大域変数や静的変数へのアクセスに使用する大域的なオフセットテーブル (_GLOBAL_OFFSET_TABLE_) を指すようにレジスタを設定します。
大域または静的変数へのアクセスのたびに、_GLOBAL_OFFSET_TABLE_ を使用した間接メモリー参照が 1 回余計に行われます。-xcode=pic32 でコンパイルした場合は、大域および静的メモリーへの参照ごとに命令が 2 個増えます。
こうした負担があるとしても、-xcode=pic13 あるいは -xcode=pic32 を使用すると、ライブラリコードを共有できるため、必要となるシステムメモリーを大幅に減らすことができます。-xcode=pic13 あるいは -xcode=pic32 でコンパイルした共有ライブラリを使用するすべてのプロセスは、そのライブラリのすべてのコードを共有できます。共有ライブラリ内のコードに非 pic (すなわち、絶対) メモリー参照が 1 つでも含まれている場合、そのコードは共有不可になるため、そのライブラリを使用するプログラムを実行する場合は、その都度、コードのコピーを作成する必要があります。
.o ファイルが -xcode=pic13 または -xcode=pic32 でコンパイルされたかどうかを調べるには、次のように nm コマンドを使用すると便利です。
% nm file.o | grep _GLOBAL_OFFSET_TABLE_ U _GLOBAL_OFFSET_TABLE_ |
位置独立コードを含む .o ファイルには、_GLOBAL_OFFSET_TABLE_ への未解決の外部参照が含まれます。このことは、英文字の U で示されます。
-xcode=pic13 または -xcode=pic32 のどちらを使用すべきか決定するときは、elfdump -c (詳細は elfdump(1) のマニュアルページを参照) を使用することによって、セクションヘッダー (sh_name: .got) を探して、大域オフセットテーブル (Global Offset Table、GOT) のサイズを調べてください。sh_size 値が GOT のサイズです。GOT のサイズが 8,192 バイトに満たない場合は -xcode=pic13、そうでない場合は -xcode=pic32 を指定します。
一般に、-xcode の使用方法の決定に際しては、次のガイドラインに従ってください。
実行可能ファイルを構築する場合は、-xcode=pic13 と -xcode=pic32 のどちらも使わない。
実行可能ファイルへのリンク専用のアーカイブライブラリを構築する場合は、-xcode=pic13 と -xcode=pic32 のどちらも使わない。
共有ライブラリを構築する場合は、-xcode=pic13 からスタートし、GOT のサイズが 8,192 バイトを超えたら、-xcode=pic32 を使用する。
共有ライブラリへのリンク用のアーカイブライブラリを構築する場合は、-xcode=pic32 のみ使用する。
廃止。使用しないでください。代わりに -xipo を使用します。—xcrossfile は —xipo=1 の別名です。
C コンパイラが ISO C ソース文字コードの要件に準拠しないロケールで記述されたソースコードを受け付けられるようにします。これらのロケールには、 ja_JP.PCK があります。
コンパイラの翻訳段階でこのようなロケールの処理が必要になると、コンパイルの時間が非常に長くなることがあります。そのため、このオプションを使用するのは、前述のロケールのソース文字を含むソースファイルをコンパイルする場合に限定すべきです。
コンパイラは、-xcsi が発行されないかぎり、ISO C ソース文字コードの要件に準拠しないロケールで記述されたソースコードを認識しません。
dwarf 形式のデバッグ情報を読み取るソフトウェアを保守している場合は、-xdebugformat=dwarf を指定します。このオプションを使用すると、コンパイラは dwarf 標準形式を使用してデバッグ情報を生成します。これがデフォルトです。
表 B–24 -xdebugformat のフラグ
値 |
意味 |
---|---|
stabs |
-xdebugformat=stabs は、stab 標準形式を使用してデバッグ情報を生成します。 |
dwarf |
-xdebugformat=dwarf は、dwarf 標準形式を使用してデバッグ情報を生成します (デフォルト)。 |
-xdebugformat を指定しない場合は、コンパイラでは -xdebugformat=dwarf が指定されます。このオプションには引数が必要です。
このオプションは、-g オプションによって記録されるデータの形式に影響します。-g を指定しなくても、一部のデバッグ情報が記録されますが、その情報の形式もこのオプションによって制御されます。したがって、-g を使用しなくても、-xdebugformat は有効です。
dbx とパフォーマンスアナライザソフトウェアは、stab 形式と dwarf 形式を両方とも認識するので、このオプションを使用しても、ツールの機能にはまったく影響を与えません。
詳細は、dumpstabs(1) および dwarfdump(1) のマニュアルページも参照してください。
ループの繰り返し内部でのデータ依存性を解析し、ループの交換、ループの融合、スカラー置換などの再構成をループします。
最適化レベルが -xO3 かそれ以上に設定されている場合はすべて、-xdepend のデフォルトは -xdepend=on です。-xdepend の明示的な設定を指定すると、デフォルト設定は上書きされます。
引数なしで -xdepend を指定すると、-xdepend=yes と同等であることを意味します。
依存性の解析はシングルプロセッサシステムで役立つことがあります。ただし、シングルプロセッサシステムで -xdepend を使用する場合は、-xautopar を指定するべきではありません。-xdepend 最適化は、マルチプロセッサシステム用に実行されるからです。
ソースファイル上で構文および意味検査のみを行います。オブジェクトコードや実行可能コードは生成しません。
リンカーによる関数と変数の最適な順序の並べ替えを有効にします。
このオプションは、関数とデータ変数を細分化された別々のセクションに配置するようコンパイラに指示します。それによってリンカーは、リンカーの -M オプションで指定されたマップファイル内の指示に従ってこれらのセクションの順序を並べ替えて、プログラムのパフォーマンスを最適化することができます。通常は、この最適化によって効果が上がるのは、プログラムの実行時間の多くがページフォルト時間に費やされている場合だけです。
変数を並べ替えることによって、実行時間のパフォーマンスにマイナスの影響を与える次のような問題を解決できます。
メモリー内で関係ない変数どうしが近接しているために生じる、キャッシュやページの競合
関係のある変数がメモリー内で離れた位置にあるために生じる、不必要に大きな作業セットサイズ
使用していない weak 変数のコピーが有効なデータ密度を低下させた結果生じる、不必要に大きな作業セットサイズ
最適なパフォーマンスを得るために変数と関数の順序を並べ替えるには、次の処理が必要です。
-xF によるコンパイルとリンク
『プログラムのパフォーマンス解析』マニュアル内の、関数のマップファイルを生成する方 法に関する指示に従うか、または、『リンカーとライブラリ』内の、データのマップ ファイルを生成する方法に関する指示に従います。
リンカーの -M オプションを使用して新しいマップファイルを再リンクします。
アナライザで再実行して、パフォーマンスが向上したかどうかを検証します。
v には、次のいずれかを指定します。
表 B–25 -xF の値
値 |
意味 |
---|---|
[no%]func |
関数を個々のセクションに細分化します [しません]。 |
[no%]gbldata |
大域データ (外部リンケージのある変数) を個々のセクションに細分化します [しません]。 |
[no%]lcldata |
大域データ (外部リンケージのある変数) を個々のセクションに細分化します [しません]。 |
%all |
関数、大域データ、局所データを細分化します。 |
%none |
何も細分化しません。 |
-xF を指定しない場合のデフォルトは、-xF=%none です。引数を指定しないで -xF を指定した場合のデフォルトは、-xF=%none,func です。
-xF=lcldata を指定するとアドレス計算最適化が一部禁止されるので、このフラグは実験として意味があるときにだけ使用するとよいでしょう。
analyzer(1)、ld(1) のマニュアルページも参照してください。
f には、flags または readme を指定してください。
-xhelp=flags は、コンパイラオプションの要約を表示します。
-xhelp=readme は、README ファイルを表示します。
(SPARC) コンパイラのハードウェアカウンタによるプロファイリングのサポートを有効にします。
-xhwcprof が有効な場合、ツールがプロファイリング済み負荷を関連付け、命令をデータ型および構造メンバーと一緒に (参照先の -g で生成されたシンボリック情報と組み合わせて) 格納するために役立つ情報を、コンパイラが生成します。プロファイルデータは、ターゲットの命令空間ではなく、データ空間と関連付けられ、命令のプロファイリングだけでは入手の容易でない、動作に関する詳細情報が提供されます。
指定した一連のオブジェクトファイルは、-xhwcprof を指定してコンパイルできます。ただし、-xhwcprof がもっとも役に立つのは、アプリケーション内のすべてのオブジェクトファイルに適用したときです。このオプションによって、アプリケーションのオブジェクトファイルに分散しているすべてのメモリー参照を識別したり、関連付けたりするカバレージが提供されます。
コンパイルとリンクを別々に行う場合は、-xhwcprof をリンク時にも使用してくだ さい。将来 -xhwcprof に拡張する場合は、リンク時に -xhwcprof を使用する必要があります。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
-xhwcprof=enable または -xhwcprof=disable のインスタンスは、同じコマンド行にある以前の -xhwcprof のインスタンスをすべて無効にします。
-xhwcprof はデフォルトでは無効です。引数を指定せずに -xhwcprof と指定することは、-xhwcprof=enable と指定することと同じです。
-xhwcprof では、最適化を有効にして、デバッグのデータ形式を DWARF (-xdebugformat=dwarf) に設定する必要があります。
-xhwcprof と -g を組み合わせて使用すると、コンパイラに必要な一時ファイル記憶領域は、-xhwcprof と -g を単独で指定することによって増える量の合計を超えて大きくなります。
次のコマンドは example.c をコンパイルし、ハードウェアカウンタによるプロファイリングのサポートを指定し、DWARF シンボルを使用してデータ型と構造体メンバーのシンボリック解析を指定します。
example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c |
ハードウェアカウンタによるプロファイリングの詳細については、『プログラムのパフォーマンス解析』を参照してください。
list for -xinline の書式を次に示します。[{%auto ,func_name,no%func_name }[,{%auto,func_name, no%func_name}]...]
-xinline は、オプションのリストで指定した関数だけのインライン化を試行します。リストには、空白のリストか、func_name、no%func_name、%auto をコンマで区切ったリストを指定します。ここでの func_name は関係数を表します。-xinline は、-xO3 以上の最適化レベルでだけ有効です。
表 B–26 -xinline のフラグ
フラグ |
意味 |
---|---|
%auto |
コンパイラでソースファイル内のすべての関数を自動的にインライン化するように指定します。%auto は、-xO4 以上の最適化レベルでだけ有効です。%auto は、-xO3 以下の最適化レベルでは無視されます。 |
func_name |
指定した関数をコンパイラでインライン化するように指定します。 |
no%func_name |
指定した関数をコンパイラでインライン化しないように指定します。 |
値のリストは、左から右に累積されます。したがって、-xinline=%auto,no%foo と指定した場合は、foo 以外のすべての関数のインラインが試行されます。-xinline=%bar,%myfunc,no%bar と指定した場合は、myfunc だけのインライン化が試行されます。
最適化レベルを -xO4 以上に設定してコンパイルすると、通常はソースファイルで定義されたすべての関数参照のインライン化が試行されます。-xinline オプションを使用することで、特定の関数をインライン化しないように制限できます。引数として関数名や %auto を指定せずに、-xinline= だけを指定した場合は、ソースファイル中のルーチンはいずれもインライン化されません。リストで func_name および no%func_name を %auto なしで指定した場合は、リストで指定した関数のオンラインオプションだけが試行されます。最適化レベルが -xO4 以上のときに、-xinline オプションのリストで %auto を指定した場合は、no%func_name で明示的に除外していない関数がすべてインライン化されます。
次のいずれかの条件に該当する場合、ルーチンはインライン化されません。警告は出力されませんので注意してください。
最適化のレベルが -xO3 未満である。
ルーチンが見つからない。
iropt がルーチンのインライン化を実行できない。
ルーチンのソースが、コンパイル対象のファイルにない (-xcrossfile を参照)。
コマンド行で -xinline を複数指定した場合は、それらは累積されません。コマンド行で最後に指定した -xinline によって、コンパイラがインライン化する関数が決定されます。
-xldscope も参照してください。
スレッドアナライザで分析するためにプログラムをコンパイルして計測するには、このオプションを指定します。スレッドアナライザの詳細については、tha(1) を参照してください。
そうすることで、パフォーマンスアナライザを使用して計測されたプログラムを collect -r races で実行し、データ競合の検出実験を行うことができます。計測されたコードをスタンドアロンで実行できますが、低速で実行されます。
-xinstrument=no%datarace を指定して、スレッドアナライザ用のソースコードの準備をオフにすることができます。これはデフォルト値です。
-xinstrument を引数なしで指定することはできません。
コンパイルとリンクを別々に行う場合は、コンパイル時とリンク時の両方で -xinstrument=datarace を指定する必要があります。
このオプションは、プリプロセッサトークン __THA_NOTIFY を定義します。#ifdef __THA_NOTIFY を指定して、libtha(3) ルーチンへの呼び出しを保護できます。
このオプションにも、-g を設定します。
a を 0、 1、または 2 と置き換えます。引数なしの -xipo は、-xipo=1 に相当します。-xipo=0 はデフォルト設定であり、-xipo を無効にします。-xipo=1 を指定した場合は、すべてのソースファイルでインライン化が実行されます。
-xipo=2 を指定した場合は、コンパイラは内部手続きの別名解析と、メモリーの割り当ておよび配置の最適化を実行し、キャッシュ性能を向上させます。
このコンパイラは、内部手続き解析コンポーネントを呼び出すことにより、プログラムの一部の最適化を実行します。このオプションを指定すると、リンク段階ですべてのオブジェクトファイルを介して最適化を実行し、最適化の対象をコンパイルコマンドのソースファイルだけに限定しません。ただし、-xipo によるプログラム全体の最適化には、アセンブリ (.s) ソースファイルは含まれません。
-xipo は、コンパイル時とリンク時の両方で指定する必要があります。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
-xipo オプションは、ファイルを介して最適化を実行する際に必要な情報を追加するため、非常に大きなオブジェクトファイルを生成します。ただし、この補足情報は最終的な実行可能バイナリファイルの一部にはなりません。実行可能プログラムのサイズが拡大するのは、最適化が追加実行されるためです。このコンパイル段階で作成されたオブジェクトファイルには、内部でコンパイルされた追加の分析情報が含まれているため、リンク段階でファイル相互の最適化を実行できます。
-xipo は、大きなマルチファイルアプリケーションをコンパイルおよびリンクする際に便利です。このフラグでコンパイルされたオブジェクトファイルは、それらのファイル内でコンパイルされた解析情報を保持します。これらの解析情報は、ソースおよびコンパイル前のプログラムファイルで内部手続き解析を可能にします。
ただし、解析と最適化は、-xipo を指定してコンパイルされたオブジェクトファイルに限定され、オブジェクトファイルまたはライブラリは対象外です。
-xipoは複数の段階に分かれているため、コンパイルとリンクを個別に実行する場合、各ステップで -xipo を指定する必要があります。
-xipo に関するそのほかの重要な情報を次に示します。
少なくとも最適化レベル -xO4 を必要とします。
-xipo なしでコンパイルされたオブジェクトは、-xipo でコンパイルされたオブジェクトと自由にリンクできます。
次の例では、コンパイルとリンクが単一ステップで実行されます。
cc -xipo -xO4 -o prog part1.c part2.c part3.c |
オプティマイザは 3 つのすべてのソースファイル間でファイル間のインライン化を実行します。これは最終的なリンク手順で実行されるため、すべてのソースファイルのコンパイルを単一のコンパイル処理で実行する必要はありません。-xipo を随時指定することにより、個別のコンパイルが多数発生してもかまいません。
次の例では、個別のステップでコンパイルとリンクが実行されます。
cc -xipo -xO4 -c part1.c part2.c cc -xipo -xO4 -c part3.c cc -xipo -xO4 -o prog part1.o part2.o part3.o |
ここでの制限事項は、-xipo でコンパイルを実行しても、ライブラリがファイル相互の内部手続き解析に含まれない点です。次の例を参照してください。
cc -xipo -xO4 one.c two.c three.c ar -r mylib.a one.o two.o three.o ... cc -xipo -xO4 -o myprog main.c four.c mylib.a |
この例では、内部手続きの最適化は one.c、two.c および three.c 間と main.c と four.c 間で実行されますが、main.c または four.c と mylib.a のルーチン間では実行されません。最初のコンパイルは未定義のシンボルに関する警告を生成する場合がありますが、内部手続きの最適化は、コンパイル手順でありしかもリンク手順であるために実行されます。
内部手続き解析では、コンパイラは、リンクステップでオブジェクトファイル群を操作しながら、プログラム全体の解析と最適化を試みます。このとき、コンパイラは、このオブジェクトファイル群に定義されているすべての foo() 関数 (またはサブルーチン) に関して次の 2 つのことを仮定します。
実行時、このオブジェクトファイル群の外部で定義されている別のルーチンによって foo() が明示的に呼び出されない。
オブジェクトファイル群内のルーチンからの foo() 呼び出しが、そのオブジェクトファイル群の外部に定義されている別のバージョンの foo() からの割り込みを受けない。
仮定 2 が当てはまらない場合は、コンパイルで -xipo=1 および -xipo=2 を使わないでください。
1 例として、独自のバージョンの malloc() で関数 malloc() を置き換え、-xipo=2 を指定してコンパイルするケースを考えてみましょう。-xipo=2 を使ってコンパイルする場合、その独自のコードとリンクされる malloc() を参照する、あらゆるライブラリのあらゆる関数のコンパイルで -xipo=2 を使用する必要があるとともに、リンクステップでそれらのオブジェクトファイルが必要になります。システムライブラリでは、このことが不可能なことがあり、このため、独自のバージョンの malloc のコンパイルに -xipo=2 を使ってはいけません。
もう 1 つの例として、別々のソースファイルにある foo() および bar() という 2 つの外部呼び出しを含む共有ライブラリを構築するケースを考えてみましょう。また、bar() は foo() を呼び出すと仮定します。foo() が実行時に割り込みを受ける可能性がある場合、foo() および bar() のソースファイルのコンパイルで -xipo=1 や -xipo=2 を使ってはいけません。さもないと、foo() が bar() 内にインライン化され、不正な結果になる可能性があります。
新しい -xipo_archive オプションは、リンカーに渡すオブジェクトファイル、-xipo を指定してコンパイルされたオブジェクトファイル、および実行可能ファイルを生成する前にアーカイブライブラリ (.a) に存在するオブジェクトファイルを最適化できるようにします。コンパイル中に最適化されたライブラリに含まれるオブジェクトファイルはすべて、その最適化されたバージョンに置き換えられます。
a には、次のいずれかを指定します。
表 B–27 -xipo_archive のフラグ
値 |
意味 |
---|---|
writeback |
実行可能ファイルを生成する前に、アーカイブライブラリ (.a) に存在する -xipo でコンパイルしたオブジェクトファイルを使ってリンカーに渡すオブジェクトファイルを最適化します。コンパイル中に最適化されたライブラリに含まれるオブジェクトファイルは、すべてその最適化されたバージョンに置き換えられます。 アーカイブライブラリの共通セットを使用する並列リンクでは、最適化されるアーカイブライブラリの独自のコピーを、各リンクでリンク前に作成する必要があります。 |
readonly |
実行可能ファイルを生成する前に、アーカイブライブラリ (.a) に存在する -xipo でコンパイルしたオブジェクトファイルを使ってリンカーに渡すオブジェクトファイルを最適化します。 -xipo_archive=readonly オプションを指定すると、リンク時に指定されたアーカイブライブラリのオブジェクトファイルで、モジュール間のインライン化と内部手続きデータフロー解析が有効になります。ただし、モジュール間のインライン化によってほかのモジュールに挿入されたコード以外のアーカイブライブラリのコードに対する、モジュール間の最適化は有効になりません。 アーカイブライブラリ内のコードにモジュール間の最適化を適用するには、-xipo_archive=writeback を指定する必要があります。これを行うと、コードが抽出されたアーカイブライブラリの内容が変更されることがあります。 |
none |
これはデフォルト値です。アーカイブファイルの処理は行いません。コンパイラは、モジュール間のインライン化やその他のモジュール間の最適化を、-xipo を使用してコンパイルされ、リンク時にアーカイブライブラリから抽出されたオブジェクトファイルに適用しません。これを行うには、-xipo と、-xipo_archive=readonly または -xipo_archive=writeback のいずれかをリンク時に指定する必要があります。 |
-xipo_archive の値が指定されない場合、-xipo_archive=none に設定されます。
-xipo_archive をフラグなしで指定することはできません。
コンパイラが処理を行うために生成するプロセスの数を設定するには、 -xjobs オプションを指定します。このオプションを使用すると、マルチ CPU マシン上での構築時間を短縮できます。現時点では、-xjobs とともに使用できるのは -xipo オプションだけです。-xjobs=n を指定すると、内部手続きオプティマイザは、さまざまなファイルをコンパイルするために呼び出すことができるコードジェネレータインスタンスの最大数として、n を使用します。
一般に、n に指定する確実な値は、使用できるプロセッサ数に 1.5 を掛けた数です。生成されたジョブ間のコンテキスト切り替えにより生じるオーバーヘッドのため、使用できるプロセッサ数の何倍もの値を指定すると、パフォーマンスが低下することがあります。また、あまり大きな数を使用すると、スワップ領域などシステムリソースの限界を超える場合があります。
-xjobs には必ず値を指定する必要があります。値を指定しないと、エラー診断が表示され、コンパイルは中止します。
コマンド行に複数の -xjobs のインスタンスがある場合、一番右にあるインスタンスが実行されるまで相互に上書きします。
次の例に示すコマンドは 2 つのプロセッサを持つシステム上で、-xjobs オプションを指定しないで実行された同じコマンドよりも高速にコンパイルを実行します。
example% cc -xipo -xO4 -xjobs=3 t1.c t2.c t3.c |
-xipo_archive をフラグなしで指定することはできません。
extern シンボルの定義に対するデフォルトのリンカースコープを変更するには、-xldscope オプションを指定します。デフォルトを変更すると、実装がよりうまく隠されるので、より早く、より安全に共有ライブラリを使用できます。
v には、次のいずれかを指定します。
表 B–28 -xldscope のフラグ
フラグ |
意味 |
---|---|
global |
大域リンカースコープは、もっとも制限の少ないリンカースコープです。シンボルに対する参照はすべて、シンボルを定義する最初の動的モジュール内の定義に結合します。このリンカースコープは、extern シンボルの現在のリンカースコープです。 |
symbolic |
シンボリックリンカースコープは、大域リンカースコープよりも制限されたスコープです。リンクしている動的モジュール内のシンボルに対する参照はすべて、モジュール内に定義されたシンボルに結合します。モジュールの外側では、シンボルは大域と同じです。このリンカースコープはリンカーオプション -Bsymbolic に対応します。リンカーの詳細については、ld(1) を参照してください。 |
hidden |
隠蔽リンカースコープは、シンボリックリンカースコープや大域リンカースコープよりも制限されたリンカースコープです。動的モジュール内の参照はすべて、そのモジュール内の定義に結合します。シンボルはモジュールの外側では認識されません。 |
-xldscope を指定しない場合は、コンパイラでは -xldscope=global が指定されます。引数を指定しないで -xldscope を指定すると、エラーが表示されます。コマンド行にこのオプションの複数のインスタンスがある場合、一番右にあるインスタンスが実行されるまで相互に上書きします。
クライアントがライブラリ内の関数をオーバーライドできるようにする場合は必ず、ライブラリの構築時に関数がインラインで生成されないようにしてください。-xinline を指定して関数名を指定した場合、-xO4 以上でコンパイルした場合 (自動的にインライン化される)、インライン指示子を使用した場合、インラインプラグマを使用した場合、または、複数のソースファイルにわたる最適化を使用している場合、コンパイラは関数をインライン化します。
たとえば、ABC というライブラリにデフォルトの allocator 関数があり、ライブラリクライアントがその関数を使用でき、ライブラリの内部でも使用されるものとします。
void* ABC_allocator(size_t size) { return malloc(size); }
-xO4 以上でライブラリを構築すると、コンパイラはライブラリ構成要素内での ABC_allocator の呼び出しをインライン化します。ライブラリクライアントが ABC_allocator を独自の allocator と置き換える場合、置き換えられた allocator は ABC_allocator を呼び出したライブラリ構成要素内では実行されません。最終的なプログラムには、この関数の相異なるバージョンが含まれることになります。
__hidden 指示子または __symbolic 指示子で宣言されたライブラリ関数は、ライブラリの構築時にインラインで生成することができます。これらの関数がクライアントからオーバーライドされることは、サポートされていません。「2.2 リンカースコープ指示子」を参照してください。
__global 指示子で宣言されたライブラリ関数はインラインで宣言しないでください。また、-xinline コンパイラオプションを使用することによってインライン化されることがないようにしてください。
-xinline、-xO、-xcrossfile、#pragma inline も参照してください。
例外が起きた場合の数学ルーチンの戻り値を強制的に IEEE 754 形式にします。この場合、例外メッセージは表示されないので、errno には依存しないでください。
実行速度を上げるため、一部のライブラリルーチンをインライン化します。オプションによって浮動小数点演算用オプションとプラットフォームに適したアセンブリ言語のインラインテンプレートが選択されます。
-xlibmil は、-xinline フラグで関数を指定しているかどうかに関係なく、関数をインライン化します。
ただし、こうした置換によって errno の値の信頼性が失われることがあります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。「2.13 errno の値の保持」も参照してください。
このオプションによって、コンパイラは最適化された数学ルーチンのライブラリを利用できます。このオプションを使用するときは -fround=nearest を指定することによって、デフォルトの丸めモードを使用する必要があります。
数学ルーチンライブラリは最高のパフォーマンスが得られるように最適化されており、通常、高速なコードを生成します。この結果は、通常の数学ライブラリが生成する結果と少し異なることがあります。その場合、通常、異なるのは最後のビットです。
ただし、こうした置換によって errno の値の信頼性が失われることがあります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。「2.13 errno の値の保持」も参照してください。
このライブラリオプションをコマンド行に指定する順序は重要ではありません。
このオプションは -fast オプションを指定した場合にも設定されます。
指定された Solaris Studio 提供のパフォーマンスライブラリにリンクします。
このオプションは、コンパイル時には暗黙的に無視されます。
(SPARC) 再配置可能なオブジェクトファイルのリンク時の最適化を実行するようコンパイラに指示します。このような最適化は、リンク時にオブジェクトのバイナリコードを解析することによって実行されます。オブジェクトファイルは書き換えられませんが、最適化された実行可能コードは元のオブジェクトコードとは異なる場合があります。
-xlinkopt をリンク時に有効にするには、少なくともコンパイルコマンドで -xlinkopt を使用する必要があります。-xlinkopt を指定しないでコンパイルされたオブジェクトバイナリについても、オプティマイザは限定的な最適化を実行できます。
-xlinkopt は、コンパイラのコマンド行にある静的ライブラリのコードは最適化しますが、コマンド行にある共有 (動的) ライブラリのコードは最適化しません。共有ライブラリを構築 (-G でコンパイル) する場合は、-xlinkopt も使用できます。
level には、実行する最適化のレベルを 0、1、2 のいずれかで設定します。最適化レベルは、次のとおりです。
表 B–29 -xlinkopt のフラグ
フラグ |
意味 |
---|---|
0 |
ポストオプティマイザは無効です。これがデフォルトです。 |
1 |
リンク時の命令キャッシュカラーリングと分岐の最適化を含む、制御フロー解析に基づき最適化を実行します。 |
2 |
リンク時のデッドコードの除去とアドレス演算の簡素化を含む、追加のデータフロー解析を実行します。 |
コンパイル手順とリンク手順を別々にコンパイルする場合は、両方の手順に -xlinkopt を指定する必要があります。
example% cc -c -xlinkopt a.c b.c example% cc -o myprog -xlinkopt=2 a.o
表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
レベルパラメータは、コンパイラのリンク時にだけ使用されます。前述の例では、オブジェクトバイナリが指定された 1 のレベルでコンパイルされていても、使用される最適化後のレベルは 2 です。
レベルパラメータなしで -xlinkopt を使用することは、-xlinkopt=1 を指定することと同じです。
このオプションは、プログラム全体のコンパイル時に、プロファイルのフィードバックとともに使用されると、もっとも効果的です。プロファイリングによって、コードでもっともよく使用される部分と、もっとも使用されない部分が明らかになるので、それに基づき処理を集中するよう、構築はオプティマイザに指示します。これは、リンク時に実行されるコードの最適な配置が命令のキャッシュミスを低減できるような、大きなアプリケーションにとって特に重要です。このようなコンパイルの例を次に示します。
example% cc -o progt -xO5 -xprofile=collect:prog file.c example% progt example% cc -o prog -xO5 -xprofile=use:prog -xlinkopt file.c |
プロファイルフィードバックの使用方法についての詳細は、「B.2.136 –xprofile=p」を参照してください。
-xlinkopt を指定してコンパイルする場合は、-zcombreloc リンカーオプションは指定しないでください。
このオプションを指定してコンパイルすると、リンク時間がわずかに増えます。オブジェクトファイルも大きくなりますが、実行可能ファイルのサイズは変わりません。-xlinkopt と -g を指定してコンパイルすると、デバッグ情報が取り込まれるので、実行可能ファイルのサイズが増えます。
並列化されているループとされていないループを示します。また、ループを並列化しない理由を簡単に説明します。-xloopinfo オプションは、-xautopar が指定されている場合にのみ有効です。指定されていない場合は、コンパイラによって警告が表示されます。
コードの実行速度を上げるには、このオプションにマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。
指定した C プログラムに対してプリプロセッサだけを実行します。その際、メイクファイルの依存関係を生成してその結果を標準出力に出力します。make ファイルと依存関係についての詳細は make(1) のマニュアルページを参照してください。
次に例を示します。
#include <unistd.h> void main(void) {} |
この例で出力されるものは、次のとおりです。
e.o: e.c e.o: /usr/include/unistd.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/machtypes.h e.o: /usr/include/sys/select.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/unistd.h |
-xM と -xMF を指定する場合、-xMF で指定したファイルに、コンパイラはすべてのメイクファイルの依存関係情報を追加します。
-xM と同様にメイクファイルの依存関係を生成しますが、/usr/include ファイルは除きます。次に例を示します。
more hello.c #include<stdio.h> main() { (void)printf(“hello\n”); } cc– xM hello.c hello.o: hello.c hello.o: /usr/include/stdio.h |
-xM1 オプションを使用してコンパイルすると、ヘッダーファイルの依存関係の出力が抑制されます。
cc– xM1 hello.c hello.o: hello.c |
-Xs モードでは -xM1 は使用できません。
-xM1 と -xMF を指定する場合、-xMF で指定したファイルに、コンパイラはすべてのメイクファイルの依存関係情報を追加します。
-xM と同様にメイクファイルの依存関係を生成しますが、コンパイルを続行します。-xMD は、指定されている場合は -o 出力ファイル名から派生したメイクファイルの依存関係情報の出力ファイルを生成します。または、ファイル名接尾辞を .d に置換 (または追加) して、入力元ファイル名を生成します。-xMD と -xMF を指定する場合、-xMF で指定したファイルに、プリプロセッサはすべてのメイクファイルの依存関係情報を書き込みます。複数のソースファイルで -xMD -xMF または -xMD -o filename を使用してコンパイルすることはできず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。
メイクファイルの依存関係の出力先ファイルを指定するには、このオプションを使用します。コマンド行で -xMF を使用して、複数の入力ファイルのファイル名を個別に指定することはできません。複数のソースファイルで -xMD -xMF または -xMMD -xMF を使用してコンパイルすることはできず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。
システムヘッダーファイルを除き、メイクファイルの依存関係を生成するには、このオプションを使用します。これは、-xM1 と同様の機能ですが、コンパイルが続行されます。-xMMD は、指定されている場合は -o 出力ファイル名から派生したメイクファイルの依存関係情報の出力ファイルを生成します。または、ファイル名接尾辞を .d に置換 (または追加) して、入力元ファイル名を生成します。-xMF を指定する場合、コンパイラは代わりに、ユーザーが指定したファイル名を使用します。複数のソースファイルで -xMMD -xMF または -xMMD -o filename を使用してコンパイルすることはできず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。
データセグメントをテキストセグメントにマージします。このコンパイルで生成するオブジェクトファイルで初期化されるデータは読み取り専用なので、ld -N でリンクしていないかぎり、プロセスどうしで共有することができます。
3 つのオプション -xMerge -ztext -xprofile=collect を一緒に使用するべきではありません。-xMerge を指定すると、静的に初期化されたデータを読み取り専用記憶領域に強制的に配置します。 -ztext を指定すると、位置に依存するシンボルを読み取り専用記憶領域内で再配置することを禁止します。-xprofile=collect を指定すると、書き込み可能記憶領域内で、静的に初期化された、位置に依存するシンボルの再配置を生成します。
このコマンドは、pragma opt のレベルを指定されたレベルに制限します。 v は、off、1、2、3、4、5 のいずれかです。デフォルト値は -xmaxopt=off であり、pragma opt は無視されます。引数を指定せずに -xmaxopt を指定すると、-xmaxopt=5 を指定したことになります。
-xO と -xmaxopt の両方を指定する場合、-xO で設定する最適化レベルが -xmaxopt 値を超えてはいけません。
(SPARC) データの境界整列についてコンパイラが使用する想定を制御するには、-xmemalign オプションを使用します。境界整列が潜在的に正しくないメモリーアクセスにつながる生成コードを制御し、境界整列が正しくないアクセスが発生したときのプログラム動作を制御すれば、より簡単に SPARC にコードを移植できます。
想定するメモリー境界整列の最大値と、境界整列に失敗したデータがアクセスされた際の動作を指定します。a (境界整列) と b (動作) の両方の値が必要です。a は、想定する最大メモリー境界整列です。b は、境界整列に失敗したメモリーへのアクセスに対する動作です。次に、-memalign の境界整列と動作の値を示します。
表 B–30 -xmemalign の境界整列と動作のフラグ
a |
b | ||
---|---|---|---|
1 |
最大 1 バイトの境界整列 |
i |
アクセスを解釈し、実行を継続する |
2 |
最大 2 バイトの境界整列 |
s |
シグナル SIGBUS を発生させる |
4 |
最大 4 バイトの境界整列 |
f |
-xarch=v9 の不変式の場合にのみ、 4 バイト以下の境界整列に対してシグナル SIGBUS を発生させ、それ以外ではアクセスを解釈して実行を継続する。そのほかすべての -xarch 値では、f フラグは i と同じです。 |
8 |
最大 8 バイトの境界整列 | ||
16 |
最大 16 バイトの境界整列 |
b を i か f のいずれかに設定してコンパイルしたオブジェクトファイルにリンクする場合は、必ず、-xmemalign を指定する必要があります。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
コンパイル時に境界整列が判別できるメモリーへのアクセスの場合、コンパイラはそのデータの境界整列に適したロードおよびストア命令を生成します。
境界整列がコンパイル時に決定できないメモリーアクセスの場合、コンパイラは、境界整列を想定して、必要なロード/ストア命令のシーケンスを生成します。
-xmemalign オプションを使用すると、このような判別不可能な状況の時にコンパイラが想定するデータの最大メモリー境界整列を指定できます。-xmemalign オプションは、境界整列に失敗したメモリーへのアクセスが実行時に発生した場合に行われるエラー動作 (処理) についても指定できます。
実行時の実際のデータ境界整列が指定された整列に達しない場合、境界整列に失敗したアクセス (メモリー読み取りまたは書き込み) が行われると、トラップが発生します。このトラップに対して可能な応答は 2 つあります。
OS がトラップを SIGBUS シグナルに変換します。プログラムがこのシグナルを捕捉しなかった場合、プログラムは異常終了します。プログラムがシグナルを捕捉しても、境界整列に失敗したアクセスが成功するわけではありません。
境界整列に失敗したアクセスが正常に成功したかのように OS がアクセスを解釈し、プログラムに制御を戻すことによってトラップを処理します。
次のデフォルトの値は、-xmemalign オプションがまったく指定されていない場合にのみ適用されます。
-xmemalgin=8i: すべての v8 アーキテクチャーに適用される。
-xmemalign=8s すべての v9 アーキテクチャーに適用される。
次に、-xmemalign オプションが指定されているが値を持たない場合のデフォルト値を示します。
-xmemalign=1i すべての -xarch 値に適用される。
次の表は、-xmemalign で処理できるさまざまな境界整列の状況とそれに適した -xmemalign 指定を示しています。
表 B–31 -xmemalign の例
コマンド |
状況 |
---|---|
-xmemalign=1s |
境界整列されていないデータへのアクセスが多いため、トラップ処理が遅すぎる |
-xmemalign=8i |
コード内に境界整列されていないデータへのアクセスが意図的にいくつか含まれているが、それ以外は正しい |
-xmemalign=8s |
プログラム内に境界整列されていないデータへのアクセスは存在しないと思われる |
-xmemalign=2s |
奇数バイトへのアクセスが存在しないか検査したい |
-xmemalign=2i |
奇数バイトへのアクセスが存在しないか検査し、プログラムを実行したい |
(x86) -xmodel オプションを使用すると、コンパイラで 64 ビットオブジェクトの形式を Solaris x86 プラットフォーム用に変更できます。このオプションは、そのようなオブジェクトのコンパイル時にのみ指定してください。
このオプションは、64 ビット対応の x64 プロセッサで -m64 も指定した場合にのみ有効です。
a には次のいずれかを指定します。
表 B–32 -xmodel のフラグ
値 |
意味 |
---|---|
small |
このオプションは、実行されるコードの仮想アドレスがリンク時にわかっていて、すべてのシンボルが 0 ~ 2^31 - 2^24 - 1 の範囲の仮想アドレスに配置されることがわかっているスモールモデルのコードを生成します。 |
kernel |
すべてのシンボルが 2^64 - 2^31 ~ 2^64 - 2^24 の範囲で定義されるカーネルモデルのコードを生成します。 |
medium |
データセクションへのシンボリック参照の範囲に関する前提がないミディアムモデルのコードを生成します。テキストセクションのサイズとアドレスは、スモールコードモデルの場合と同じように制限されます。静的データが大量にあるアプリケーションでは、-m64 を指定してコンパイルするときに、-xmodel=medium が必要になることがあります。 |
このオプションは累積的ではないため、コンパイラはコマンド行でもっとも右の -xmodel に従って、モデルの値を設定します。
-xmodel を指定しない場合、コンパイラは -xmodel=small とみなします。引数を指定せずに-xmodel を指定すると、エラーになります。
すべての翻訳単位をこのオプションでコンパイルする必要はありません。アクセスするオブジェクトが範囲内にあれば、選択したファイルをコンパイルできます。
すべての Linux システムが、ミディアムモデルをサポートしているわけではありません。
デフォルトのライブラリリンクを行いません。つまり ld(1) に -l オプションを渡しません。通常は、cc ドライバが -lc を ld に渡します。
-xnolib を使用する場合、すべての -l オプションをユーザーが渡さなければいけません。
数学ライブラリのルーチンをインライン化しません。このオプションは -fast オプションのあとに指定してください。次に例を示します。
% cc– fast– xnolibmil.... |
前に -xlibmopt オプションが指定されている場合にその指定を無効にして、最適化された数学ライブラリをコンパイラが使用しないようにします。このオプションは、-xlibmopt を設定することによって最適化された数学ライブラリを使用可能にする -fast のあとで使用してください。
% cc -fast -xnolibmopt ... |
実行可能ファイルに共有ライブラリへの実行時検索パスを組み込みません。
通常、cc は -R パスをリンカーにまったく渡しません。オプションの中には、-xliclib=sunperf および -xopenmp のように、-R パスをリンカーに渡すものがあります。-xnorunpath を使用すると、パスが渡されなくなります。
このオプションは、プログラムで使用される共有ライブラリへのパスが異なる顧客に出荷される実行可能ファイルの構築にお勧めします。
オブジェクトコードを最適化します。大文字 O のあとに数字の 1、2、3、4、5 のいずれかが続きます。一般に、最適化レベルが高いほど、実行時のパフォーマンスは向上します。しかし、最適化レベルが高ければ、それだけコンパイル時間が増え、実行可能ファイルが大きくなる可能性があります。
ごくまれに、-xO2 の方がほかの値より実行速度が速くなることがあり、-xO3 の方が -xO4 より早くなることがあります。すべてのレベルでコンパイルを行なってみて、こうしたことが発生するかどうか試してみてください。
オプティマイザによりメモリーが不足した場合は、最適化のレベルを下げて現在の関数を再試行することによって処理を続行しようとします。これ以後の関数に対してはコマンド行オプションで指定されている本来のレベルで再開します。
デフォルトでは最適化は行われません。ただし、これは最適化レベルを指定しない場合にかぎり有効です。最適化レベルを指定すると、最適化を無効にするオプションはありません。
最適化レベルを設定しないようにする場合は、最適化レベルを示すようなオプションを指定しないようにしてください。たとえば、-fast は最適化を -xO5 に設定するマクロオプションです。それ以外で最適化レベルを指定するすべてのオプションでは、最適化レベルが設定されたという警告メッセージが表示されます。最適化を設定せずにコンパイルする唯一の方法は、コマンド行またはメイクファイルから最適化レ ベルを指定するオプションをすべて削除することです。
-xO3 以下の最適化レベルで -g を指定すると、ほぼ完全な最適化と可能なかぎりのシンボル情報を取得することができます。末尾呼び出しの最適化とバックエンドのインライン化は無効です。
-xO4 以上の最適化レベルで -g を指定すると、完全な最適化と可能なかぎりのシンボル情報を取得することができます。
-g を指定したデバッグでは、-xOn が抑制されませんが、-xOn はいくつかの方法で -g を制限します。たとえば、最適化オプションを使用すると、dbx から渡された変数を表示できないなど、デバッグの機能が一部制限されます。しかし、dbx where コマンドを使用して、シンボリックトレースバックを表示することは可能です。詳細は、『dbx コマンドによるデバッグ』の第 1 章の「最適化コードのデバッグ」を参照してください。
-xO と -xmaxopt の両方を指定する場合、-xO で設定する最適化レベルが -xmaxopt 値を超えてはいけません。
-xO3 または -xO4 で (1 つの関数内のコードが数千行になるような) 大きな関数を最適化する場合、膨大な量の仮想メモリーが必要になり、マシンのパフォーマンスが低下することがあります。
次の表は、SPARC プラットフォームでの最適化処理について説明しています。
表 B–33 SPARC プラットフォームでの -xO のフラグ
値 |
意味 |
---|---|
-xO1 |
最小限の局所的な最適化 (ピープホール) を行います。 |
-xO2 |
基本的な局所的および大域的最適化を行います。ここでは帰納変数の削除、局所的および大域的な共通部分式の除去、算術の簡素化、コピー通達、定数通達、不変ループの最適化、レジスタの割り当て、基本ブロックのマージ、再帰的末尾の除去、無意味なコードの除去、末尾呼び出しの削除、複雑な式の展開を行います。 -xO2レベルでは、大域、外部、間接の参照または定義はレジスタに割り当てられません。これらの参照や定義は、あたかも volatile 型として宣言されたかのように取り扱われます。一般的 -xO2 レベルではコードサイズはもっとも小さくなります。 |
-xO3 |
-xO2 に加えて、外部変数の参照または定義も最適化します。ループの展開やソフトウェアのパイプラインなども実行されます。このレベルでは、ポインタ代入の影響は追跡されません。デバイスドライバをコンパイルするとき、またはシグナルハンドラの内部から外部変数を変更するプログラムをコンパイルするときは、volatile 型の修飾子を使用してオブジェクトが最適化されないようにする必要があります。一般的に -xO3 レベルではコードサイズが増大します。 |
-xO4 |
-xO3 に加えて、同一のファイルに含まれている関数の自動的なインライン化も行います。通常はこれによって実行速度が上がります。インライン化される関数を制御したい場合は、「B.2.96 -xinline=list」を参照してください。 このレベルでは、ポインタ代入の結果が追跡され、通常はコードサイズが増大します。 |
-xO5 |
最高レベルの最適化を行おうとします。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。このレベルの最適化によってパフォーマンスが改善される確率を高くするには、プロファイルのフィードバックを使用します。詳細は、「B.2.136 –xprofile=p」を参照してください。 |
次の表は、x86 プラットフォームでの最適化処理について説明しています。
表 B–34 x86 プラットフォームでの -xO のフラグ
値 |
意味 |
---|---|
-xO1 |
デフォルトの最適化での 1 つの段階のほかに、メモリーからの引数の事前ロードと、クロスジャンプ (末尾融合) を行います。 |
-xO2 |
高レベルと低レベルの両方の命令をスケジュールし、改良されたスピルコードの解析、ループ中のメモリー参照の除去、レジスタの寿命解析、高度なレジスタ割り当て、大域的な共通部分式の除去を行います。 |
-xO3 |
レベル 2 で行う最適化のほかに、ループの削減と帰納変数の除去を行います。 |
-xO4 |
-xO3 レベルで行う最適化レベルに加えて、同じファイルに含まれる関数のインライン展開も自動的に行われます。インライン展開を自動的に行なった場合、通常は実行速度が速くなりますが、遅くなることもあります。一般にこのレベルを使用するとコードサイズが大きくなります。 |
-xO5 |
最高レベルの最適化を行います。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。たとえば、エクスポートされた関数が局所的に呼び出されるような関数の入口を設定する、スピルコードを最適化する、命令スケジュールを向上するための解析を追加するなどがあります。 |
デバッグについての詳細は、『『Solaris Studio: dbx コマンドによるデバッグ』』を参照してください。最適化についての詳細は、『『Solaris Studio 12: パフォーマンスアナライザ』』マニュアルを参照してください。
-xldscope および -xmaxopt も参照してください。
OpenMP 指令で明示的な並列化を有効にするには、-xopenmp オプションを使用します。並列化されたプログラムをマルチスレッド環境で実行するには、実行前に OMP_NUM_THREADS 環境変数を設定しておく必要があります。
入れ子並列を有効にするには、OMP_NESTED 環境変数を TRUE に設定する必要があります。入れ子並列は、デフォルトでは無効です。
次の表に i の値を示します。
表 B–35 -xopenmp のフラグ
値 |
意味 |
---|---|
parallel |
OpenMP プラグマの認識を有効にします。-xopenmp=parallel の最適化レベルは -x03 です。コンパイラは必要に応じて最適化レベルを -x03 に変更し、警告メッセージを表示します。 このフラグは、プロセッサのトークン _OPENMP も定義します。 |
noopt |
OpenMP プラグマの認識を有効にします。最適化レベルが -O3 より低い場合は、最適化レベルは上げられません。 cc -O2 -xopenmp=noopt のように -O3 より低い最適化レベルを明示的に設定すると、エラーが表示されます。-xopenmp=noopt で最適化レベルを指定しなかった場合、OpenMP プラグマが認識され、その結果プログラムが並列化されますが、最適化は行われません。 このフラグは、プロセッサのトークン _OPENMP も定義します。 |
none |
このフラグはデフォルトで、OpenMP プラグマの認識が有効化、プログラムの最適化レベルの変更、およびプリプロセッサトークンの事前定義を実行しません。 |
-xopenmp を指定しても値を設定しない場合、コンパイラは -xopenmp=parallel を仮定します。-xopenmp を指定しない場合、コンパイラは -xopenmp=none を仮定します。
dbx を指定して OpenMP プログラムをデバッグする場合、-g と -xopenmp=noopt を指定してコンパイルすれば、並列化部分にブレークポイントを設定して変数の内容を表示することができます。
-xopenmp のデフォルトは、将来変更される可能性があります。警告メッセージを出力しないようにするには、適切な最適化を明示的に指定します。
いずれかの .so を構築するときに -xopenmp を使用している場合は、実行可能ファイルをリンクするときに -xopenmp を使用する必要があります。また、実行可能ファイルに関して使用するコンパイラは、-xopenmp を指定して .so を構築するときに使用したコンパイラより古いものであってはいけません。これは、OpenMP 指令を含むライブラリをコンパイルする場合に特に重要です。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
最良のパフォーマンスを得るには、OpenMP 実行時ライブラリ libmtsk.so の最新パッチが、システムにインストールされていることを確認してください。
OpenMP の C の実装に固有の情報については、「3.2 OpenMP に対する並列化」を参照してください。
OpenMP の詳細は、『Solaris Studio OpenMP API ユーザーズガイド』を参照してください。
すべての K&R C 関数のプロトタイプを出力する際、コンパイラはソースファイルに対して構文および意味検査のみ行います。このオプションは、オブジェクトコードや実行可能コードを生成しません。たとえば次のソースファイルに -xP を指定したと仮定します。
f() { } main(argc,argv) int argc; char *argv[]; { } |
この例に対しては、次のとおりに出力します。
int f(void); int main(int, char **); |
SPARC では、次の値が有効です。4k、8K、64K 、512K、2M、4M、 32M、256M、2G、16G、または default。
次の値は、86/x で有効です。4K、2M、4M、1G、または default。
有効なページサイズを指定しないと、要求は実行時に暗黙的に無視されます。ターゲットプラットフォームに対して有効なページサイズを指定する必要があります。
Solaris オペレーティングシステムでページのバイト数を調べるには、getpagesize(3C) コマンドを使用します。Solaris オペレーティングシステムでは、ページサイズ要求に従うという保証はありません。ターゲットプラットフォームのページサイズを判断するには、pmap(1) または meminfo(2) を使用します。
ターゲットプラットフォームのページサイズを判断するには、 pmap(1) または meminfo(2) を使用します。
-xpagesize オプションは、コンパイル時とリンク時に使用しないかぎり無効です。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
-xpagesize=default を指定すると、Solaris オペレーティングシステムがページサイズを設定します。
このオプションを指定してコンパイルするのは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Solaris コマンドの ppgsz(1) を実行するのと同じことです。詳細は Solaris のマニュアルページを参照してください。
このオプションは -xpagesize_heap と -xpagesize_stack のマクロです。これらの 2 つのオプションは -xpagesize と同じ次の引数を使用します。両方に同じ値を設定するには -xpagesize を指定します。別々の値を指定するには個々に指定します。
このオプションは、—xpagesize と同じ値を受け入れます。有効なページサイズを指定しないと、要求は実行時に暗黙的に無視されます。
Solaris オペレーティングシステムでページのバイト数を調べるには、getpagesize(3C) コマンドを使用します。Solaris オペレーティングシステムでは、ページサイズ要求に従うという保証はありません。ターゲットプラットフォームのページサイズを判断するには、pmap(1) または meminfo(2) を使用します。
ターゲットプラットフォームのページサイズを判断するには、pmap(1) または meminfo(2) を使用します。
-xpagesize_heap=default を指定すると、Solaris オペレーティングシステムはページサイズを設定します。
このオプションを指定してコンパイルするのは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Solaris コマンドの ppgsz(1) を実行するのと同じことです。詳細は Solaris のマニュアルページを参照してください。
-xpagesize_heap オプションは、コンパイル時とリンク時に使用しないかぎり無効です。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
このオプションは、—xpagesize と同じ値を受け入れます。有効なページサイズを指定しないと、要求は実行時に暗黙的に無視されます。
Solaris オペレーティングシステムでページのバイト数を調べるには、getpagesize(3C) コマンドを使用します。Solaris オペレーティングシステムでは、ページサイズ要求に従うという保証はありません。ターゲットプラットフォームのページサイズを判断するには、pmap(1) または meminfo(2) を使用します。
-xpagesize_stack=default を指定すると、Solaris オペレーティングシステムはページサイズを設定します。
このオプションを指定してコンパイルするのは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Solaris コマンドの ppgsz(1) を実行するのと同じことです。詳細は Solaris のマニュアルページを参照してください。
-xpagesize_stack オプションは、コンパイル時とリンク時に使用しないかぎり無効 です。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
このコンパイラオプションは、プリコンパイル済みヘッダー機能を起動します。v には、auto、autofirst、collect:pch_filename、use:pch_filename のいずれかを指定できます。この機能は、-xpch (「B.2.128 -xpch=v」 で詳述) と -xpchstop (「B.2.129 -xpchstop=[file|<include>]」 で詳述) オプションで、#pragma hdrstop 指令 (「2.11.8 hdrstop」 で詳述) と組み合わせて利用できます。
-xpch オプションは、プリコンパイル済みヘッダーファイルを作成して、コンパイル時間を短縮するときに使用します。プリコンパイル済みヘッダーファイルは、ソースファイルが大量のソースコードを含む共通のインクルードファイル群を共有しているようなアプリケーションのコンパイル時間を低減するよう設計されています。プリコンパイル済みヘッダーを使用することによって、1 つのソースファイルから一連のヘッダーファイルに関する情報を収集し、そのソースファイルを再コンパイルする場合や、同じ一連のヘッダーを持つほかのソースファイルをコンパイルする場合に、その情報を使用することができます。コンパイラが収集する情報は、プリコンパイル済みヘッダーファイルに格納されます。
関連項目
プリコンパイル済みヘッダーファイルをコンパイラに自動的に生成させることができます。このためには、次のいずれかの方法を選択します。1 つは、ソースファイルで検出された最初のインクルードファイルからプリコンパイル済みヘッダーファイルを作成する方法、もう 1 つは、最初のインクルードファイルから、最後のインクルードファイルを特定する綿密に定義された地点までの間にソースファイルで検出されたインクルードファイル群から選択してプリコンパイル済みヘッダーファイルを作成する方法です。次の 2 つのフラグのいずれかを使用して、プリコンパイル済みヘッダーの自動生成にコンパイラが使用すべき方法を指示します。
表 B–36 -xpch フラグ
フラグ |
意味 |
---|---|
-xpch=auto |
プリコンパイル済みヘッダーファイルの内容は、コンパイラがソースファイルで検出した最長の活性文字列 (活性文字列の特定方法についてはこのあとを参照) に基づきます。このフラグは、もっとも多くのヘッダーファイルからなる可能性があるプリコンパイル済みヘッダーファイルを生成します。 |
-xpch=autofirst |
このフラグは、ソースファイル内で最初に検出されたヘッダーのみからなるプリコンパイル済みヘッダーファイルを生成します。 |
プリコンパイル済みヘッダーファイルを手動で作成する場合は、最初に -xpch を指定し、collect モードを指定します。-xpch=collect を指定するコンパイルコマンドは、ソースファイルを 1 つしか指定できません。次の例では、-xpch オプションがソースファイル a.c に基づいて myheader.cpch というプリコンパイル済みヘッダーファイルを作成します。
cc -xpch=collect:myheader a.c
有効なプリコンパイル済みヘッダーファイル名には必ず、.cpch という接尾辞が付きます。pch_filename を指定する場合、自分で接尾辞を追加することも、コンパイラに追加させることもできます。たとえば、cc -xpch=collect:foo a.c と指定すると、プリコンパイル済みヘッダーファイルには foo.cpch という名前が付けられます。
-xpch=auto または -xpch=autofirst のときにプリコンパイル済みヘッダーファイルを使用できない場合、コンパイラは新しいプリコンパイル済みヘッダーファイルを生成します。-xpch=use のときにプリコンパイル済みヘッダーファイルを使用できない場合は、警告が発行され、実際のヘッダーを使ってコンパイルが行われます。
特定のプリコンパイル済みヘッダーファイルを使用するようコンパイラに指示することもできます。このためには、-xpch=use:pch_filename を使用します。プリコンパイル済みヘッダーファイルを作成するために使用されたソースファイルと同じインクルードファイルの並びを持つソースファイルであれば、いくつでも指定できます。たとえば、use モードで、次のようなコマンドがあるとします。cc -xpch=use:foo.cpch foo.c bar.c foobar.c。
次の項目が真の場合にかぎり、既存のプリコンパイル済みヘッダーファイルを使用します。次の項目で真ではないものがあれば、プリコンパイル済みヘッダーファイルを再作成する必要があります。
プリコンパイル済みヘッダーファイルにアクセスするために使用するコンパイラは、プリコンパイル済みヘッダーファイルを作成したコンパイラと同じであること。あるバージョンのコンパイラで作成されたプリコンパイル済みヘッダーファイルは、別のバージョンのコンパイラでは使用できない場合があります。
-xpch オプション以外で -xpch=use とともに指定するコンパイラオプションは、プリコンパイル済みヘッダーファイルが作成されたときに指定されたオプションと一致すること。
-xpch=use で指定する一連のインクルードヘッダー群は、プリコンパイル済み ヘッダーファイルが作成されたときに指定されたヘッダー群と同じであること。
-xpch=use で指定するインクルードヘッダーの内容が、プリコンパイル済みヘッ ダーファイルが作成されたときに指定されたインクルードヘッダーの内容と同じであること。
現在のディレクトリ (すなわち、コンパイルが実行中で指定されたプリコンパイル済みヘッダーファイルを使用しようとしているディレクトリ) が、プリコンパイル済みヘッダーファイルが作成されたディレクトリと同じであること。
-xpch=collect で指定したファイル内の #include 指令を含む前処理指令の最初のシーケンスが、-xpch=use で指定するファイル内の前処理指令のシーケンスと同じであること。
プリコンパイル済みヘッダーファイルを複数のソースファイル間で共有するために、これらのソースファイルには、最初のトークンの並びとして一連の同じインクルードファイルを使用していなければいけません。トークンはキーワードか名前、句読点のいずれかです。コンパイラは、コードおよび、#if 指令によって除外されたコードをトークンとして認識しません。この最初のトークンの並びは、活性文字列 (viable prefix) として知られています。言い替えれば、活性文字列は、すべてのソースファイルに共通のソースファイルの先頭部分です。コンパイラは、この活性文字列に基づいて、プリコンパイル済みヘッダーファイルを作成し、ソース内のプリコンパイルするヘッダーファイルを特定します。
現在のコンパイル中にコンパイラが検出する活性文字列は、プリコンパイル済みヘッダーファイルの作成に使用した活性文字列と一致する必要があります。言い替えれば、活性文字列は、同じプリコンパイル済みヘッダーファイルを使用するすべてのソースファイル間で一貫して解釈される必要があります。
ソースファイルの活性文字列には、コメントと次に示すプリプロセッサ指令のみを指定できます。
#include #if/ifdef/ifndef/else/elif/endif #define/undef #ident (if identical, passed through as is) #pragma (if identical)
前述の任意の指令はマクロを参照する場合があります。#else、#elif、#endif 指令は、活性文字列内で一致している必要があります。コメントは無視されます。
-xpch=auto か -xpch=autofirst が指定されていて、次のように定義されている場合、コンパイラは活性文字列の終点を自動的に特定します。
最初の宣言/定義
最初の #line 指令
#pragma hdrstop 指令
指定されたインクルードファイルのあと (-xpch=auto および -xpchstop が指定された場合)
最初のインクルードファイル (-xpch=autofirst が指定された場合)
プリプロセッサ条件コンパイル文内に終点がある場合は、警告が生成され、プリコンパイル済みヘッダーファイルの自動作成は無効になります。また、#pragma hdrstop と -xpchstop オプションの両方が指定された場合、コンパイラは 2 つの停止点のうちの早い方を使用して、活性文字列を終了します。
-xpch=collect または -xpch=use の場合、活性文字列は #pragma hdrstop で終了します。
プリコンパイル済みヘッダーファイルを共有する各ファイルの活性文字列内では、対応する各 #define 指令と #undef 指令は同じシンボルを参照する必要があります (#define の場合は、各指令は同じ値を参照しなければいけません)。各活性文字列内での順序も同じである必要があります。対応する各プラグマも同じで、その順序もプリコンパイル済みヘッダーを共有するすべてのファイルで同じでなければいけません。
ヘッダーファイルがプリコンパイル可能となる条件。それは、複数のソースファイルに渡ってヘッダーファイルの一貫した解釈ができることです。具体的には、完全な宣言だけが含まれていることです。すなわち、どのファイルの宣言も有効な宣言として独立している必要があります。struct S; などの不完全な型宣言は有効な型宣言です。完全な型宣言がほかのファイルに存在している可能性があります。次のヘッダーファイルの例を考えてみてください。
file a.h struct S { #include "x.h" /* not allowed */ }; file b.h struct T; // ok, complete declaration struct S { int i; [end of file, continued in another file] /* not allowed*/ |
プリコンパイル済みヘッダーファイルに組み込まれるヘッダーファイルは、次の項目に違反しないようにしてください。これらの制限に違反するプログラムをコンパイルした場合、結果は予測できません。
ヘッダーファイルに、__DATE__ や __TIME__ が含まれていてはいけません。
ヘッダーファイルに、#pragma hdrstopが含まれていてはいけません。
ヘッダーに変数と関数の宣言が含まれている場合は、ヘッダーも同様にプリコンパイル可能です。
プリコンパイル済みヘッダーファイルの自動作成では、コンパイラは、そのファイルを SunWS_cache ディレクトリに書き込みます。このディレクトリは常に、オブジェクトファイルが作成される場所に置かれます。dmake の下で適切に機能するように、ファイルの更新はロックして行われます。
強制的に再構築させる必要がある場合は、CCadmin ツールを使って、このプリコンパイル済みヘッダーファイルのキャッシュディレクトリをクリアすることができます。詳細は、CCadmin(1) のマニュアルページを参照してください。
矛盾する -xpch フラグをコマンド行に指定しないでください。たとえば、-xpch=collect と -xpch=auto の両方を指定したり、-xpchstop=<include> を付けて -xpch=autofirst を指定したりすると、エラーになります。
-xpch=autofirst を指定するか、-xpchstop なしで -xpch=auto を指定した場合、最初のインクルードファイル、あるいは -xpch=auto に -xpchstop を付けて指定したインクルードファイルの前に宣言や定義、#line 指令があると、エラーになり、プリコンパイル済みヘッダーファイルの自動生成が無効になります。
-xpch=autofirst または -xpch=auto で、最初のインクルードファイルの前に #pragma hdrstop があると、プリコンパイル済みヘッダーファイルの自動生成が無効になります。
-xpch=collect が指定されている場合、コンパイラはプリコンパイル済みヘッダーファイル用の依存関係情報を生成します。この依存関係情報を利用するには、メイクファイル内に適切な規則を作成する必要があります。次のメイクファイルの例を考えてみてください。
%.o : %.c shared.cpch $(CC) -xpch=use:shared -xpchstop=foo.h -c $< default : a.out foo.o + shared.cpch : foo.c $(CC) -xpch=collect:shared -xpchstop=foo.h foo.c -c a.out : foo.o bar.o foobar.o $(CC) foo.o bar.o foobar.o clean : rm -f *.o shared.cpch .make.state a.out |
コンパイラによって生成された依存関係情報とともに、これらの make 規則があると、-xpch=collect で使用されたソースファイル、またはプリコンパイル済みヘッダーファイルを構成するヘッダーのどれかに変更があった場合、手動で作成されたプリコンパイル済みヘッダーファイルが強制的に再作成されます。これにより、古いプリコンパイル済みヘッダーファイルの使用が防止されます。
-xpch=auto または -xpch=autofirst の場合、メイクファイルに追加の make 規則を作成する必要はありません。
-xpchstop=file オプションは、プリコンパイル済みヘッダーファイル用の活性文字列の最後のインクルードファイルを指定するときに使用します。コマンド行で -xpchstop を使用するのは、cc コマンドで指定する各ソースファイルの file を参照する最初のインクルード指令のあとに hdrstopプラグマを配置するのと同じことです。
<include> までのヘッダーファイルに基づくプリコンパイル済みヘッダーファイルを作成するには、-xpchstop=<include> と -xpch-auto を組み合わせます。このフラグは、活性文字列全体に含まれているすべてのヘッダーファイルを使用するデフォ ルトの -xpch=auto の動作に優先します。
次の例では、-xpchstop オプションは、プリコンパイル済みヘッダーファイルの活性文字列が projectheader.h をインクルードして終わるよう指定します。したがって、privateheader.h は活性文字列の一部ではありません。
example% cat a.c #include <stdio.h> #include <strings.h> #include "projectheader.h" #include "privateheader.h" . . . example% cc -xpch=collect:foo.cpch a.c -xpchstop=projectheader.h -c |
-xpch も参照してください。
移植可能な実行可能コード (Portable Executable Code、PEC) バイナリを生成します。PEC バイナリは、自動チューニングシステム (Automatic Tuning System、ATS) と組み合わせて使用できます。ATS はチューニングとトラブルシューティングの目的で、コンパイル済み PEC バイナリを再構築する方法で動作し、下のソースコードは必要ありません。ATS の詳細は、http://cooltools.sunsource.net/ を参照してください。
-xpec を指定して構築したバイナリは通常、-xpec なしで構築したバイナリより 5 ~ 10 倍の大きさになります。
-xpec を指定しない場合は、-xpec=no に設定されます。-xpec をフラグなしで指定した場合は、コンパイラでは -xpec=yes が指定されます。
(x86) Pentium プロセッサ用のコードを生成します。
gprof(1) によるプロファイルの準備として、データを収集するためのオブジェクトコードを生成します。この記録機構は実行が正常終了すると、gmon.outファイルを作成します。
-xpg を指定した場合、-xprofile を使用する利点はありません。 これら 2 つは、他方で使用できるデータを生成せず、他方で生成されたデータを使用できません。
プロファイルは、64 ビット Solaris プラットフォームで prof(1) または gprof(1)、32 ビット Solaris プラットフォームで gprof を使用して生成され、おおよそのユーザー CPU 時間が含まれます。これらの時間は、メインの実行可能ファイルのルーチンと、実行可能ファイルをリンクするときにリンカー引数として指定した共有ライブラリのルーチンの PC サンプルデータ (pcsample(2) を参照) から導出されます。そのほかの共有ライブラリ (dlopen(3DL) を使用してプロセスの起動後に開かれたライブラリ) のプロファイルは作成されません。
32 ビット Solaris システムの場合、prof(1) を使用して生成されたプロファイルには、実行可能ファイルのルーチンだけが含まれます。32 ビット共有ライブラリのプロファイルは、-xpg で実行可能ファイルをリンクし、 gprof(1) を使用することで作成できます。
x86 システムでは、-xpg には -xregs=frameptr との互換性がないため、これらの 2 つのオプションは同時に使用できません。 -xregs=frameptr は -fast に含まれている点にも注意してください。
Solaris 10 ソフトウェアには、 -p でコンパイルされたシステムライブラリが含まれません。その結果、Solaris 10 プラットフォームで収集されたプロファイルには、システムライブラリルーチンの呼び出し回数が含まれません。
コンパイル時に -xpg を指定した場合は、リンク時にも指定する必要があります。「A.1.2 コンパイル時とリンク時のオプション」に、コンパイル時とリンク時の両方に指定する必要があるオプションの全一覧をまとめています。
先読みをサポートするアーキテクチャーで先読み命令を有効にします。
明示的な先読みは、測定値によってサポートされた特殊な環境でのみ使用すべきです。
val には、次のいずれかを指定します。
表 B–37 -xprefetch のフラグ
フラグ |
意味 |
---|---|
latx:factor |
指定された factor によってコンパイラで使用されるロードするための先読みと、ストアするための先読みを調整します。このフラグは、-xprefetch=auto とのみ組み合わせることができます。「B.2.133.1 先読み応答率」を参照してください。 |
[no%]auto |
先読み命令の自動生成を有効 [無効] にします。 |
[no%]explicit |
明示的な先読みマクロを有効 [無効] にします。 |
yes |
廃止。使わないでください。代わりに - xprefetch=auto,explicit を使用します。 |
no |
廃止。使わないでください。代わりに -xprefetch=no%auto,no%explicit を使用します。 |
デフォルトは -xprefetch=auto,explicit です。基本的に非線形のメモリーアクセスパターンを持つアプリケーションには、このデフォルトが良くない影響をもたらします。デフォルトを無効にするには、-xprefetch=no%auto,no%explicit を指定します。
sun_prefetch.h ヘッダーファイルには、明示的な先読み命令を指定するためのマクロが含まれています。先読み命令は、実行コード中のマクロの位置にほぼ相当するところに挿入されます。
先読みの応答時間とは、先読み命令を実行してから先読みされたデータがキャッシュで利用可能となるまでのハードウェアの遅延のことです。
係数には、n.n. という形式の正の数値を使用します。
コンパイラは、先読み命令と先読みされたデータを使用するロードまたはストア命令の距離を決定する際に先読み応答時間の値を想定します。先読みからロードまでのデフォルト応答時間は、先読みからストアまでのデフォルト応答時間と同じでない場合があります。
コンパイラは、幅広いマシンとアプリケーションで最適なパフォーマンスを得られるように先読み機構を調整します。しかし、コンパイラの調整作業が必ずしも最適であるとはかぎりません。メモリーに負担のかかるアプリケーション、特に大型のマルチプロセッサでの実行を意図したアプリケーションの場合、先読みの応答時間の値を引き上げることにより、パフォーマンスを向上できます。この値を増やすには、1 よりも大きい係数を使用します。.5 ~ 2.0 の値を指定すると、ほとんどの場合は最大のパフォーマンスが実現されます。
外部キャッシュの中に完全に常駐するデータセットを持つアプリケーションの場合は、先読み応答時間の値を減らすことでパフォーマンスを向上できる場合があります。値を小さくするには、1 よりも小さな係数を使用します。
latx:factor サブオプションを使用するには、1.0 程度の係数から順にアプリケーションの性能テストを実行します。そのあと、テストの結果に応じて係数を増減し、パフォーマンステストを再実行します。係数の調整を継続し、最適なパフォーマンスに到達するまでパフォーマンステストを実行します。係数を小刻みに増減すると、しばらくはパフォーマンスに変化がなく、突然変化し、再び平常に戻ります。
ここで a は、 [no%]indirect_array_access です。
このオプションは、直接メモリーアクセスに対して先読み命令が生成されるのと同じ方法で、-xprefetch_level オプションが指示するループに対して間接先読み命令を生成するかどうかを制御します。
-xprefetch_auto_type の値が指定されていない場合、-xprefetch_auto_type=no%indirect_array_access に設定されます。
-xalias_level などのオプションは、メモリー別名を明確化する情報の生成に役立つため、間接プリフェッチ候補の計算の積極性に影響し、このため、自動的な間接プリフェッチの挿入が促進されることがあります。
-xprefetch_level オプションを使用して、-xprefetch=auto で定義した先読み命令の自動挿入を調整することができます。l には 1、2、3 のいずれかを指定します。-xprefetch_level が高くなるほど、コンパイラはより攻撃的に、つまりより多くの先読み命令を挿入します。
-xprefetch_level に適した値は、アプリケーションでのキャッシュミス数によって異なります。-xprefetch_level の値を高くするほど、アプリケーションのパフォーマンスが向上する可能性が高くなります。
このオプションは、-xprefetch=auto を指定し、最適化レベルを 3 以上に設定し て、先読みをサポートするプラットフォーム (v8plus、v8plusa、 v9、v9a、v9b、generic64、native64) 用にコードを生成した場合にだけ有効です。
-xprefetch_level=1 を指定すると、先読み命令の自動生成が有効になります。-xprefetch_level=2 を指定すると、レベル 1 を上回る追加の生成が行われ、-xprefetch_level=3 を指定すると、レベル 1 を上回る追加の生成が行われます。
デフォルトは、-xprefetch=auto を指定した場合は -xprefetch_level=1 になります。
プロファイルのデータを収集したり、プロファイルを使用して最適化したりします。
p には、collect[ :profdir]、use[ :profdir]、または tcov[ :profdir] を指定する必要があります。
このオプションを指定すると、実行頻度のデータが収集されて実行中に保存されます。このデータを以降の実行で使用すると、パフォーマンスを向上させることができます。プロファイルの収集は、マルチスレッド対応のアプリケーションにとって安全です。すなわち、独自のマルチタスク (-mt) を実行するプログラムをプロファイリングすることで、正確な結果が得られます。このオプションは、最適化レベルを -xO2 かそれ以上に指定するときにのみ有効になります。コンパイルとリンクを別々の手順で実行する場合は、リンク手順とコンパイル手順の両方で同じ -xprofile オプションを指定する必要があります。
実行頻度のデータを集めて保存します。のちに -xprofile=use を指定した場合にオプティマイザがこれを使用します。コンパイラによって文の実行頻度を測定するためのコードが生成されます。
-xMerge、-ztext、および -xprofile=collect を一緒に使用しないでください。-xMerge を指定すると、静的に初期化されたデータを読み取り専用記憶領域に強制的に配置します。 -ztext を指定すると、位置に依存するシンボルを読み取り専用記憶領域内で再配置することを禁止します。-xprofile=collect を指定すると、書き込み可能記憶領域内で、静的に初期化された、位置に依存するシンボルの再配置を生成します。
プロファイルディレクトリ名として profdir を指定すると、この名前が、プロファイル化されたオブジェクトコードを含むプログラムまたは共有ライブラリの実行時にプロファイルデータが保存されるディレクトリのパス名になります。profdir パス名が絶対パスではない場合、プログラムがオプション -xprofile=use:profdir でコンパイルされるときの現在の作業用ディレクトリの相対パスとみなされます。プロファイルディレクトリ名を指定しないと、プロファイルデータは、program.profile という名前のディレクトリに保存されます (program はプロファイル化されたプロセスのメインプログラムのベース名)。
例 [1]: プログラムが構築されたディレクトリと同じディレクトリにある myprof.profile ディレクトリでプロファイルデータを収集して使用するには、次のように指定します。
demo: cc -xprofile=collect:myprof.profile -xO5 prog.c -o prog demo: ./prog demo: cc -xprofile=use:myprof.profile -xO5 prog.c -o prog |
例 [2]: ディレクトリ/bench/myprof.profile にプロファイルデータを収集し、収集したプロファイルデータをあとから最適化レベル -xO5 のフィードバックコンパイルで使用するには、次のように指定します。
demo: cc -xprofile=collect:/bench/myprof.profile \ -xO5 prog.c -o prog ...run prog from multiple locations.. demo: cc -xprofile=use:/bench/myprof.profile \ -xO5 prog.c -o prog |
環境変数の SUN_PROFDATA と SUN_PROFDATA_DIR を設定して、-xprofile=collect を指定してコンパイルされたプログラムがどこにプロファイルデータを入れるかを制御できます。これらの環境変数を設定すると、-xprofile=collect データが $SUN_PROFDATA_DIR/$SUN_PROFDATA に書き込まれます。
これらの環境変数は、tcov で書き込まれたプロファイルデータファイルのパスと名前を tcov(1) マニュアルページの説明どおり、同様に制御指定します。これらの環境変数をまだ設定していない場合、プロファイルデータは現作業ディレクトリの profdir .profile に書き込まれます (profdir は実行ファイルの名前または -xprofile=collect: profdir フラグで指定された名前)。 profdir が .profile ですでに終了している場合、-xprofile では、profile が profdir に追加されません。プログラムを複数回実行すると、実行頻度データは profdir.profile ディレクトリに蓄積されていくので、以前の実行頻度データは失われません。
別々の手順でコンパイルしてリンクする場合は、-xprofile=collect を指定してコンパイルしたオブジェクトファイルは、リンクでも必ず -xprofile=collect を指定してください。
-xprofile=collect[: profdir] でコンパイルされたコードから収集された実行頻度データを使用して、プロファイル化されたコードが実行されたときに実行された作業用の最適化が行えます。profdir は、-xprofile=collect[: profdir] でコンパイルされたプログラムを実行して収集されたプロファイルデータを含むディレクトリのパス名です。
profdir パス名は省略可能です。 profdir が指定されていない場合、実行可能バイナリの名前が使用されます。-o が指定されていない場合、a.out が使用されます。 profdir が指定されていない場合、コンパイラは、profdir .profile/feedback、または a.out.profile/feedback を探します。次に例を示します。
demo: cc -xprofile=collect -o myexe prog.c demo: cc -xprofile=use:myexe -xO5 -o myexe prog.c |
-xprofile=collect オプションを付けてコンパイルしたときに生成され、プログラムの前の実行で作成されたフィードバックファイルに保存された実行頻度データを使用して、プログラムが最適化されます。
-xprofile オプションを除き、ソースファイルおよびコンパイラのほかのオプションは、フィードバックファイルを生成したコンパイル済みプログラムのコンパイルに使用したものと完全に同一のものを指定する必要があります。同じバージョンのコンパイラは、収集構築と使用構築の両方に使用する必要があります。
-xprofile=collect:profdir を付けてコンパイルした場合は、-xprofile=use: profdir のコンパイルの最適化に同じプロファイルディレクトリ名 profdir を使用する必要があります。
収集 (collect) 段階と使用 (use) 段階の間のコンパイル速度を高める方法については、-xprofile_ircache も参照してください。
tcov(1) を使用する基本のブロックカバレッジ分析用の命令オブジェクトファイル。
オプションの profdir 引数を指定すると、コンパイラは指定された場所にプロファイルディレクトリを作成します。プロファイルディレクトリに保存されたデータは、tcov(1) または -xprofile=use:profdir を付けたコンパイラで使用できます。オプションの profdir パス名を省略すると、プロファイル化されたプログラムの実行時にプロファイルディレクトリが作成されます。プロファイルディレクトリに保存されたデータは、tcov(1) でのみ使用できます。プロファイルディレクトリの場所は、環境変数 SUN_PROFDATA および SUN_PROFDATA_DIR を使用して指定できます。
profdir で指定された場所が絶対パス名ではない場合、コンパイル時に、現在のオブジェクトファイルが作成されたディレクトリの相対パスとみなされます。いずれかのオブジェクトファイルに profdir を指定する場合は、同じプログラムのすべてのオブジェクトファイルに対して同じ場所を指定する必要があります。場所が profdir で指定されているディレクトリには、プロファイル化されたプログラムを実行するときにすべてのマシンからアクセスできる必要があります。プロファイルディレクトリはその内容が必要なくなるまで削除できません。コンパイラでプロファイルディレクトリに保存されたデータは、再コンパイルする以外復元できません。
例 [1]: 1 つ以上のプログラムのオブジェクトファイルが -xprofile=tcov:/test/profdata でコンパイルされる場合、/test/profdata.profile という名前のディレクトリがコンパイラによって作成されて、プロファイル化されたオブジェクトファイルを表すデータの保存に使用されます。実行時に同じディレクトリを使用して、プロファイル化されたオブジェクトファイルに関連付けられた実行データを保存できます。
例 [2]: myprog という名前のプログラムが -xprofile=tcov でコンパイルされ、ディレクトリ /home/joe で実行されると、実行時にディレクトリ /home/joe/myprog.profile が作成されて、実行時プロファイルデータの保存に使用されます。
(SPARC) ンcollect 段階で保存されたコンパイルデータを再利用して use 段階のコンパイル時間を向上するには、-xprofile=collect|use で -xprofile_ircache[=path] を使用します。
大きなプログラムでは、中間データが保存されるため、use 段階のコンパイル時間の効率を大幅に向上させることができます。保存されたデータが必要なディスク容量を相当増やすことがある点に注意してください。
-xprofile_ircache[=path] を使用すると、path はキャッシュファイルが保存されているディレクトリを上書きします。デフォルトでは、これらのファイルはオブジェクトファイルと同じディレクトリに保存されます。collect と use 段階が 2 つの別のディレクトリで実行される場合は、パスを指定しておくと便利です。一般的なコマンドシーケンスを次に示します。
example% cc -xO5 -xprofile=collect -xprofile_ircache t1.c t2.c example% a.out // run collects feedback data example% cc -xO5 -xprofile=use -xprofile_ircache t1.c t2.c |
(SPARC) -xprofile_pathmap= コマンドも指定する場合は、-xprofile_pathmap= collect_prefix: use_prefix オプションを使用します。次の項目がともに真で、コンパイラが -xprofile=use でコンパイルされたオブジェクトファイルのプロファイルデータを見つけられない場合は、-xprofile_pathmap を使用します。
前回オブジェクトファイルが -xprofile=collect でコンパイルされたディレクトリとは異なるディレクトリで、オブジェクトファイルを -xprofile=use を指定してコンパイルしている。
オブジェクトファイルはプロファイルで共通ベース名を共有しているが、異なるディレクトリのそれぞれの位置で相互に識別されている。
collect-prefix は、オブジェクトファイルが -xprofile=collect でコンパイルされたディレクトリツリーの UNIX パス名の接頭辞です。
use-prefix は、オブジェクトファイルが -xprofile=use を指定してコンパイルされたディレクトリツリーの UNIX パス名の接頭辞です。
-xprofile_pathmap の複数のインスタンスを指定すると、コンパイラは指定した順序でインスタンスを処理します。-xprofile_pathmap のインスタンスで指定された各 use-prefix は、一致する use-prefix が識別されるか、最後に指定された use-prefix がオブジェクトファイルのパス名と一致しないことが確認されるまで、オブジェクトファイルのパス名と比較されます。
自動的な並列化を実行するときに、縮約の認識を有効にします。-xreduction は、-xautopar とともに指定する必要があります。それ以外の場合は、コンパイラが警告を発行します。
縮約の認識が有効な場合、コンパイラは内積、最大値発見、最小値発見などの縮約を並列化します。これらの縮約によって非並列化コードの場合とは、四捨五入の結果が異なります。
r には、次の 1 つまたは複数の項目をコンマで区切って指定します。appl, float,frameptr
サブオプションの前に no% を付けるとそのサブオプションは無効になります。
—xregs サブオプションは、特定のハードウェアプラットフォームでしか使用できません。
例: -xregs=appl,no%float
表 B–38 -xregs サブオプション
値 |
意味 |
---|---|
appl |
(SPARC) コンパイラがアプリケーションレジスタをスクラッチレジスタとして使用してコードを生成することを許可します。アプリケーションレジスタは次のとおりです。 g2、g3、g4 ( 32 ビットプラットフォーム) g2、g3 (64 ビットプラットフォーム) すべてのシステムソフトウェアおよびライブラリは、-xregs=no%appl を指定してコンパイルすることをお勧めします。システムソフトウェア (共有ライブラリを含む) は、アプリケーション用のレジスタの値を保持する必要があります。これらの値は、コンパイルシステムによって制御されるもので、アプリケーション全体で整合性が確保されている必要があります。 SPARC ABI では、これらのレジスタはアプリケーションレジスタと記述されています。これらのレジスタを使用すると必要なロードおよびストア命令が少なくてすむため、パフォーマンスが向上します。ただし、アセンブリコードで記述された古いライブラリプログラムとの間で衝突が起きることがあります。 |
float |
(SPARC) コンパイラが浮動小数点レジスタを整数値用のスクラッチレジスタとして使用してコードを生成することを許可します。浮動小数点値を使用する場合は、このオプションとは関係なくこれらのレジスタを使用します。浮動小数点レジスタに対するすべての参照をコードから排除する場合は、-xregs=no%float を使用するとともに、決して浮動小数点型をコードで使わないようにする必要があります。 |
frameptr |
(x86) フレームポインタレジスタ (IA32 の場合 %ebp、AMD64 の場合 %rbp) を汎用レジスタとして使用することを許可します。 デフォルトは -xregs=no%frameptr です。 —features=no%except によって例外も無効になっているのでなければ、C++ コンパイラは —xregs=frameptr を無視します。—xregs=frameptr は —fast の一部ですが、—features=no%except も指定されているのでなければ C++ コンパイラによって無視される点に注意してください。 -xregs=framptr を使用すると、コンパイラは浮動小数点レジスタを自由に使用できるので、プログラムのパフォーマンスが向上します。ただし、この結果としてデバッガおよびパフォーマンス測定ツールの一部の機能が制限される場合があります。スタックトレース、デバッガ、およびパフォーマンスアナライザは、—xregs=frameptr を使用してコンパイルされた機能についてレポートできません。 さらに、Posix pthread_cancel() の C++ 呼び出しは、クリーンアップハンドラの検索に失敗します。 C、Fortran、C++ が混在しているコードで、C または Fortran 関数から直接または間接的に呼び出された C++ 関数が例外をスローする可能性がある場合、このコードは —xregs=frameptr でコンパイルできません。このような言語が混在するソースコードを —fast でコンパイルする場合は、コマンド行の —fast オプションのあとに —xregs=no%frameptr を追加します。 64 ビットのプラットフォームで使用できる多くのレジスタでは、—xregs=frameptr でコンパイルすると、64 ビットコードよりも 32 ビットコードのパフォーマンスが向上する可能性が高くなります。 -xpg も指定されている場合、コンパイラは -xregs=frameptr を無視し、警告を表示します。 |
SPARC のデフォルトは -xregs=appl,float です。
x86 のデフォルトは -xregs=no%frameptr です。
x86 システムでは、-xpg には -xregs=frameptr との互換性がないため、これらの 2 つのオプションは同時に使用できません。 -xregs=frameptr は -fast に含まれている点にも注意してください。
アプリケーションにリンクする共有ライブラリ用のコードは、-xregs=no%appl,float を指定してコンパイルすることをお勧めします。少なくとも、共有ライブラリとリンクするアプリケーションがこれらのレジスタの割り当てを認識するように、共有ライブラリがアプリケーションレジスタを使用する方法を明示的に示す必要があります。
たとえば、大局的な方法で (重要なデータ構造体を示すためにレジスタを使用するなど) レジスタを使用するアプリケーションは、ライブラリと確実にリンクするため、-xregs=no%appl なしでコンパイルされたコードを含むライブラリがアプリケーションレジスタをどのように使用するかを正確に特定する必要があります。
ポインタ値の関数引数を制限付き (restricted) ポインタとして扱います。f には、%all、%none、あるいは 1 つまたは複数の関数名をコンマで区切ったリストを指定します。例: {%all| %none|fn[,fn...]
関数リストの指定にこのオプションを入れると、指定された関数内のポインタ引数は制限付きとして扱われます。-xrestrict=%all を指定すると、C ファイル全体のすべてのポインタ引数が制限付きとして扱われます。詳細については、「3.8.2 制限付きポインタ」を参照してください。
このコマンド行オプションは独立して使用できますが、最適化時に使用するのがもっとも適しています。たとえば、次のようなコマンドを使用します。
%cc -xO3 -xrestrict=%all prog.c |
このコマンドでは、ファイル prog.c 内のすべてのポインタ引数を制限付きポインタとして扱います。次のようなコマンド行があるとします。
%cc -xO3 -xrestrict=agc prog.c |
このコマンドでは、ファイル prog.c 内の関数 agc のすべてのポインタ引数を制限付きポインタとして扱います。
デフォルトは %none で、-xrestrict と指定すると -xrestrict=%all と指定した場合と同様の結果が得られます。
オブジェクトファイルなしに dbx でデバッグできるようにします。
このオプションを指定すると、すべてのデバッグ情報が実行可能ファイルにコピーされます。dbx のパフォーマンスやプログラムの実行時のパフォーマンスにはあまり影響はありませんが、より多くのディスク容量が必要となります。
(SPARC) コンパイラが記憶域保護違反が発生した場合を前提とできるようにします。
このオプションを使用すると、コンパイラでは SPARC V9 アークテクチャーで違反のないロード命令を使用できます。
アドレスの位置合わせが合わない、またはセグメンテーション侵害などの違反が発生した場合は違反のないロードはトラップを引き起こさないので、このオプションはこのような違反が起こる可能性のないプログラムでしか使用しないでください。ほとんどのプログラムではメモリーに関するトラップは起こらないので、大多数のプログラムでこのオプションを安全に使用できます。例外条件の処理にメモリーベースのトラップを明示的に使用するプログラムでは、このオプションは使用しないでください。
このオプションは、最適化レベルの -xO5 と、次のいずれかの値の -xarch を組み合わせた場合にだけ有効です。m32 と m64 の両方で sparc、sparcvis、-sparcvis2、または -sparcvis3。
廃止。使わないでください。ソースブラウザ機能はもうサポートされていません。
廃止。使わないでください。ソースブラウザ機能はもうサポートされていません。
接尾辞のない浮動小数点定数を、デフォルトの倍精度モードではなく、単精度で表します。-Xc と併用することはできません。
例: コードサイズが増える場合は、ループの展開や並列化は行われません。
このオプションは非推奨であり、将来のリリースで削除される可能性があります。 —xstrconst は —features=conststrings の別名です。
t には次の値のいずれかを指定します。native、generic、native64、 generic64、system-name。
-xtarget に指定する値は、-xarch、-xchip、-xcache の各オプションの値に展開されます。実行中のシステムで -xtarget=native の展開を調べるには、-xdryrun コマンドを使用します。
たとえば、-xtarget=sun4/15 は次と同じです。-xarch=v8a -xchip=micro -xcache=2/16/1。
特定のホストプラットフォームで -xtarget を展開した場合、そのプラットフォームでコンパイルすると -xtarget=native と同じ -xarch、-xchip、または -xcache 設定にならない場合があります。
フラグ |
意味 |
---|---|
native |
ホストシステムで最高のパフォーマンスが得られます。 コンパイラは、ホストシステムに対して最適化されたコードを生成します。コンパイラは自身が動作しているマシンで利用できるアーキテクチャー、チップ、キャッシュ特性を判定します。 |
native64 |
ホストシステムで 64 ビットのオブジェクトバイナリの最高のパフォーマンスが得られます。コンパイラは、ホストシステム用に最適化された 64 ビットのオブジェクトバイナリを生成します。コンパイラが動作しているマシンで使用できる 64 ビットのアーキテクチャー、チップ、キャッシュ特性を判定します。 |
generic |
これはデフォルト値です。汎用アーキテクチャー、チップ、およびキャッシュで最高のパフォーマンスが得られます。 |
generic64 |
大多数の 64 ビットのプラットフォームのアーキテクチャーで 64 ビットのオブジェクトバイナリの最適なパフォーマンスを得るためのパラメータを設定します。 |
システム名 |
指定のシステムに対して最高のパフォーマンスが得られるようにします。 対象となる実際のシステムを表すシステム名を、次のリストから選択してください。 |
対象となるハードウェア (コンピュータ) の正式な名前をコンパイラに指定した方がパフォーマンスが優れているプログラムもあります。プログラムのパフォーマンスが重要な場合は、対象となるハードウェアを正確に指定してください。これは特に、新しい SPARC プロセッサ上でプログラムを実行する場合に当てはまります。しかし、ほとんどのプログラムおよび廃止の SPARC システムではパフォーマンスの向上はわずかであるため、汎用的な指定方法で十分です。
SPARC または UltraSPARC V9 での 64 ビット Solaris ソフトウェアのコンパイルは、-m64 オプションで指定します。-xtarget を指定し、native64 または generic64 以外のフラグを付ける場合は、-m64 オプションも次のように指定する必要があります。-xtarget=ultra ... -m64。この指定を行わない場合は、コンパイラは 32 ビットメモリーモデルを使用します。
表 B–40 SPARC での -xtarget の展開
-xtarget= |
-xarch |
-xchip |
-xcache |
---|---|---|---|
generic |
generic |
generic |
generic |
ultra |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra1/140 |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra1/170 |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra1/200 |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra2 |
v8plusa |
ultra2 |
16/32/1:512/64/1 |
ultra2/1170 |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra2/1200 |
v8plusa |
ultra |
16/32/1:1024/64/1 |
ultra2/1300 |
v8plusa |
ultra2 |
16/32/1:2048/64/1 |
ultra2/2170 |
v8plusa |
ultra |
16/32/1:512/64/1 |
ultra2/2200 |
v8plusa |
ultra |
16/32/1:1024/64/1 |
ultra2/2300 |
v8plusa |
ultra2 |
16/32/1:2048/64/1 |
ultra2e |
v8plusa |
ultra2e |
16/32/1:256/64/4 |
ultra2i |
v8plusa |
ultra2i |
16/32/1:512/64/1 |
ultra3 |
sparcvis2 |
ultra3 |
64/32/4:8192/512/1 |
ultra3cu |
sparcvis2 |
ultra3cu |
64/32/4:8192/512/2 |
ultra3i |
sparcvis2 |
ultra3i |
64/32/4:1024/64/4 |
ultra4 |
sparcvis2 |
ultra4 |
64/32/4:8192/128/2 |
ultra4plus |
sparcvis2 |
ultra4plus |
64/32/4:2048/64/4/2:32768/64/4 |
ultraT1 |
sparc |
ultraT1 |
8/16/4/4:3072/64/12/32 |
ultraT2 |
sparcvis2 |
ultraT2 |
8/16/4:4096/64/16 |
ultraT2plus |
sparcvis2 |
ultraT2plus |
8/16/4:4096/64/16 |
ultraT3 |
sparcvis3 |
ultraT3 |
8/16/4:6144/64/24 |
sparc64vi |
sparcfmaf |
sparc64vi |
128/64/2:5120/64/10 |
sparc64vii |
sparcima |
sparc64vii |
64/64/2:5120/256/10 |
UltraSPARC IVplus チップ、UltraSPARC T1 チップ、UltraSPARC T2 チップのキャッシュ特性についての詳細は、「B.2.80 -xcache[= c]」 を参照してください。 |
64 ビット x86 プラットフォームでの 64 ビット Solaris ソフトウェアのコンパイルは、-m64 オプションで指定します。-xtarget を指定し、native64 または generic64 以外のフラグを付ける場合は、-m64 オプションも次のように指定する必要があります。-xtarget=opteron ... -m64。この指定を行わない場合は、コンパイラは 32 ビットメモリーモデルを使用します。
表 B–41 x86 での -xtarget の展開
-xtarget= |
-xarch |
-xchip |
-xcache |
---|---|---|---|
generic |
generic |
generic |
generic |
opteron |
sse2a |
opteron |
64/64/2:1024/64/16 |
386 |
pentium |
generic |
|
pentium_pro |
pentium_pro |
pentium_pro |
generic |
pentium3 |
sse |
pentium3 |
16/32/4:256/32/4 |
pentium4 |
sse2 |
pentium4 |
8/64/4:256/128/8 |
nehalem |
sse4_2 |
nehalem |
32/64/8:256/64/8:8192/64/16 |
penryn |
sse4_1 |
penryn |
2/64/8:6144/64/24 |
woodcrest |
ssse3 |
core2 |
32/64/8:4096/64/16 |
barcelona |
amdsse4a |
amdfam10 |
64/64/2:512/64/16 |
cc が使用する一時ファイルのディレクトリを dir に設定します。このオプション文字列の中にはスペースを入れてはいけません。このオプションを指定しない場合、一時ファイルは /tmp に配置されます。-xtemp は TMPDIR 環境変数より優先します。
スレッドローカルな変数の実装を制御するには -xthreadvar を指定します。コンパイラのスレッドローカルな記憶領域機能を利用するには、このオプションを __thread 宣言指示子と組み合わせて使用します。__thread 指示子を使用してスレッド変数を宣言したあとは、-xthreadvar を指定して動的 (共有) ライブラリの位置に依存しないコード (PIC 以外のコード) でスレッド固有の記憶領域を使用できるようにします。__thread の使用方法の詳細については、「2.3 スレッドローカルな記憶領域指示子」を参照してください。
o には、次のいずれかを指定します。
表 B–42 -xthreadvar のフラグ
フラグ |
意味 |
---|---|
[no%]dynamic |
動的ロード用の変数をコンパイルします [しません]。-xthreadvar=no%dynamic を指定すると、スレッド変数へのアクセスは非常に早くなりますが、動的ライブラリ内のオブジェクトファイルは使用できません。すなわち、実行可能ファイル内のオブジェクトファイルだけが使用可能です。 |
-xthreadvar を指定しない場合、コンパイラが使用するデフォルトは位置独立コード (PIC) が有効になっているかどうかによって決まります。位置独立コードが有効になっている場合、オプションは -xthreadvar=dynamic に設定されます。位置独立コードが無効になっている場合、オプションは -xthreadvar=no%dynamic に設定されます。
値を指定しないで -xthreadvar を指定すると、オプションは -xthreadvar=dynamic に設定されます。
動的ライブラリ内に位置に依存するコードがある場合、-xthreadvar を指定する必要があります。
リンカーは、動的ライブラリ内の位置依存コード (非 PIC) スレッド変数と同等のスレッド変数はサポートできません。非 PIC スレッド変数は非常に高速なため、実行可能ファイルのデフォルトとして指定できます。
異なるバージョンの Solaris ソフトウェアでスレッド変数を使用するには、コマンド行で異なるオプションを指定する必要があります。
Solaris 8 ソフトウェアでは、__thread を使用するオブジェクトは -mt を指定してコンパイルし、-mt -L/usr/lib/lwp -R/usr/lib/lwp を指定してリンクする必要があります。
Solaris 9 ソフトウェアでは、__thread を使用するオブジェクトはコンパイルとリンクに -mt を指定する必要があります。
関連項目: -xcode、-KPIC、-Kpic
コンパイルの各構成要素が占有した実行時間と資源を報告します。
K&R C と Solaris Studio ISO C との間の相違に対して警告を出します。
-xtransition オプションを、-Xa または -Xt オプションとともに使用すると警告を出します。異なる動作に関するすべての警告メッセージは適切なコーディングを行うことによって取り除くことができます。次の警告は、-xtransition オプション を使用していなければ表示されません。
\a は ISO C の「警告」文字です
\x は ISO C の 16 進エスケープです
無効な 8 進数
型の種類は実際には type tag です: name
コメントが "##" で置き換えられます
コメントがトークンを連結していません
ISO C では新しい型で置き換えてしまう型の宣言です: type tag
文字定数中のマクロ置換
文字列リテラル中のマクロ置換
文字定数中のマクロ置換は行われません
文字列リテラル中のマクロ置換は行われません
オペランドが符号なしとして処理されました
3 文字表記シーケンスが置き換えられました
ISO C は定数を unsigned 型として扱います: operator
semantics of operator change in ISO C; use explicit cast
-xtrigraphs オプションは、コンパイラが ISO 規格で定義されている三文字表記シーケンスを認識するかどうかを決定します。
デフォルトにより、コンパイラは -xtrigraphs=yes を仮定し、コンパイル単位をとおしてすべての三文字表記シーケンスを認識します。
コンパイラが文字表記シーケンスとして解釈している疑問符 (?) の入ったリテラル文字列がソースコードにある場合は、-xtrigraph=no サブオプションを使用して文字表記シーケンスの認識をオフにすることができます。-xtrigraphs=no オプションは、コンパイル単位全体をとおしてすべての三文字表記シーケンスの認識をオフにします。
次の例は、ソースファイル trigraphs_demo.c を示しています。
#include <stdio.h> int main () { (void) printf("(\?\?) in a string appears as (??)\n"); return 0; } |
このコードに -xtrigraphs=yes を指定してコンパイルした場合の出力は、次のとおりです。
example% cc -xtrigraphs=yes trigraphs_demo.c example% a.out (??) in a string appears as (] |
このコードに -xtrigraphs=no を指定してコンパイルした場合の出力は、次のとおりです。
example% cc -xtrigraphs=no trigraphs_demo.c example% a.out (??) in a string appears as (??) |
ループを n 回展開するようオプティマイザに指示します。n は正の整数です。n が 1 のときはコマンドとなり、コンパイラはループを展開しません。n が 2 以上のとき、-xunroll=n は n 回ループを展開することをコンパイラに知らせます。
ISO10646 UTF-16 文字列リテラルを使用する国際化アプリケーションをサポートする必要がある場合は、このオプション使用します。言い替えれば、このオプションは、オブジェクトファイル内で UTF-16 文字列に変換したい文字列リテラルがコードに含まれる場合に使用します。このオプションが指定されていない場合、コンパイラは 16 ビット文字列リテラルの生成、認識のいずれも行いません。このオプションは、U"ASCII_string" という書式の文字列リテラルを unsigned short int 型の配列として認識できるようにします。このような文字列は標準として規定されていないので、このオプションは標準に準拠しない C++ の認識を可能にします。
U"ASCII_string" 文字列リテラルのコンパイラによる認識を無効にすることができます。-xustr=noこのオプションのコマンド行の右端にあるインスタンスは、それまでのインスタンスをすべて上書きします。
デフォルトは -xustr=no です。引数を指定しないで -xustr を指定した場合、コンパイラはこの指定を受け付けず、警告を出力します。C または C++ 規格で構文の意味が定義されると、デフォルト値が変わることがあります。
-xustr=ascii_utf16_ushort を指定して U"ASCII_string" 文字列リテラルを指定しなくても、エラーにはなりません。
すべてのファイルを、このオプションによってコンパイルしなければならないわけではありません。
次の例では、U を付加した二重引用符で文字列リテラルを示します。また、-xustr を指定するコマンド行も示します。
example% cat file.c const unsigned short *foo = U"foo"; const unsigned short bar[] = U"bar"; const unsigned short *fun() { return foo;} example% cc -xustr=ascii_utf16_ushort file.c -c |
8 ビットの文字列リテラルに U を付加して、unsigned short 型を持つ 16 ビットの UTF-16 文字を形成できます。次に例を示します。
const unsigned short x = U'x'; const unsigned short y = U'\x79'; |
ベクタライブラリ関数の呼び出しの自動生成や、SIMD (Single Instruction Multiple Data) 命令の生成ができます。このオプションを使用するときは -fround=nearest を指定することによって、デフォルトの丸めモードを使用する必要があります。
a は、次の指定と同じです。
表 B–43 -xvector のフラグ
値 |
意味 |
---|---|
[no%]lib |
コンパイラは可能な場合はループ内の数学ライブラリへの呼び出しを、同等のベクトル数学ルーチンへの単一の呼び出しに変換します [しません]。大きなループカウントを持つループでは、これによりパフォーマンスが向上します。(Solaris のみ) |
[no%]simd |
コンパイラはネイティブ x86 SSE SIMD 命令を使用して特定のループのパフォーマンスを向上させます [させません]。ストリーミング拡張機能は、x86 で最適化レベルが 3 かそれ以上に設定されている場合にデフォルトで使用されます。サブオプション no%simd を使用すると、この機能を無効にできます。 コンパイラは、ストリーミング拡張機能がターゲットのアーキテクチャーに存在する場合、つまりターゲットの ISA が SSE2 以上である場合にのみ SIMD を使用します。たとえば、最新のプラットフォームで -xtarget=woodcrest、—xarch=generic64、-xarch=sse2、-xarch=sse3、または -fast を指定して使用できます。ターゲットの ISA にストリーミング拡張機能がない場合、このサブオプションは無効です。 |
yes |
これは非推奨であり、代わりに -xvector=lib を指定します。 |
no |
これは非推奨であり、代わりに -xvector=none を指定します。 |
デフォルトは、x86 では -xvector=simd で、SPARC プラットフォームでは -xvector=%none です。サブオプションなしで -xvector を指定すると、コンパイラでは、x86 では -xvector=simd,lib、SPARC (Solaris) では -xvector=lib、および -xvector=simd (Linux) が使用されます。
—xvector オプションを指定するには、最適化レベルが —xO3 かそれ以上に設定されていることが必要です。最適化レベルが指定されていない場合や —xO3 よりも低い場合はコンパイルは続行されず、メッセージが表示されます。
(SPARC) VIS instruction-set Software Developers Kit (VSDK) に定義されているアセンブリ言語のテンプレートを使用する場合は、-xvis=[yes|no] コマンドを使用します。デフォルトは -xvis=no です。-xvis と指定すると -xvis=yes と指定した場合と同様の結果が得られます。
VIS 命令セットは、SPARC v9 命令セットの拡張です。UltraSPARC プロセッサは 64 ビットでも、多くの場合、特にマルチメディアアプリケーションではデータサイズが 8 ビットまたは 16 ビットに制限されています。VIS 命令では、1 命令で 4 つの 16 ビットデータを処理できるので、画像、線形代数、信号処理、オーディオ、ビデオ、ネットワーキングなどの新しいメディアを扱うアプリケーションのパフォーマンスが大幅に向上します。
VSDK の詳細については、http://www.sun.com/processors/vis/ を参照してください。
OpenMP を使用する場合に正しくない結果をもたらす可能性のある、並列プログラミングに関連する潜在的な問題に関して、警告を発行します。-xopenmp および OpenMP API 指令とともに使用します。
次の状況が検出された場合は、コンパイラは警告を発行します。
異なるループ繰り返し間でデータに依存関係がある場合に、MP 指令を使用して並列化されたループ。
OpenMP データ共有属性節に問題がある場合。たとえば、「shared」と宣言された変数に、OpenMP 並列領域からアクセスするとデータ競合が発生する可能性がある場合や、並列領域の中に値を持つ変数を「private」と宣言し、並列領域よりあとでその変数を使用する場合です。
すべての並列化命令が問題なく処理される場合、警告は表示されません。
次に例を示します。
cc -xopenmp -vpara any.c |
Solaris Studio のコンパイラは OpenMP 2.5 API の並列化をサポートします。そのため、MP プラグマ命令は非推奨で、サポートされません。OpenMP API への移植については、『OpenMP API ユーザーズガイド』を参照してください。
c を検索するための新しい dir を指定します。c は -W オプションで示したコンパイラ構成要素を表わす文字です。
構成要素の検索が指定されている場合、ツールのパス名は dir/tool になります。2 つ以上の -Y オプションが 1 つの項目に適用されている場合には、最後に現れたものが有効です。
コンパイラのすべての構成要素の検索場所にするディレクトリ dir を指定します。dir 内で構成要素が見つからない場合は、コンパイラがインストールされているディレクトリに戻って検索されます。
インクルードファイルを検索するデフォルトのディレクトリを変更します。
ライブラリファイルを検索するデフォルトのディレクトリを変更します。
起動用のオブジェクトファイルを検索するデフォルトのディレクトリを変更します。
(SPARC) lock_lint 用にプログラムデータベースを作成しますが、実行可能なコードは生成しません。詳細は、lock_lint(1) のマニュアルページを参照してください。
cc は -a、-e、-r、-t、-u、-z を認識し、これらのオプションとその引数を ld に渡します。cc は認識できないオプションを警告付きで ld に渡します。Solaris プラットフォームでは、-i オプションとその引数もリンカーに渡されます。