Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

C コンパイラオプションリファレンス

この章では、C コンパイラオプションについてアルファベット順に説明します。機能別のオプションは、Appendix A, 機能別コンパイラオプションを参照してください。たとえば、Table A–1 には、最適化とパフォーマンスのすべてのオプションがまとめられています。

C コンパイラは、デフォルトでは 2011 ISO/IEC C 規格の構文の一部を認識します。サポートされる機能については、Appendix C, C11 の機能で詳しく説明します。コンパイラを以前のバージョンの ISO/IEC C 規格に制限する場合は、-std コマンドを使用します。

B.1 オプションの構文

cc コマンドの構文を次に示します。

% cc [options] filenames [libraries]...

ここでは:

  • options は、Table A–14 で説明している各種のオプションで、複数指定可能です。

  • 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 オプションを検査することで、確認できます。

ccgetopt を使用してコマンド行オプションの構文を解析します。オプションは単一文字、または後ろに引数を 1 つとる単一文字によって指定します。getopt(3c) のマニュアルページを参照してください。

B.2 cc のオプション

このセクションでは、cc オプションについてアルファベット順に説明します。これらの説明は cc(1) のマニュアルページでも見ることができます。1 行に要約した説明が必要な場合は、cc -flags オプションを使用してください。

特定のプラットフォームに固有と表記されたオプションを別のプラットフォームで使用してもエラーは起きません。単に無視されます。

B.2.1 -#

冗長モードを有効にし、コマンドオプションがどのように展開されるかを示します。要素が呼び出されるごとにその要素を表示します。

B.2.2 -###

呼び出された各コンポーネントが表示されますが、実行はされません。また、コマンドオプションの展開内容を表示します。

B.2.3 –Aname[(tokens)]

#assert 前処理指令に似せて、指定の tokens を使用し name を述語として関連付けます。事前表明 (preassertion) は次のとおりです。

  • system(unix)

  • machine(sparc) (SPARC)

  • machine(i386) (x86)

  • cpu(sparc) (SPARC)

  • cpu(i386) (x86)

これらの事前表明は -pedantic モードでは無効です。

-A のあとにハイフン (-) だけが続く場合は、事前定義のマクロ (__ から始まるもの以外) および事前定義の表明はすべて無視されます。

B.2.4 -ansi

-std=c89 と同等です。

B.2.5 -B[static| dynamic]

リンク時に結合するライブラリをstatic (静的) (指定するとライブラリが非共有ライブラリであることを示す) と dynamic (動的) (指定すると共有ライブラリであることを示す) のどちらにするかを指定します。

–Bdynamic を指定すると、-lx オプションが指定されていれば、リンカーは libx.so というファイルを探し、次に libx.a というファイルを探します。

-Bstatic を指定すると、リンカーは libx.a というファイルだけを探します。このオプションは、コマンド行中で何度も指定して、切り替えることができます。このオプションと引数は ld(1) に渡されます。


注 -  Oracle Solaris 64 ビットコンパイル環境では、多くのシステムライブラリ (libc など) は、動的ライブラリとしてのみ使用できます。このため、コマンド行の最後に -Bstatic を使用しないでください。

このオプションと引数はリンカーに渡されます。

B.2.6 -C

C プリプロセッサが、前処理指令の行にあるコメント以外のコメントを削除しないようにします。

B.2.7 -c

C コンパイラ ld(1) によるリンクを行わず、ソースファイルごとに .o ファイルを作成します。-o オプションを使用すると、1 つのオブジェクトファイルを明示的に指定することができます。コンパイラが .i または .c の各入力ファイルに対応するオブジェクトコードを生成する場合は、現在の作業ディレクトリにオブジェクト (.o) ファイルを作成します。リンクを行わないと、オブジェクトファイルの削除も行われません。

B.2.8 -Dname[(arg[,arg])][=expansion]

#define 前処理マクロが指令によって定義されるのと同様に、オプションの引数を使用してマクロを定義します。=expansion が指定されていない場合は、コンパイラは 1 であると仮定します。

コンパイラの定義済みマクロのリストについては、cc(1) のマニュアルページを参照してください。

B.2.9 -d[y| n]

-dy はリンクエディタに動的なリンクを指定します (デフォルト)。

-dn はリンクエディタに静的なリンクを指定します。

このオプションとその引数は ld(1) に渡されます。


注 -  このオプションを動的ライブラリと組み合わせて使用すると、重大なエラーが発生します。ほとんどのシステムライブラリは、動的ライブラリでのみ使用できます。

B.2.10 -dalign

(SPARC) 廃止。このオプションは使わないでください。代わりに -xmemalign=8s を使用してください。詳細は、-xmemalign=abを参照してください。廃止オプションに、廃止のオプションの全一覧をまとめています。x86 プラットフォームでは、このオプションはメッセージを表示せずに無視されます。

B.2.11 -E

プリプロセッサのみでソースファイルを処理し、出力を stdout に送ります。プリプロセッサはコンパイラ内部に直接組み込まれます。/usr/ccs/lib/cpp が直接呼び出される -Xs モードの場合は除きます。プリプロセッサの行番号付け情報も含みます。-P オプションの説明も参照してください。

B.2.12 -errfmt[=[no%]error]

このオプションは、エラーメッセージの最初に “error:” という接頭辞を追加して、警告メッセージと区別しやすくする場合に使用します。接頭辞は、-errwarn によってエラーに変換された警告にも追加されます。

表 B-1  -errfmt のフラグ
フラグ
意味
error
すべてのエラーメッセージに接頭辞「error: 」を追加します。
no%error
エラーメッセージに接頭辞「error: 」を追加しません。

このオプションを指定しない場合は、-errfmt=no%errorに設定されます。–errfmt を指定したけれども値を指定しない場合、コンパイラはそれを -errfmt=error に指定します。

B.2.13 -errhdr[=h]

ヘッダーファイルからの警告を、次の表のフラグによって示されるヘッダーファイルのグループに限定します。

表 B-2  —errhdr オプション
意味
%all
使用しているすべてのヘッダーファイルを検査します。
%none
ヘッダーファイルを検査しません。
%user
使用されているすべてのユーザー定義のヘッダーファイルを検査、つまり /usr/include およびそのサブディレクトリに入っているヘッダーファイルとコンパイラが提供しているヘッダーファイルを除く、すべてのヘッダーファイルを検査します。これはデフォルト値です。

B.2.14 -erroff[=t]

このコマンドは、C コンパイラの警告メッセージを無効にし、エラーメッセージには影響しません。このオプションは、-errwarn によってゼロ以外の終了ステータスを発生させるように指定されているかどうかにかかわらず、すべての警告メッセージに適用されます。

t には、次の 1 つまたは複数の項目をコンマで区切って指定します。tagno%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 オプションを指定したときにタグを表示する警告メッセージだけです。無効にするエラーメッセージをさらに詳細に設定することができます。error_messagesを参照してください。

B.2.15 -errshort[=i]

このオプションは、コンパイラで型の不一致が検出されたときに生成されるエラーメッセージの詳細さを設定する場合に使用します。大きな集合体が関係する型の不一致がコンパイラで検出される場合にこのオプションを使用すると特に便利です。

i は、次の表に示す値のいずれかです。

表 B-4  -errshort のフラグ
フラグ
意味
short
エラーメッセージは、型の展開なしの簡易形式で出力されます。集合体のメンバー、関数の引数、戻り値の型は展開されません。
full
エラーメッセージは、完全な冗長形式で出力されます。不一致の型が完全に展開されます。
tags
エラーメッセージは、タグ名がある型の場合はそのタグ名付きで出力されます。タグ名がない場合は、型は展開された形式で出力されます。

-errshort を指定しない場合は、コンパイラでは -errshort=full が指定されます。-errshort を指定したけれども値を指定しない場合、コンパイラはこのオプションを -errshort=tags に設定します。

このオプションは累積されません。コマンド行で指定された最後の値を受け入れます。

B.2.16 -errtags[=a]

C コンパイラのフロントエンドで出力される警告メッセージのうち、-erroff オプションで無効にできるか、または -errwarn オプションで致命的なエラーにできるメッセージのメッセージタグを表示します。C コンパイラのドライバおよび C のコンパイルシステムのほかのコンポーネントから出力されるメッセージにはエラータグが含まれないため、-erroff で無効にしたり、-errwarn で致命的なエラーに変換したりすることはできません。

a には yes または no のいずれかを指定します。デフォルトは -errtags=no です。-errtags だけを指定すると、-errtags=yes を指定するのと同じことになります。

B.2.17 -errwarn[=t]

指定した警告メッセージが生成された場合に、失敗ステータスで C コンパイラを終了する場合は、-errwarn オプションを使用します。

t には、次の 1 つまたは複数の項目をコンマで区切って指定します。tagno%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 と同義です。

B.2.18 -fast

このオプションは、 実行可能ファイルをチューニングして実行時パフォーマンスを最大化するための出発点として効果的に使用できるマクロです。-fast オプションマクロは、コンパイラのあるリリースから次の変更される可能性があり、ターゲットプラットフォーム固有のオプションに展開されます。-# オプションまたは -xdryrun を使用して -fast の展開を調べ、-fast の該当するオプションを使用して実行可能ファイルのチューニングを行なってください。

-fast の展開には、コンパイラが最適化された数学ルーチンのライブラリを使用できるようにする -xlibmopt オプションが含まれます。詳細は、-xlibmoptを参照してください。

-fast オプションは、errno の値に影響します。詳細は、errno の値の保持を参照してください。

-fast を指定してコンパイルしたモジュールは、-fast を指定してリンクする必要があります。コンパイル時とリンク時のオプションに、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

-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
-fma=fused
X
X
-fns
X
X
-fsimple=2
X
X
-fsingle
X
X
-nofstore
-
X
-xalias_level=basic
X
X
-xbuiltin=%all
X
X
-xlibmil
X
X
-xlibmopt
X
X
-xmemalign=8s
X
-
-xO5
X
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 |& grep ###

B.2.19 -fd

K&R 形式の関数の宣言や定義を報告します。

B.2.20 -features=[v]

次の表に、v で使用できる値の一覧を示します。

表 B-7  -features のフラグ
意味
[no%]conststrings
読み取り専用メモリー内で文字列リテラルの配置を有効にします。デフォルトは –features=conststrings であり、文字列リテラルを読み取り専用データセクションに配置します。文字列リテラルのメモリー位置に書き込もうとするプログラムをコンパイルするときに、このオプション付きでコンパイルすると、セグメント例外が発生するようになりました。no% 接頭辞はこのサブオプションを無効にします。
[no%]extensions
サイズがゼロの struct または union の宣言、および有効な値を返す return 文を持つ void 関数を許可または禁止します。
extinl
extern インライン関数を大域関数として生成します。これがデフォルトで、1999 C 規格に準拠しています。
no%extinl
extern インライン関数を静的関数として生成します。-features=no%extinl 付きで新しいコードをコンパイルすると、extern インライン関数は、C および C++ コンパイラの古いバージョンで提供されていたのと同じ扱いを受けます。
[no%]typeof
typeof 演算子の認識を有効または無効にします。typeof 演算子はその引数 (式または型のどちらか) の型を返します。構文上は sizeof 演算子と同様に指定されますが、意味上は typedef で定義される型と同様に動作します。
したがって、typedef が使用できる箇所であればどこでも使用できます。たとえば、宣言、キャスト、または sizeoftypeof の内側で使用できます。デフォルトは -features=typeof です。
no% 接頭辞はこの機能を無効にします。
%none
-features=%none オプションは非推奨であるため、-features=no% (この後にサブオプションを指定) に置き換えてください。

古い C および C++ オブジェクト (このリリースより前の Solaris Studio コンパイラで作成されたオブジェクト) は、そのオブジェクトの動作変更なしに、新しい C および C++ オブジェクトとリンクできます。規格に適合した動作を実現するには、最新のコンパイラを使って古いコードをコンパイルする必要があります。

B.2.20.1 —features=typeof の例

          typeof(int) i;/* declares variable "i" to be type int*/
          typeof(i+10) j;/* declares variable "j" to be type int,
                            the type of the expression */

          i = sizeof(typeof(j)); /* sizeof returns the size of
                          the type associated with variable "j" */

          int a[10];
          typeof(a) b;/* declares variable "b" to be array of
                         size 10 */

typeof 演算子は、任意の型の引数を使用できるマクロ定義で特に役立つ可能性があります。例:

                    #define SWAP(a,b)
                { typeof(a) temp; temp = a; a = b; b = temp; }

B.2.21 -flags

使用できる各コンパイラオプションのサマリーを出力します。

B.2.22 -flteval[={any|2}]

(x86) このオプションは、浮動小数点式の評価方法の制御に使用します。

表 B-8  -flteval のフラグ
フラグ
意味
2
浮動小数点式が long double 型として評価されます。
any
式を構成している変数および定数の型の組み合わせに基づいて浮動小数点式が評価されます。

-flteval が指定されない場合は、-flteval=any に設定されます。-flteval を指定したけれども値を指定しない場合、コンパイラはそれを -flteval=2 に設定します。

-flteval=2-xarch=sse pentium_prossea、または pentium_proa と一緒でのみ使用できます。-flteval=2 は、-fprecision または -nofstore オプションとの組み合わせでも互換性がありません。

浮動小数点評価における精度も参照してください。

B.2.23 –fma[={none|fused}]

浮動小数点の積和演算 (FMA) 命令の自動生成を有効にします。–fma=none を指定すると、これらの命令の生成を無効にします。–fma=fused を指定すると、コンパイラは浮動小数点の積和演算 (FMA) 命令を使用して、コードのパフォーマンスを改善する機会を検出しようとします。

デフォルトは –fma=none です。

積和演算命令を生成するための最低限のアーキテクチャーの要件は、SPARC では –xarch=sparcfmaf、x86 では -xarch=avx2 です。積和演算 (FMA) 命令をサポートしていないプラットフォームでプログラムが実行されないようにするため、コンパイラは積和演算 (FMA) 命令を生成する場合、バイナリプログラムにマーク付けをします。最低限のアーキテクチャーが使用されていない場合、-fma=fused は無効になります。

積和演算 (FMA) 命令により、積と和の間で中間の丸め手順が排除されます。その結果、–fma=fused を指定してコンパイルしたプログラムは、精度は減少ではなく増加する傾向にありますが、異なる結果になることがあります。

B.2.24 -fnonstd

このオプションは、-fns および -ftrap=common 用のマクロです。

B.2.25 -fns[={no|yes}]

SPARC プラットフォームでは、このオプションは標準でない浮動小数点モードを有効にします。

x86 プラットフォームの場合、このオプションは SSE flush-to-zero モードを選択し、使用可能な場合には denormals-are-zero モードを選択します。これにより、非正規数の結果がゼロに切り捨てられ、使用可能な場合には、非正規化数のオペランドもゼロとして扱われます。このオプションは、SSE や SSE2 命令セットを利用しない従来の x86 浮動小数点演算には影響しません。

デフォルトは -fns=no、標準の浮動小数点モードです。-fns-fns=yes と同じです。

オプションの =yes または =no を使用すると、-fast のように、-fns を含むほかのマクロフラグに続く -fns フラグを切り替えることができます。

一部の SPARC システムでは、非標準の浮動小数点モードは「段階的アンダーフロー」を無効にします。つまり、小さな結果は、非正規数にはならず、ゼロに切り捨てられます。また、非正規オペランドはメッセージなしにゼロに変更されます。このような SPARC システムでは、ハードウェアの段階的アンダーフローや非正規数がサポートされておらず、このオプションを使用するとプログラムのパフォーマンスを著しく改善することができます。

非標準モードを有効にすると、浮動小数点演算は IEEE 754 規格に準拠しない結果を生成する場合があります。詳細は、『数値計算ガイド』を参照してください。

SPARC システムでは、このオプションはメインプログラムのコンパイル時に使用される場合にのみ有効です。

B.2.26 -fopenmp

-xopenmp=parallel と同じです。

B.2.27 -fPIC

-KPIC と同義です。

B.2.28 -fpic

-Kpic と同義です。

B.2.29 -fprecision=p

(x86) -fprecision={single, double, extended}

浮動小数点制御ワードの丸め精度モードのビットを、単精度 (24 ビット)、倍精度 (53 ビット) または拡張精度 (64 ビット) に設定します。デフォルトの浮動小数点丸め精度モードは拡張モードです。

x86 では、浮動小数点丸め精度モードの設定は精度に対してのみ影響します。指数の有効範囲に対しては影響しません。

このオプションは、x86 システムでメインプログラムのコンパイル時に使用する場合にのみ有効で、64 ビット (-m64) または SSE2 対応 (-xarch=sse2) プロセッサでコンパイルする場合は無視されます。SPARC システムでも無視されます。

B.2.30 -fround=r

プログラム初期化中に、実行時に確立される IEEE 754 丸めモードを設定します。

r は、nearest tozeronegativepositive のいずれかです。

デフォルトは、-fround=nearest です。

ieee_flags サブルーチンと同義です。

rtozeronegativepositive のいずれかにすると、プログラムが実行を開始するときに、丸め方向モードがそれぞれ、ゼロの方向に丸める、負の無限の方向に丸める、正の無限の方向に丸めるに設定されます。rnearest のとき、あるいは -fround フラグを使用しないとき、丸め方向モードは初期値から変更されません (デフォルトは nearest)。

このオプションは、メインプログラムをコンパイルするときにだけ有効です。

B.2.31 -fsimple[=n]

オプティマイザが浮動小数点演算に関する前提事項を単純化することを許可します。

デフォルトは -fsimple=0 です。-fsimple-fsimple=1 と同義です。

n を指定する場合、0、1、2 のいずれかにしなければいけません。

表 B-9  -fsimple のフラグ
意味
-fsimple=0
前提事項の単純化を行えないようにします。IEEE 754 に厳密に準拠します。
-fsimple=1
若干の単純化を許可します。生成されるコードは、厳密には IEEE 754 に準拠していません。
-fsimple=1 の場合、次に示す内容を前提とした最適化が行われます。
  • IEEE 754 のデフォルトの丸めとトラップモードが、プロセスの初期化以後も変わらない。

  • 潜在的な浮動小数点例外を除き、表示できない結果を生成する計算が削除される場合があります。

  • オペランドとして無限大または非数を持つ計算は、結果に非数を反映する必要はありません。たとえば、x*00 に置き換えられることがあります。

  • 演算はゼロの符号を区別しない。

    -fsimple=1 を指定すると、オプティマイザは必ず丸めまたは例外に応じた、完全な最適化を行います。特に、浮動小数点演算を、実行時に一定に保たれる丸めモードにおいて異なる結果を生成する浮動小数点演算と置き換えることはできません。

-fsimple=2
–fsimple=1 のすべての機能が含まれ、-xvector=simd が有効な場合に、SIMD 命令を使用して縮約を計算できるようにします。
コンパイラは積極的な浮動小数点演算の最適化を試み、この結果、丸めの変化によって、多くのプログラムが異なる数値結果を生じる可能性があります。たとえば、-fsimple2 を指定し、あるループ内に x/y の演算があった場合、x/y がループ内で少なくとも 1 回は必ず評価され、z=1/yで、ループの実行中に yz が一定の値をとることが明らかである場合、オプティマイザは x/y の演算をすべて x*z で置き換えます。

-fsimple=2 を指定しても、そうでない場合は何も生成しないプログラムで、オプティマイザが浮動小数点例外を発生させることは許可されません。

最適化が精度に与える影響の詳細は、『Techniques for Optimizing Applications: High Performance Computing』(Rajat Garg と Ilya Sharapov 著) をお読みください。

B.2.32 -fsingle

(-Xt および -Xs モードのみ) デフォルトでは、-Xs-Xtfloat 式を double に拡張して倍精度で評価することで、これらの式に関する K&R C の規則に従います。-fsingle は、-Xs または -Xt を指定して、コンパイラに浮動小数点式を単精度として評価させる場合に使用します。

B.2.33 -fstore

(x86) 浮動小数点式または関数が、ある変数に代入されるか、より小さい型の浮動小数点にキャストされる場合に、コンパイラがその値をレジスタに残さないで、代入値の左側に表記される型に変換するようにします。丸めや切り上げによって、結果はレジスタの値から生成されるものと異なる可能性があります。これは、デフォルトのモードです。

このオプションを無効にするには、-nofstore フラグを使用します。

B.2.34 -ftrap=t[,t...]

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 を除くすべてのトラップを設定します。

-ftrap=t 付きで 1 つのルーチンを コンパイルする場合は、予期しない結果を避けるために、プログラムのすべてのルーチンを同じオプションでコンパイルしてください。

-ftrap=inexact のトラップは慎重に使用してください。-ftrap=inexact では、浮動小数点の値が正確でないとトラップが発生します。たとえば、次の文ではこの条件が発生します。

x = 1.0 / 3.0;

このオプションは、メインプログラムをコンパイルするときにだけ有効です。このオプションを使用する際には注意してください。IEEE トラップを有効にするには、-ftrap=common を使用します。

B.2.35 -G

動的にリンクされた実行可能ファイルではなく、共有オブジェクトを生成します。このオプションは ld(1) に渡され、-dn オプションと一緒に使用できません。

-G オプションを使用すると、コンパイラはデフォルトの -l オプションを ld に渡しません。共有ライブラリを別の共有ライブラリに依存させる場合は、必要な -l オプションをコマンド行に渡す必要があります。

コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションと -G オプションを組み合わせて共有ライブラリを作成した場合は、生成された共有オブジェクトとのリンクでも、必ず同じオプションを指定してください。

共有オブジェクトを作成するときは、-m64 付きでコンパイルされるすべての 64 ビット SPARC オブジェクトファイルも、-xcode[=v]で説明するように、明示的な -xcode[=v] 値付きでコンパイルする必要があります。

B.2.36 -g

-g[n] を参照してください。

B.2.37 -g[n]

dbx(1) とパフォーマンスアナライザ analyzer(1) によるデバッグのために、追加のシンボルテーブル情報を生成します。

-xO3 以下の最適化レベルで -g を指定すると、ほとんど完全な最適化と可能なかぎりのシンボル情報を取得することができます。末尾呼び出しの最適化とバックエンドのインライン化は無効です。

-xO4 以下の最適化レベルで -g を指定すると、完全な最適化と可能なかぎりのシンボル情報が得られます。

-g オプションでコンパイルすると、パフォーマンスアナライザの機能をフルに利用できます。 一部のパフォーマンス分析機能は -g を必要としませんが、注釈付きのソースコード、一部の関数レベルの情報、およびコンパイラの注釈メッセージを確認するには、-g でコンパイルする必要があります。詳細は、analyzer(1) のマニュアルページおよび『プログラムのパフォーマンス解析』のマニュアルを参照してください。

-g オプションで生成される注釈メッセージは、プログラムのコンパイル時にコンパイラが実行した最適化と変換について説明します。メッセージを表示するには、er_src(1) コマンドを使用します。これらのメッセージはソースコードでインタリーブされます。


注 -  プログラムを個別の手順でコンパイルしてリンクする場合、—g オプションを一方の手順に含め、もう一方の手順から除外してもプログラムの正確さには影響しませんが、プログラムのデバッグ機能に影響します。—g を付けてコンパイルしないけれども、—g を付けてリンクされるモジュールは、デバッグのために適切に準備されません。関数 main を含むモジュールを —g オプション付きでコンパイルすることは通常、デバッグのために必要です。

-g は、さまざまなよりプリミティブなオプションに展開されるマクロとして実装されます。展開の詳細については、-xdebuginfo を参照してください。

-g

標準のデバッグ情報を生成します。

-gnone

デバッグ情報は生成されません。これはデフォルト値です。

-g1

事後デバッグの際に重要と思われるファイル、行番号、および簡単なパラメータ情報を生成します。

-g2

-g と同じです。

-g3

追加のデバッグ情報 (現在はマクロの定義情報のみで構成されます) を生成します。この追加情報により、-g のみを使用したコンパイルと比較して、結果の .o および実行可能ファイルのデバッグ情報のサイズが増える可能性があります。

デバッグの詳細は、『dbx コマンドによるデバッグ』を参照してください。

B.2.38 -H

現在のコンパイルでインクルードされたファイルのパス名を 1 行に 1 つずつ標準エラーに出力します。表示は、どのファイルがほかのファイルにインクルードされるかを示すためにインデントされます。

次の例では、プログラム sample.c はファイル stdio.hmath.h をインクルードします。math.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

B.2.39 -h name

共有動的ライブラリに、異なったバージョンのライブラリを持つように名前を割り当てます。name は、-o オプションで指定されるものと同じファイル名にしてください。-hname の間の空白は任意です。

リンカーは指定された name; をライブラリに割り当て、この名前をライブラリのイントリンシック名としてライブラリファイルに記録します-hname; オプションがない場合、イントリンシック名はライブラリファイルに記録されません。

実行時リンカーはライブラリを実行可能ファイルにロードするとき、組み込み名をライブラリファイルから実行可能ファイルが必要とする共有ライブラリファイルのリストにコピーします。実行可能ファイルはこのリストを持っています。共有ライブラリの組み込み名が提供されない場合、リンカーは代わりに共有ライブラリファイルのパスをコピーします。

B.2.40 -I[-|dir]

-I dir は、相対ファイル名、つまり、/ (スラッシュ) から始まらないディレクトリパスを持つ #include ファイルを検索するディレクトリのリスト内の /usr/include の前に dir を追加します。

複数の -I オプションが指定された場合は、指定された順序でディレクトリが調べられます。

コンパイラの検索パターンの詳細については、-I- オプションによる検索アルゴリズムの変更を参照してください。

B.2.41 -i

オプションをリンカーへ渡して、LD_LIBRARY_PATH または LD_LIBRARY_PATH_64 の設定を無視します。

B.2.42 –include filename

このオプションを指定すると、コンパイラは filename を、主要なソースファイルの 1 行目に記述されているかのように #include プリプロセッサ指令として処理します。ソースファイル t.c の考慮:

main()
{
   ...
}

t.ccc -include t.h t.c コマンドを使用してコンパイルする場合は、ソースファイルに次の内容が含まれているかのようにコンパイルが進行します。

#include "t.h"
main()
{
   ...
}

コンパイラが filename を最初に検索するのは、ファイルが明示的にインクルードされる場合のように、main ソースファイルが含まれるディレクトリではなく、現在の作業ディレクトリです。たとえば、次のディレクトリ構造では、同じ名前を持つ 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 オプションを指定する場合は、コマンド行で表示される順にファイルがインクルードされます。

B.2.43 -KPIC

(SPARC) 廃止。このオプションは使わないでください。代わりに -xcode=pic32 を使用してください。

詳細は、-xcode[=v] を参照してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

(x86) -KPIC -Kpic と同じです。

B.2.44 -Kpic

(SPARC) 廃止。このオプションは使わないでください。代わりに -xcode=pic13 を使用してください。詳細は、-xcode[=v] を参照してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

(x86) 位置独立コードを生成します。このオプションは、共有ライブラリを構築するためにソースファイルをコンパイルするときに使用します。大域データへの各参照は、大域オフセットテーブルにおけるポインタの間接参照として生成されます。各関数呼び出しは、手続きリンケージテーブルを通して PC 相対アドレス指定モードで生成されます。

B.2.45 -keeptmp

コンパイル中に作成される一時ファイルを自動的に削除しないで保持します。

B.2.46 -Ldir

ld(1) がライブラリを検索するディレクトリのリストに dir を付け加えます。このオプションとその引数は ld(1) に渡されます。


注 -  コンパイラインストール領域 (/usr/include/lib、または /usr/lib) を検索ディレクトリとして指定しないでください。

B.2.47 -lname

オブジェクトライブラリlib name.so または libname .a をリンクの対象とします。シンボルは左から右へ解決されるため、コマンドでのライブラリの順序は重要です。

このオプションはソースファイル引数のあとに指定してください。

B.2.48 -library=sunperf

Oracle Solaris Studio パフォーマンスライブラリとリンクします。

B.2.49 –m32|–m64

コンパイルされたバイナリオブジェクトのメモリーモデルを指定します。

–m32 を使用すると、32 ビット実行可能ファイルと共有ライブラリが作成されます。–m64 を使用すると、64 ビット実行可能ファイルと共有ライブラリが作成されます。

ILP32 メモリーモデル (32 ビット int、long、ポインタデータ型) は 64 ビット対応ではないすべての Solaris プラットフォームおよび Linux プラットフォームのデフォルトです。LP64 メモリーモデル (64 ビット long、ポインタデータ型) は 64 ビット対応の Linux プラットフォームのデフォルトです。–m64 は LP64 モデル対応のプラットフォームでのみ許可されます。

–m32 を使用してコンパイルされたオブジェクトファイルまたはライブラリを、–m64 を使用してコンパイルされたオブジェクトファイルまたはライブラリにリンクすることはできません。

–m32|–m64 を指定してコンパイルしたモジュールは、–m32 |–m64 を指定してリンクする必要があります。コンパイル時とリンク時のオプションに、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの一覧をまとめています。

x86/x64 プラットフォームで大量の静的データを持つアプリケーションを –m64 を使用してコンパイルするときは、–xmodel=medium も必要になることがあります。一部の Linux プラットフォームは、ミディアムモデルをサポートしていません。

以前のコンパイラリリースでは、–xarch で命令セットを選択すると、メモリーモデル ILP32 または LP64 が使用されていました。Oracle Solaris Studio 12 コンパイラから、このデフォルトは該当しません。ほとんどのプラットフォームでは、–m64 をコマンド行に追加するだけで、64 ビットオブジェクトが作成されます。

Oracle Solaris では、–m32 がデフォルトです。64 ビットプログラムをサポートする Linux システムでは、–m64 –xarch=sse2 がデフォルトです。

–xarch の説明も参照してください。

B.2.50 -mc

オブジェクトファイルの .comment セクションから重複している文字列を削除します。-mc フラグを使用すると、mcs -c が起動されます。

B.2.51 -misalign

(SPARC) 廃止。このオプションは使わないでください。代わりに -xmemalign=1i オプションを使ってください。詳細は、-xmemalign=abを参照してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

B.2.52 -misalign2

(SPARC) 廃止。このオプションは使わないでください。代わりに –xmemalign=2i オプションを使ってください。詳細は、-xmemalign=abを参照してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

B.2.53 -mr[,string]

-mr は、 .comment セクションからすべての文字を削除します。このフラグを使用すると、mcs -d -a が呼び出されます。

-mr, string はオブジェクトファイルの .comment セクションからすべての文字列を削除して、string を挿入します。string に空白が含まれている場合は二重引用符で囲みます。string がなければ .comment セクションは空になります。このオプションは -d -string として mcs に渡されます。

B.2.54 -mt[={yes|no}]

このオプションを使用して、Oracle Solaris スレッドまたは POSIX スレッド API を使用しているマルチスレッド化コードをコンパイルおよびリンクします。–mt=yes オプションにより、ライブラリが適切な順序でリンクされることが保証されます。

このオプションは -D_REENTRANT をプリプロセッサに渡します。

Oracle Solaris スレッドを使用するには、thread.h ヘッダーファイルをインクルードし、—mt=yes オプション付きでコンパイルします。Oracle Solaris プラットフォームで POSIX スレッドを使用するには、pthread.h ヘッダーファイルをインクルードし、—mt=yes オプション付きでコンパイルします。

Linux プラットフォームでは、POSIX スレッド API のみを使用できます。(libthread は Linux プラットフォームでは使用できません。)したがって、Linux プラットフォームで —mt=yes を使用すると、—lthread の代わりに —lpthread が追加されます。Linux プラットフォームで POSIX スレッドを使用するには、—mt 付きでコンパイルします。

—G を使用してコンパイルする場合は、—mt=yes を指定しても、—lthread—lpthread のどちらも自動的には含められません。共有ライブラリを構築する場合は、これらのライブラリを明示的にリストする必要があります。

-xopenmp オプションおよび -xautopar オプションには -mt=yes が自動的に含まれます。

–mt=yes を指定してコンパイルを実行し、リンクを個別の手順でリンクする場合は、コンパイル手順と同様にリンク手順でも -mt=yes オプションを使用する必要があります。–mt=yes を使用して 1 つの変換ユニットをコンパイルおよびリンクする場合は、–mt=yes を指定してプログラムのすべてのユニットをコンパイルおよびリンクする必要があります。

-mt=yes は、コンパイラのデフォルトの動作です。この動作が望ましくない場合は、-mt=no でコンパイルします。

オプション —mt—mt=yes と同じです。

-xnolib と、Oracle Solaris の『Multithreaded Programming Guide』および『リンカーとライブラリガイド』も参照してください。

B.2.55 -native

このオプションは、-xtarget=native と同義です。

B.2.56 -nofstore

(x86) 浮動小数点式または関数が変数に代入されるか、より短い浮動小数点型にキャストされるときに、その式または関数の値を代入の左辺の型に変換しません。代わりに、値をレジスタに残します。-fstoreも参照してください。

B.2.57 -O

デフォルトの最適化レベルの -xO3 を使ってください。 -O マクロは -xO3 に展開されます。

-xO3 最適化レベルがより高い実行時パフォーマンスを生み出します。ただし、あらゆる変数が自動的に volatile と見なされることに依存するプログラムの場合、これは不適切なことがあります。この前提を持つ典型的なプログラムは、独自の同期処理プリミティブを実装するデバイスドライバや古いマルチスレッドアプリケーションです。回避策は、-O ではなく、-xO2 でコンパイルすることです。

B.2.58 -o filename

デフォルトの a.out ではなく、出力ファイル filename を指定します。コンパイラはソースファイルを上書きしないため、filename を入力ソースファイルと同じにできません。

filename は適切な接尾辞を持つ必要があります。—c とともに使用すると、filename はターゲット .o オブジェクトファイルを指定します。—G とともに使用すると、ターゲット .so ライブラリファイルを指定します。このオプションとその引数はリンカー ld に渡されます。

B.2.59 -P

ソースファイルのプリプロセッサ処理のみを行います。.i 接尾辞の付いたファイルに結果を出力します。-E オプションと異なり、出力ファイルに C のプリプロセッサ行番号付け情報は含まれません。-E オプションも参照してください。

B.2.60 -p

このオプションは廃止されました。代わりに -xpgを使用してください。

B.2.61 –pedantic{=[yes|no]}

非 ANSI 構文に対するエラー/警告に厳密に準拠します。有効な ANSI 標準を指定するために -std フラグを使用できます。-Xc-Xa-Xt-Xs、および -xc99 フラグは、-pedantic フラグとともに指定できません。一緒に指定するとコンパイラによってエラーが発行されます。

-pedantic が指定されていない場合のデフォルトは -pedantic=no です。

-pedantic-pedantic=yes と同義です。

B.2.62 –preserve_argvalues[=simple|none|complete]

(x86) レジスタベースの関数の引数のコピーをスタックに保存します。

コマンド行に none を指定した場合、または -preserve_argvalues オプションを指定しない場合、コンパイラは通常どおりに動作します。

simple を指定した場合、最大で 6 つの整数引数が保存されます。

complete を指定した場合、スタックトレース内のすべての関数引数の値は、適切な順序でユーザーに表示されます。

仮引数に割り当てられている関数の有効期間中、値は更新されません。

B.2.63 –Qoption phase option[,option..]

option をコンパイル段階に渡します。

複数のオプションを渡すには、コンマで区切って指定します。-Qoption でコンポーネントに渡されるオプションは、順序が変更されることがあります。ドライバが認識するオプションは、正しい順序に保持されます。ドライバがすでに認識しているオプションに、-Qoption は使わないでください。

phase は、次のリスト内のいずれかの値にできます。

acomp

コンパイラ

cg

コードジェネレータ (SPARC)

cpp

プリプロセッサ

driver

cc ドライバ

fbe

アセンブラ

ipo

内部手続きオプティマイザ

iropt

オプティマイザ

ld

リンクエディタ (ld)

mcs

mcs—mc または —mr が指定されたとき、オブジェクトファイルのコメントセクションを操作します。

postopt

ポストオプティマイザ

ssbd

lock_lint のコンパイラ段階

ube

コードジェネレータ (x86)

同等の機能を提供する —Wc, arg も参照してください。—Qoption は、ほかのコンパイラとの互換性のために提供されています。

B.2.64 -Q[y|n]

出力ファイルに識別情報を出力するかどうかを決定します。-Qy がデフォルトです。

-Qy を指定すると、起動した各コンパイラツールの識別情報が出力ファイルの .comment 部分に追加され、mcs でのアクセスが可能になります。これはソフトウェア管理に役立ちます。

-Qn を指定すると、この情報が抑制されます。

B.2.65 -qp

-pと同じです。

B.2.66 -Rdir[ :dir]

コロンで区切られたディレクトリのリストを、ライブラリ検索ディレクトリとして、実行時リンカーに渡します。ディレクトリリストが存在していて null でない場合は、出力オブジェクトファイルに記録され、実行時リンカーに渡されます。

LD_RUN_PATH-R オプションの両方が指定されたときは、この -R オプションが優先されます。

B.2.67 -S

cc に対して、アセンブリソースファイルを作成するけれども、プログラムをアセンブルまたはリンクしないように指示します。アセンブラ言語出力は、接尾辞が .s の対応するファイルに書き込まれます。

B.2.68 -s

出力されるオブジェクトファイルからシンボリックデバッグのための情報をすべて削除します。このオプションは、-g とともに指定することはできません。

ld(1) に渡します。

B.2.69 -staticlib=[no%]sunperf

-library=sunperf とともに使用すると、-staticlib=sunperf は Sun パフォーマンスライブラリと静的にリンクします。デフォルトの場合、および -library=no%sunperf を指定すると、-library=sunperf は Sun パフォーマンスライブラリと動的にリンクします。

CC との互換性のため、%all および %none-staticlib で受け入れられる値です (%allsunperf と同等であり、%noneno%sunperf と同義です)。

B.2.70 –std=value

C 言語規格の選択フラグ。

value は次のいずれかとして定義します。

c89

受け入れられる C ソース言語は、ISO C90 標準で定義されたものです。

c99

受け入れられる C ソース言語は、ISO C99 標準で定義されたものです。

c11

受け入れられる C ソース言語は、ISO C11 標準で定義されたものです。

最初のデフォルトは c11 であり、ANSI C11 で定義されている C ソース言語を拡張したものを受け入れることを意味します。2 番目のデフォルトはありません。代わりに、値なしで -std を指定すると、エラーが生成されます。

フラグ -Xc-Xa-Xt、または -xtransition のいずれかを指定すると、-std の最初のデフォルトは無効になり、コンパイラではデフォルトで -xc99=all,no_lib が指定されます。-Xs を指定すると、最初のデフォルトは無効になり、コンパイラではデフォルトで -xc99=none が指定されます。-xc99 を指定すると、-std の最初のデフォルトは無効になり、コンパイラは -xc99 の指定を受け入れます。

-std フラグを指定した場合、-Xc-Xa-Xt-Xs、および -xc99 フラグは使用できません。一緒に指定するとコンパイラによってエラーが発行されます。

コンパイルとリンクを別々に行う場合は、両方の手順で同じ -std フラグの値を使用する必要があります。

B.2.71 -temp=path

一時ファイルのディレクトリを定義します。

このオプションは、コンパイル中に生成される一時ファイルを格納するディレクトリのパス名を指定します。コンパイラは –temp によって設定された値を、TMPDIR の値より優先します。

B.2.71.1 関連項目

-keeptmp

B.2.72 -traceback[={%none|common|signals_list}]

実行時に重大エラーが発生した場合にスタックトレースを発行します。

-traceback オプションを指定すると、プログラムによって特定のシグナルが生成された場合に、実行可能ファイルで stderr へのスタックトレースが発行されて、コアダンプが実行され、終了します。複数のスレッドが 1 つのシグナルを生成すると、スタックトレースは最初のスレッドに対してのみ生成されます。

追跡表示を使用するには、リンク時に -traceback オプションをコンパイラコマンド行に追加します。このオプションはコンパイル時にも使用できますが、実行可能バイナリが生成されない場合無視されます。-traceback -G とともに使用して共有ライブラリを作成すると、エラーが発生します。

表 B-11  -traceback のオプション
オプション
意味
common
sigillsigfpesigbussigsegv、または sigabrt の共通シグナルのいずれかのセットが発生した場合にスタックトレースを発行するべきであることを指定します。
signals_list
スタックトレースを生成するべきシグナルの名前のコンマ区切りのリスト (小文字) を指定します。コアファイルの生成の原因となる、sigquitsigillsigtrapsigabrtsigemtsigfpesigbussigsegvsigsyssigxcpusigxfsz の各シグナルをキャッチできます。
これらのシグナルの前に no% を指定すると、そのシグナルのキャッチが無効になります。
たとえば、-traceback=sigsegv,sigfpe と指定すると、sigsegv または sigfpe が発生した場合にスタックトレースとコアダンプが生成されます。
%none または none
トレースバックを無効にします。

このオプションを指定しない場合、デフォルトは -traceback=%none になります。

= 記号を指定せずに、-traceback だけを指定すると、-traceback=common と同義になります。

コアダンプが必要ない場合は、次のように coredumpsize 制限を 0 に設定します。

% limit coredumpsize 0            

-traceback オプションは、実行時のパフォーマンスに影響しません。

B.2.73 -Uname

プリプロセッサシンボル name; の定義を削除します。このオプションは、同じコマンド行で -D で作成されたプリプロセッサシンボル name の初期定義を削除します。コマンド行ドライバでそこに配置されたものも含みます。

-U は、ソースファイルのプリプロセッサ指令に影響しません。コマンド行に複数の -U オプションを配置できます。

コマンド行で -D-U の両方に同じ name が指定された場合、オプションの配置順に関係なく、name は未定義になります。次の図で、-U__sun の定義のを削除します。

cc -U__sun text.c

test.c の次の書式のプリプロセッサ文は、__sun の定義が削除されているために有効になりません。

#ifdef(__sun)

定義済みシンボルのリストについては、-Dname[(arg[,arg])][=expansion] を参照してください。

B.2.74 -V

コンパイラの実行時に cc によって各コンポーネントの名前とバージョン番号を出力します。

B.2.75 -v

より厳しい意味検査およびほかの lint に似た検査を行います。たとえば、次のコードは支障なくコンパイルおよび実行されます。

#include <stdio.h>
main(void)
{
     printf("Hello World.\n");
}

-v オプションを指定した場合も、コンパイルされます。ただし、コンパイラは次の警告を表示します。

"hello.c", line 5: warning: function has no return statement:
 main

-vlint(1) が発する警告をすべて表示するわけではありません。lint を通して前の例を実行することにより、違いを確認できます。

B.2.76 -Wc,arg

指定されたコンパイラコンポーネント c に、arg を渡します。コンポーネントのリストについては、Table 1–1 を参照してください。

引数は前の引数からコンマでのみ区切る必要があります。すべての -W 引数は、残りのコマンド行引数のあとに渡されます。コンマを引数の一部として含めるには、コンマの直前にエスケープ文字 \ (バックスラッシュ) を使用します。すべての -W arg は、通常のコマンド行引数のあとに渡されます。

たとえば、-Wa,-o,objfile は、-oobjfile をこの順番でアセンブラに渡します。また、-Wl,-I,name; を指定すると、リンク段階で動的リンカー /usr/lib/ld.so.1 のデフォルト名がオーバーライドされます。

引数がツールに渡される順序は、ほかに指定されるコマンド行オプションとの関係で、今後のコンパイラリリースで変更される可能性があります。

c に使用できる値の一覧を次の表に示します

表 B-12  -W のフラグ
フラグ
意味
a
アセンブラ : (fbe); (gas)
c
C コードジェネレータ : (cg) (SPARC) ;
d
cc ドライバ
l
リンクエディタ (ld)
m
mcs
O (大文字の o)
内部手続きオプティマイザ
o (小文字の o)
ポストオプティマイザ
p
プリプロセッサ (cpp)
u
C コードジェネレータ (ube) (x86)
0 (ゼロ)
コンパイラ (acomp)
2
オプティマイザ: (iropt)

-Wd を使用して cc のオプションを c コンパイラに渡すことはできません。

B.2.77 -w

コンパイラからの警告メッセージを出力しません。

このオプションは error_messages プラグマを無効にします。

B.2.78 -X[c|a|t|s]

(廃止) -Xs オプションは、将来のリリースで削除される予定です。適切なビルドおよびコンパイルに -Xs が必要になる C コードは、少なくとも ISO C 標準の C99 ダイアレクトに準拠するように、つまり -std=c99 でコンパイルできるように移行することをお勧めします。

-std または -xlang フラグを指定した場合、-Xc-Xa-Xt、および -Xs フラグは使用できません。

-std フラグを使用しない場合、 -X (大文字の X である点に注意) オプションは 1990 および 1999 ISO C 規格に準拠する度合いを指定します。-xc99 の値により、-X オプションが適用される ISO C 規格のバージョンが異なります。-xc99 オプションは、デフォルトでは -xc99=all になっています。この場合は、1999 ISO/IEC C 規格のサブセットをサポートします。-xc99=none を指定した場合は、1990 ISO/IEC C 規格をサポートします。サポートされている 1999 ISO/IEC の機能については、「D.1」を参照してください。ISO/IEC C と K&R C の相違点については、「付録 H」を参照してください。

コンパイラのデフォルトモードは、-pedantic フラグのない -std=c11 です。-xc99 フラグが指定されているかまたは有効な場合、-Xa がコンパイラのデフォルトモードになります

-Xc

(c = conformance) ISO C にない言語構造を使用しているプログラムに対してエラーや警告を発行します。このオプションは、K&R C 互換性拡張機能なしで、ISO C に厳格に準拠しています。 –-Xc オプションを指定すると事前定義されたマクロ __STDC__ の値は 1 になります。

–Xa

ISO C に K&R C 互換性拡張機能を加え、ISO C により求められる意味の変更を含めたものです。K&R C と ISO C が同じ構造体に異なる意味を指定している場合、コンパイラは ISO C の解釈を使用します。-Xa オプションを -xtransition オプションと併せて使用すると、異なる意味論に関する警告が出力されます。–Xa オプションを指定すると事前定義されたマクロ __STDC__ の値は –0 になります。

-Xt

(t = transition) このオプションは、ISO C + K&R C 互換性拡張 (ISO 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__ はこのモードでは定義されません。

B.2.79 -x386

(x86) 廃止。このオプションは使わないでください。代わりに、-xchip=generic を使用してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

B.2.80 -x486

(x86) 廃止。このオプションは使わないでください。代わりに、-xchip=generic を使用してください。廃止オプションに、廃止のオプションの全一覧をまとめています。

B.2.81 -Xlinker arg

arg をリンカー ld(1) に渡します。—z arg と同等

B.2.82 -xaddr32[=yes|no]

(Solaris x86/x64 のみ) コンパイラフラグ -xaddr32=yes は、結果として生成される実行可能ファイルまたは共有オブジェクトを 32 ビットアドレス空間に制限します。

この方法でコンパイルする実行可能ファイルは、32 ビットアドレス空間に制限されるプロセスを作成する結果になります。

-xaddr32=no を指定する場合は、通常の 64 ビットバイナリが作成されます。

-xaddr32 オプションを指定しないと、-xaddr32=no が想定されます。

-xaddr32 だけを指定すると、-xaddr32=yes が想定されます。

このオプションは、-m64 コンパイルのみ、および SF1_SUNW_ADDR32 ソフトウェア機能をサポートしている Oracle Solaris プラットフォームのみに適用できます。Linux カーネルはアドレス空間制限をサポートしていないので、Linux ではこのオプションは使用できません。

単一のオブジェクトファイルが -xaddr32=yes を指定してコンパイルされた場合は、出力ファイル全体が -xaddr32=yes を指定してコンパイルされたものと、リンク時に想定されます。

32 ビットアドレス空間に制限される共有オブジェクトは、制限された 32 ビットモードのアドレス空間内で実行されるプロセスから読み込む必要があります。

詳細は、『Linker and Libraries Guide』で説明されている SF1_SUNW_ADDR32 ソフトウェア機能の定義を参照してください。

B.2.83 -xalias_level[=l]

コンパイラで -xalias_level オプションを使用して、型に基づく別名の解析による最適化でのレベルを指定します。このオプションは、コンパイル対象の変換ユニットで、指定した別名レベルを有効にします。

-xalias_level コマンドを発行しない場合、コンパイラは -xalias_level=any を仮定します。値を設定しないで -xalias_level を指定する場合、デフォルトは -xalias_level=layout になります。

-xalias_level オプションを使用するには、-xO3 以上の最適化レベルが必要です。最適化がこれよりも低く設定されている場合は、警告が表示され、-xalias_level オプションは無視されます。

-xalias_level オプションを発行しても、別名レベルごとに記述されている規則と制限を遵守しない場合、プログラムが未定義の動作をします。

l を次の表のいずれかの用語で置き換えます。

表 B-13  別名明確化のレベル
フラグ
意味
any
コンパイラは、すべてのメモリー参照がこのレベルで別名設定できると仮定します。-xalias_level=any レベルで型に基づく別名分析は行われません。
basic
-xalias_level=basic オプションを使用する場合、コンパイラは、さまざまな C 言語基本型を呼び出すメモリー参照が相互に別名設定しないと仮定します。また、コンパイラは、ほかのすべての型への参照が C 言語基本型と同様に相互に別名設定できると仮定します。コンパイラは、char * を使用する参照がそのほかの型を別名設定できると仮定します。
たとえば、-xalias_level=basic レベルにおいて、コンパイラは、int * 型のポインタ変数が float オブジェクトにアクセスしないことを仮定します。そのため、コンパイラは、float * 型のポインタが int * 型のポインタで参照される同一メモリーを別名設定しないと仮定する最適化を安全に実行できます。
weak
-xalias_level=weak オプションを使用する場合、コンパイラは、任意の構造体ポインタが構造体の型にポイントできると仮定します。
コンパイルされるソースの式で参照されるか、コンパイルされるソースの外側から参照される型への参照を含む構造体または共用体は、コンパイルされるソースの式より先に宣言する必要があります。
この制限事項を遵守するには、コンパイルされるソースの式で参照されるオブジェクトの型を参照する型を含むプログラムの全ヘッダーファイルを取り込みます。
-xalias_level=weak レベルで、コンパイラは、さまざまな C 言語基本型に関連するメモリー参照が相互に別名設定しないと仮定します。コンパイラは、char * を使用する参照がそのほかの型に関連するメモリー参照を別名設定すると仮定します。
layout
-xalias_level=layout オプションを使用すると、コンパイラは、メモリー内に同一の型のシーケンスを保持する型に関連するメモリー参照が相互に別名設定できると仮定できます。
コンパイラは、メモリーで同一に見えない型を保持する 2 つの参照が相互に別名設定しないと仮定します。コンパイラは、構造体の初期メンバーがメモリーで同じに見える場合、さまざまな struct の型の別名を介して 2 つのメモリーがアクセスを実行すると仮定します。ただし、このレベルで、struct へのポインタを使用して、2 つの struct の間にあるメモリーで同じに見えるメンバーの一般的な初期シーケンスの外側にある類似しない struct オブジェクトのフィールドにアクセスすべきではありません。コンパイラは、そのような参照が相互に別名設定しないと仮定します。
-xalias_level=layout オプションを使用すると、コンパイラは、メモリー内に同一の型のシーケンスを保持する型に関連するメモリー参照が相互に別名設定できると仮定できます。コンパイラは、char * を使用する参照がそのほかの型に関連するメモリー参照を別名設定できると仮定します。
strict
-xalias_level=strict オプションを使用すると、コンパイラは、タグを削除したときに同一となるメモリー参照 (structunion などの型に関連するもの) が相互に別名設定できると仮定します。逆に言えば、コンパイラは、タグを削除したあとも同一にならない型に関連するメモリー参照は相互に別名設定しないと仮定します。
ただし、コンパイルされるソースの式で参照されるか、コンパイルされるソースの外側から参照されるオブジェクトの一部となる型への参照を含む構造体または共用体の型は、コンパイルされるソースの式より先に宣言しなければいけません。
この制限事項を遵守するには、コンパイルされるソースの式で参照されるオブジェクトの型を参照する型を含むプログラムの全ヘッダーファイルを取り込みます。-xalias_level=strict レベルで、コンパイラは、さまざまな C 言語基本型に関連するメモリー参照が相互に別名設定しないと仮定します。コンパイラは、char * を使用する参照がそのほかの型を別名設定できると仮定します。
std
-xalias_level=std オプションを使用する場合、コンパイラは、型とタグが別名に対し同一でなくてはならないが、char * を使用する参照がそのほかの型を別名設定できると仮定します。この規則は、1999 ISO C 規格に記載されているポインタの参照解除についての制限事項と同じです。この規則を正しく使用するプログラムは移植性が非常に高く、最適化によって良好なパフォーマンスが得られるはずです。
strong
-xalias_level=strong オプションを使用する場合、std レベルと同じ規則が適用されますが、それに加えて、コンパイラは、型 char * のポインタを使用する場合にかぎり、型 char のオブジェクトにアクセスできると仮定します。また、コンパイラは、内部ポインタが存在しないと仮定します。内部ポインタは、struct のメンバーをポイントするポインタとして定義されます。

B.2.84 -xanalyze={code|%none}

(廃止) このオプションは、将来のリリースで削除される予定です。代わりに -xprevise を使用してください。

ソースコードの静的分析を生成します。Oracle Solaris Studio コードアナライザを使用して表示できます。

—xanalyze=code を指定してコンパイルし、別の手順でリンクするときは、リンク手順でも —xanalyze=code を含めてください。

デフォルトは —xanalyze=%none です。

Linux では、-xanalyze=code-xannotate とともに指定する必要があります。

詳細は、Oracle Solaris Studio コードアナライザのドキュメントを参照してください。

B.2.85 –xannotate[=yes|no]

最適化ツールおよび可観測性ツール binopt(1)、 code-analyzer(1)、discover(1)、collect (1)、および uncover(1) によってあとで使用できるバイナリを作成します。

Oracle Solaris でのデフォルトは -xannotate=yes です。Linux でのデフォルトは -xannotate=no です。値なしで -xannotate を指定することは、-xannotate=yes と同義です。

最適化および監視ツールを最適に使用するためには、コンパイル時とリンク時の両方で -xannotate=yes が有効である必要があります。最適化および監視ツールを使用しないときは、-xannotate=no を指定してコンパイルおよびリンクすると、バイナリとライブラリが若干小さくなります。

B.2.86 –xarch=isa

対象となる命令セットアーキテクチャー (ISA) を指定します。

このオプションは、コンパイラが生成するコードを、指定した命令セットアーキテクチャーの命令だけに制限します。このオプションは、すべてのターゲットを対象とするような命令としての使用は保証しません。ただし、このオプションを使用するとバイナリプログラムの移植性に影響を与える可能性があります。


注 -  意図するメモリーモデルとして LP64 (64 ビット) または ILP32 (32 ビット) を指定するには、それぞれ –m64 または –m32 オプションを使用してください。次に示すように以前のリリースとの互換性を保つ場合を除いて、–xarch オプションでメモリーモデルを指定できなくなりました。

別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xarch の値を指定してください。

_asm 文を指定するときや、アーキテクチャー固有の命令を使用する .il インラインテンプレートファイルを使ってコンパイルするときは、コンパイルエラーを避けるために適切な -xarch 値を指定することが必要な場合があります。

B.2.86.1 SPARC および x86 用の -xarch フラグ

次の表は、SPARC プラットフォームと x86 プラットフォームの両方に共通する -xarch キーワードの一覧です。

表 B-14  SPARC および x86 プラットフォームに共通のフラグ
フラグ
意味
generic
ほとんどのプロセッサに共通の命令セットを使用します。これはデフォルト値です。
generic64
ほとんどの 64 ビットプラットフォームで良好なパフォーマンスを得られるようにコンパイルします。このオプションは –m64 –xarch=generic に相当し、以前のリリースとの互換性のために提供されています。
native
このシステムで良好なパフォーマンスを得られるようにコンパイルします。現在コンパイルしているシステムプロセッサにもっとも適した設定を選択します。
native64
このシステムで良好なパフォーマンスを得られるようにコンパイルします。このオプションは、–m64 –xarch=native に相当し、以前のリリースとの互換性のために用意されています。

B.2.86.2 SPARC での -xarch のフラグ

次の表は、SPARC プラットフォームでの -xarch キーワードの説明です。

表 B-15  SPARC プラットフォーム用の -xarch フラグ
フラグ
意味
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 と組み合わせて使用し、ある程度の最適化レベルを指定することで、コンパイラが自動的に積和命令の使用を試みるようにする必要があります。
sparcace
sparcace バージョンの 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 拡張機能、および ACE 浮動小数点用の SPARC64 X 拡張機能からの命令を使用できるようにします。
sparcaceplus
sparcaceplus バージョンの 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 拡張機能、SPARCACE 浮動小数点用の SPARC64 X 拡張機能、および SPARCACE 浮動小数点用の SPARC64 X+ 拡張機能からの命令を使用できるようにします。
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 拡張機能からの命令を使用できるようにします。
sparc4
SPARC4 バージョンの SPARC-V9 ISA 用にコンパイルします。コンパイラが SPARC-V9 命令セットからの命令、さらに拡張機能 (VIS 1.0 を含む)、UltraSPARC-III 拡張機能 (VIS 2.0 を含む)、浮動小数点積和演算 (FMA) 命令、VIS 3.0、および SPARC4 命令を使用できるようになります。
sparc4b
SPARC4B バージョンの SPARC-V9 ISA 用にコンパイルします。コンパイラが、SPARC-V9 命令セットからの命令に加えて、VIS 1.0 を含む UltraSPARC 拡張機能、VIS 2.0 を含む UltraSPARC-III 拡張機能、浮動小数点の積和演算用の SPARC64 VI 拡張機能、整数の積和演算用の SPARC64 VII 拡張機能からの命令、および SPARC T4 拡張機能からの PAUSE および CBCOND 命令を使用できるようにします。
sparc4c
SPARC4C バージョンの SPARC-V9 ISA 用にコンパイルします。コンパイラが、SPARC-V9 命令セットからの命令に加えて、VIS 1.0 を含む UltraSPARC 拡張機能、VIS 2.0 を含む UltraSPARC-III 拡張機能、浮動小数点の積和演算用の SPARC64 VI 拡張機能、整数の積和演算用の SPARC64 VII 拡張機能、VIS 3.0 の VIS3B サブセットと呼ばれる SPARC T3 拡張機能のサブセットからの命令、および SPARC T4 拡張機能からの PAUSE および CBCOND 命令を使用できるようにします。
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) 浮動小数点命令は、これらの命令セットアーキテクチャーのいずれにも実装されないため、コンパイラは、そのコンパイラが生成したコードではそれらの命令を使用しません。

B.2.86.3 x86 での -xarch のフラグ

次の表に、x86 プラットフォームでの -xarch フラグを示します。

表 B-16  x86 での -xarch のフラグ
フラグ
意味
amd64
(Solaris のみ) –m64 –xarch=sse2 と同義です。64 ビットメモリーモデルを得るために –xarch=amd64 を使用する古いメイクファイルとスクリプトでは、–m64 だけを使用すれば十分です。
amd64a
(Solaris のみ) –m64 –xarch=sse2a と同義です。
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 命令セットに追加します。
sse3a
AMD 拡張命令 (3DNow! など) を SSE3 命令セットに追加します。
ssse3
SSSE3 命令セットで、pentium_pro、SSE、SSE2、および SSE3 の各命令セットを補足します。
sse4_1
SSE4.1 命令セットで、pentium_pro、SSE、SSE2、SSE3、および SSSE3 の各命令セットを補足します。
sse4_2
SSE4.2 命令セットで、pentium_pro、SSE、SSE2、SSE3、SSSE3、および SSE4.1 の各命令セットを補足します。
amdsse4a
AMD SSE4a 命令セットを使用します。
aes
Intel Advanced Encryption Standard 命令セットを使用します。
avx
Intel Advanced Vector Extensions 命令セットを使用します。
avx_i
RDRND、FSGSBASE、および F16C 命令セットとともに Intel Advanced Vector Extensions 命令セットを使用します。
avx2
Intel Advanced Vector Extensions 2 命令セットを使用します。

プログラムのいずれかの部分が x86 プラットフォーム上で —m64 でコンパイルまたはリンクされる場合、プログラムのすべての部分もこれらのいずれかのオプションでコンパイルされる必要があります。各種 Intel 命令セットアーキテクチャー (SSE、SSE2、SSE3、SSSE3 など) の詳細は、http://www.intel.com にある Intel-64 および IA-32 の『Intel Architecture Software Developer's Manual』を参照してください。

x86 の特記事項および バイナリの互換性の妥当性検査も参照してください。

B.2.86.4 相互の関連性

このオプションは単体でも使用できますが、-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

B.2.86.5 警告

このオプションを最適化と併せて使用する場合、適切なアーキテクチャーを選択すると、そのアーキテクチャー上での実行パフォーマンスを向上させることができます。ただし、適切な選択をしなかった場合、パフォーマンスが著しく低下するか、あるいは、作成されたバイナリプログラムが目的のターゲットプラットフォーム上で実行できない可能性があります。

別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xarch の値を指定してください。

B.2.87 -xautopar


注 -  このオプションは OpenMP の並列化命令を有効にしません。

ループの自動並列化を有効にします。依存性の解析 (ループの繰り返し内部でのデータ依存性の解析) およびループ再構成を実行します。最適化が -xO3 以上でない場合、最適化は -xO3 に引き上げられ、警告が出されます。

独自のスレッド管理を行なっている場合には、-xautopar を使用しないでください。

より高速な実行を実現するため、このオプションには、複数のハードウェアスレッドがあるシステムが必要です。使用するスレッドの数を指定するには、OMP_NUM_THREADS または PARALLEL 環境変数を使用します。これらの環境変数とそのデフォルト値については、『OpenMP API ユーザーズガイド』を参照してください。

最高のパフォーマンスを得るため、並列領域の実行に使用するスレッドの数が、マシン上で使用できるハードウェアスレッド (仮想プロセッサ) の数を超えないようにしてください。Oracle Solaris システムでは、psrinfo (1M) コマンドを使用すると、この数を特定できます。Linux システムでは、ファイル /proc/cpuinfo を調べることでこの数を特定できます。

-xautopar を使用してコンパイルとリンクを一度に実行する場合、リンクには自動的にマイクロタスキングライブラリ (libmtsk.so) およびスレッドに対して安全な C 実行時ライブラリが含まれます。-xautopar を使用して別々にコンパイルし、リンクする場合、-xautopar でリンクする必要があります。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

B.2.88 -xbinopt={prepare|off}

(SPARC) このオプションは廃止されており、コンパイラの将来のリリースで削除される予定です。-xannotate[=yes|no]を参照してください。

コンパイラに あとで最適化、変換、および分析するためにバイナリを準備するように指示します。このオプションは、実行可能ファイルまたは共有オブジェクトの構築に使用できます。このオプションを有効にするには、最適化レベル -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 です。

詳細は、binopt(1) のマニュアルページを参照してください。

B.2.89 -xbuiltin[=(%all|%default|%none)]

標準ライブラリ関数を呼び出すコードの最適化を改善するには、-xbuiltin オプションを使用します。多くの標準ライブラリ関数 (math.hstdio.h で定義されたものなど) は、さまざまなプログラムで一般的に使用されます。-xbuiltin オプションは、パフォーマンスに役立つ場合、コンパイラが組み込み関数やインラインシステム関数を置き換えることを許可します。 コンパイラが実際に置換を行う関数を判断するために、オブジェクトファイル内のコンパイラコメントを読み取る方法については、er_src(1) のマニュアルページを参照してください。

これらの置換によって、errno の設定の信頼性が失われる場合があります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。errno の値の保持も参照してください。

-xbuiltin=%default は、errno を設定しない関数のみをインライン化します。errno の値はどの最適化レベルでも常に正確であり、高い信頼度でチェックできます。-xbuiltin=%default-xO3 以下の場合、コンパイラはどの呼び出しをインライン化すると役立つかを判断し、ほかのものはインライン化しません。-xbuiltin=%none オプションは、ライブラリ関数のすべての置換を無効にします。

-xbuiltin を指定しない場合、デフォルトは、最適化レベル -xO1 以上でコンパイルするときは -xbuiltin=%default -xO0 のときは -xbuiltin=%none です。引数なしで -xbuiltin を指定する場合、デフォルトは -xbuiltin=%all で、コンパイラはより積極的に組み込み関数を置き換えたり、標準ライブラリ関数をインライン化したりします。

-fast を指定してコンパイルする場合は、-xbuiltin%all になります。


注 -  -xbuiltin は、システムヘッダーファイルで定義された大域関数のみをインライン化し、ユーザーが定義した静的関数はインライン化しません。

B.2.90 -xCC

-std=c89 および -xCC を指定した場合は、コンパイラで C++ 形式のコメントが認識されます。このオプションを使用すると、// を使用してコメントの始まりを示すことができます。

B.2.91 -xc99[=o]

-xc99 オプションは、C99 規格 (『Programming Language - C (ISO/IEC 9899:1999)』) からの実装機能に対するコンパイラの認識状況を制御します。

次の表に、o の許容値の一覧を示します。複数の値はコンマで区切ることができます。

表 B-17  -xc99 のフラグ
フラグ
意味
lib
1990 および 1999 C 規格の両方にあるルーチンの、1999 C 標準ライブラリの意味を有効にします。no_lib はこれらの意味の認識を無効にします。
all
サポートされている C99 言語機能に認識可能にして、1990 C 規格と 1999 C 規格の両方にあるルーチンの 1999 C 標準ライブラリ意味処理を有効にします。
none
サポートされている C99 言語機能に認識不可にして、1990 C 規格と 1999 C 規格の両方にあるルーチンの 1999 C 標準ライブラリ意味処理を無効にします。

-xc99 を指定しない場合は、コンパイラではデフォルトで -xc99=all,no_lib が設定されます。値を指定しないで -xc99 を指定すると、オプションは -xc99=all に設定されます。

-std または -xlang フラグが指定されている場合、-xc99 フラグは使用できません。

B.2.92 -xcache[=c]

オプティマイザ用のキャッシュ特性を定義します。この定義によって、特定のキャッシュが使用されるわけではありません。


注 -  このオプションは単独で指定できますが、–xtarget オプションのマクロ展開の一部です。–xtarget オプションによって指定された値を変更するのがな目的です。

オプションのプロパティー [/ti ] は、キャッシュを共有できるスレッド数を設定します。t の値を指定しない場合のデフォルトは 1 です。

c には次のいずれかを指定します。

  • generic

  • native

  • s1/l1/a1[/t1]

  • s1/l1/a1[/t1]:s2/l2/a2[/t2]

  • s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]

slat の各特性の定義は次のとおりです。

si

レベル i のデータキャッシュのサイズ (キロバイト単位)

li

レベル i のデータキャッシュのラインサイズ (バイト単位)

ai

レベル i のデータキャッシュの結合特性

ti

レベル i でキャッシュを共有するハードウェアスレッドの数

次に、-xcache の値を示します。

表 B-18  -xcache のフラグ
フラグ
意味
generic
これはデフォルト値です。コンパイラに対して、ほとんどの x86 および SPARC プロセッサで良好なパフォーマンスが得られ、それらのすべてでパフォーマンスが大きく低下しないような、キャッシュプロパティーを使用するように指示します。
これらの最高のタイミング特性は、新しいリリースごとに、必要に応じて調整されます。
native
ホスト環境に対して最適化されたパラメータを設定します。
s1/l1/a1[/t1]
レベル 1 のキャッシュ特性を定義します。
s1/l1/a1[/t1]:s2/l2/a2[/t2]
レベル 1 と 2 のキャッシュ特性を定義します。
s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
レベル 1、2、3 のキャッシュ特性を定義します。

例: -xcache=16/32/4:1024/32/1 では、次の内容を指定します。

  • レベル 1 のキャッシュ:

    • 16K バイト

    • ラインサイズ 32 バイト

    • 4 ウェイアソシアティブ

  • レベル 2 のキャッシュ:

    • 1024 バイト

    • ラインサイズ 32 バイト

    • ダイレクトマッピングの結合規則

B.2.93 –xcg[89|92]

(SPARC) 廃止。このオプションは使わないでください。このオプションでコンパイルすると、現在の SPARC プラットフォームでの実行速度が遅いコードが生成されます。代わりに -O を使用して、-xarch-xchip、および -xcache のコンパイラデフォルトを利用します。

B.2.94 -xchar[=o]

オプションこのオプションは、char 型が符号なしで定義されているシステムからのコードの移行を簡単にするためだけに提供されています。そのようなシステムからの移植以外では、このオプションは使用しないでください。char の符号に依存するコードだけは、signed または unsigned を明示的に指定するように書き直す必要があります。

次の表に、o の許容値の一覧を示します。

表 B-19  -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 を使用しないでください。Oracle Solaris Studio のすべてのターゲットプラットフォームの ABI は、型 charsigned として指定し、システムライブラリはそれに応じて動作します。char を符号なしにする影響は、システムライブラリで十分にテストされていませんでした。このオプションを使用する代わりに、char 型の符号の有無に依存しないようにコードを変更してください。型 char の符号は、コンパイラやオペレーティングシステムによって異なります。

B.2.95 -xchar_byte_order[=o]

複数文字定数の文字を指定されたバイト順序で配置することにより、整定数を生成します。o には、次のいずれかの値を使用します。

  • low: 複数文字定数の文字を低いバイトから順に配置します。

  • high: 複数文字定数の文字を高いバイトから順に配置します。

  • default: 複数文字定数の文字を、コンパイルモード (-X v) で決定された順に配置します。詳細は、文字定数および -X[c|a|t|s]を参照してください。

B.2.96 -xcheck[=o[,o]]

スタックオーバーフローに関する実行時検査を追加し、局所変数を初期化します。

次の表に、o の値の一覧を示します。

表 B-20  -xcheck のフラグ
フラグ
意味
%none
-xcheck のチェックを実行しません。
%all
-xcheck のチェックをすべて実行します。
stkovf[action]
実行時にスタックオーバーフローエラーを検出するためのコードを生成します。オプションで、スタックオーバーフローエラーが検出されたときに行うアクションを指定します。
スタックオーバーフローエラーは、スレッドのスタックポインタがスレッドに割り当てられているスタック境界を越えた位置に設定されると発生します。新しいスタックアドレスの先頭が書き込み可能である場合は、エラーが検出されないことがあります。
エラーの直接の結果としてメモリーアクセス違反が発生した場合、スタックオーバーフローエラーが検出され、関連付けられているシグナル (通常は SIGSEGV) が発行されます。このように発生したシグナルは、そのエラーに関連付けられていると言います。
-xcheck=stkovf[action] を指定すると、コンパイラはシステムのページサイズより大きいスタックフレームが使用される場合にスタックオーバーフローエラーを検出するためのコードを生成します。このコードには、無効であるがマップされている可能性があるアドレスにスタックポインタを設定する代わりに、メモリーアクセス違反を強制的に発生させるためのライブラリ呼び出しが含まれています (_stack_grow(3C) を参照)。
オプションの action を指定する場合、これは :detect または :diagnose のいずれかでなければなりません。
action:detect の場合は、そのエラーに通常関連付けられているシグナルハンドラを実行することによって、検出されたスタックオーバーフローエラーが処理されます。
action:diagnose の場合は、関連付けられているシグナルを捕捉し、stack_violation(3C) を呼び出してエラーを診断することによって、検出されたスタックオーバーフローエラーが処理されます。これはactionを指定しない場合のデフォルト動作です。
メモリーアクセス違反がスタックオーバーフローエラーと診断されると、次のメッセージが標準エラー出力に出力されます。
ERROR: stack overflow detected: pc=<inst_addr>, sp=<sp_addr>
ここで、<inst_addr> はエラーが検出された命令のアドレスであり、<sp_addr> はエラーが検出されたときのスタックポインタの値です。スタックオーバーフローを検査して前述のメッセージを出力した (該当する場合) あとに、そのエラーに通常関連付けられているシグナルハンドラに制御が渡されます。
-xcheck=stkovf:detect は、システムのページサイズより大きいスタックフレームを持つルーチンに入るときのスタック境界の検査を追加します (_stack_grow(3C) を参照)。追加の境界の検査に関連するコストは、ほとんどのアプリケーションで無視できる程度です。
-xcheck=stkovf:diagnoseはスレッドを作成するためのシステムコールを追加します (sigaltstack(2) を参照)。追加のシステムコールに関連するコストは、アプリケーションが新しいスレッドを作成および破棄する頻度によって異なります。
-xcheck=stkovf は Oracle Solaris でのみサポートされています。Linux の C ランタイムライブラリでは、スタックオーバーフロー検出はサポートされていません。
no%stkovf
スタックオーバーフロー検査を無効にします。
init_local
局所変数を初期化します。
no%init_local
ローカル変数を初期化しません。

-xcheck を指定しない場合は、コンパイラではデフォルトで -xcheck=%none が指定されます。引数を指定せずに xcheck を使用した場合は、コンパイラではデフォルトで -xcheck=%all が指定されます。

-xcheck オプションは、コマンド行で累積されません。コンパイラは、コマンドで最後に指定したものに従ってフラグを設定します。したがってスタックオーバーフロー診断と局所変数の初期化の両方を有効にするには、次のオプションを使用します。

cc -xcheck=stkovf:diagnose,init_local ...

B.2.96.1 -xcheck=init_local の初期化値

-xcheck=init_local では、次の表に示すように、コンパイラは初期化子なしで宣言されたローカル変数を事前定義された値に初期化します。(これらの値は変更される可能性があるため、信頼しないでください)。

基本型
表 B-21  基本型の 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 バイト (-m32): 0x80000009ff800005 / 0x0000ffff
x86: 16 バイト (-m64): 0x80000009ff800005 / 0x0000ffff00000000
double _Complex
0xfff00013ff800015 / 0xfff00017ff800019
long double _Complex
SPARC: 0xffff001bff80001d / 0xfff0001fff800021 / 0xffff0023ff800025 / 0xfff00027ff800029
x86: 12 バイト (-m32): 0x7fffb01bff80001d / 0x00007fff / 0x7fffb023ff800025 / 0x00007fff
x86: 16 バイト (-m64): 0x00007fff00080000 / 0x1b1d1f2100000000 / 0x00007fff00080000 / 0x2927252300000000

計算された goto で使用するために宣言されたローカル変数 (単純な void * ポインタ) は、表中のポインタの説明に従って初期化されます。

次の局所変数型は初期化されません: 修飾された constregister、計算された goto のラベル番号、ローカルラベル。

構造体、共用体、配列の初期化

初期化されていない参照が可視エラーを生成する可能性を最大化するために、struct 内の基本型であるフィールドは、表で説明されているとおりに初期化されます。union 内で最初に宣言された pointer または float フィールドも同様です。

配列要素も表で説明されているとおりに初期化されます。

入れ子の structunion、および配列フィールドは、ビットフィールドを含む structpointer または float フィールドのない union、または完全に初期化できない型の配列を除いて、表で説明されているとおりに初期化されます。これらの例外は、型 double のローカル変数に使用される値で初期化されます。

B.2.97 -xchip[= c]

オプティマイザ用のプロセッサを指定します。

このオプションは単独でも使用できますが、-xtarget オプションの展開の一部です。その主な使用方法は、-xtarget オプションで提供される値をオーバーライドすることです。

このオプションは、処理対象となるプロセッサを指定することによって、タイミング特性を指定します。いくつかの影響があります。

  • 命令の順序 (スケジューリング)

  • コンパイラが分岐を使用する方法

  • 意味が同じもので代用できる場合に使用する命令

次の表は、SPARC プラットフォーム向けの c-xchip 値の一覧です。

表 B-22  SPARC -xchip のフラグ
フラグ
意味
generic
ほとんどの SPARC で良好なパフォーマンスとなるタイミング特性を使用します。
これはデフォルト値です。コンパイラに対して、ほとんどのプロセッサで良好なパフォーマンスが得られ、それらのすべてでパフォーマンスが大きく低下しないような、最適なタイミングプロパティーを使用するように指示します。
native
ホスト環境で最適なパフォーマンスになるようにパラメータを設定します。
sparc64vi
SPARC64 VI プロセッサ用に最適化します。
sparc64vii
SPARC64 VII プロセッサ用に最適化します。
sparc64viiplus
SPARC64 VII+ プロセッサ用に最適化します。
sparc64x
SPARC64 X プロセッサ用に最適化します。
sparc64xplus
SPARC64 X+ プロセッサ用に最適化します。
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+ プロセッサのタイミング特性を使用します。
T3
SPARC T3 プロセッサのタイミングプロパティーを使用します。
T4
SPARC T4 プロセッサのタイミングプロパティーを使用します。
T5
SPARC T5 プロセッサのタイミングプロパティーを使用します。
M5
SPARC M5 プロセッサのタイミングプロパティーを使用します。

注 -  次の SPARC の -xchip の値は廃止されており、将来のリリースで削除される可能性があります: ultraultra2ultra2eultra2iultra3ultra3cuultra3iultra4、および ultra4plus

次の表は、x86 プラットフォーム向けの -xchip の値をまとめています。

表 B-23  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 プロセッサ用に最適化します。
sandybridge
Intel Sandy Bridge プロセッサ
ivybridge
Intel Ivy Bridge プロセッサ
haswell
Intel Haswell プロセッサ
westmere
Intel Westmere プロセッサ

B.2.98 -xcode[=v]

(SPARC) コードアドレス空間を指定します。


注 -  -xcode=pic13 または -xcode=pic32 を指定することで、共有オブジェクトを構築します。-m64 -xcode=abs64 でも作業可能な共有オブジェクトを構築できますが、それらは効率的ではありません。-m64, -xcode=abs32 または -m64, -xcode=abs44 を指定して構築された共有オブジェクトは動作しません。

次の表に、v の値の一覧を示します。

表 B-24  -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 のデフォルト値である abs44abs32 を使用できません。-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 を使用してセクションヘッダー sh_name: .got を探すことによって、大域オフセットテーブル (GOT) のサイズを確認します。sh_size 値が GOT のサイズです。GOT が 8,192 バイトに満たない場合は、-xcode=pic13 を指定します。そうでない場合は、-xcode=pic32 を指定します。詳細は、elfdump(1) のマニュアルページを参照してください。

-xcode どのように使用するべきかを決定するには、次のガイドラインに従います。

  • 実行可能ファイルを構築する場合は、-xcode=pic13-xcode=pic32 のどちらも使用しない。

  • 実行可能ファイルにリンクするためだけのアーカイブライブラリを構築する場合は、-xcode=pic13-xcode=pic32 のどちらも使用しない。

  • 共有ライブラリを構築する場合は、-xcode=pic13 から始めてし、GOT のサイズが 8,192 バイトを超えたら、-xcode=pic32 を使用する。

  • 共有ライブラリにリンクするためのアーカイブライブラリを構築する場合は、-xcode=pic32 を使用する。

B.2.99 -xcrossfile

廃止。使用しないでください。代わりに –xipo を使用します。—xcrossfile—xipo=1 の別名です。

B.2.100 -xcsi

C コンパイラが ISO C ソース文字コードの要件に準拠しないロケールで記述されたソースコードを受け付けられるようにします。これらのロケールには、ja_JP.PCK が含まれます。

コンパイラの翻訳段階でこのようなロケールの処理が必要になると、コンパイルの時間が非常に長くなることがあります。そのため、このオプションを使用するのは、前述のロケールのソース文字を含むソースファイルをコンパイルする場合に限定すべきです。

コンパイラは、-xcsi が発行されないかぎり、ISO C ソース文字コードの要件に準拠しないロケールで記述されたソースコードを認識しません。

B.2.101 -xdebugformat=[stabs|dwarf]

DWARF 形式のデバッグ情報を読み取るソフトウェアを保守している場合は、-xdebugformat=dwarf を指定します。このオプションにより、コンパイラは DWARF 標準形式を使用してデバッグ情報を生成します。これがデフォルトです。

表 B-25  -xdebugformat のフラグ
意味
stabs
-xdebugformat=stabs は、STABS 標準形式を使用してデバッグ情報を生成します。
dwarf
-xdebugformat=dwarf は、DWARF 標準形式を使用してデバッグ情報を生成します (デフォルト)。

-xdebugformat を指定しない場合は、コンパイラでは -xdebugformat=dwarf が指定されます。このオプションには引数が必要です。

このオプションは、-g オプションによって記録されるデータの形式に影響します。-g を指定しなくても、一部のデバッグ情報が記録されますが、その情報の形式もこのオプションによって制御されます。したがって、-g を使用しなくても、-xdebugformat は効果があります。

dbx とパフォーマンスアナライザソフトウェアは、STABS 形式と DWARF 形式を両方とも理解するので、このオプションを使用しても、いずれかのツールの機能に対する影響はありません。

詳細は、dumpstabs(1) および dwarfdump(1) のマニュアルページを参照してください。

B.2.102 -xdebuginfo=a[,a...]

デバッグおよび可観測性情報の出力量を制御します。

タグタイプという用語は、タグ付きの型 (structunionenum、および class) を意味します。

次のリストには、サブオプション a に指定できる値が含まれています。サブオプションに接頭辞no%を適用すると、そのサブオプションが無効になります。デフォルトは -xdebuginfo=%none です。サブオプションなしで -xdebuginfo を指定することは禁止されています。

%none

デバッグ情報は生成されません。これはデフォルト値です。

[no%]line

行番号およびファイル情報を出力します。

[no%]param

パラメータの場所の一覧情報を出力します。スカラー値 (たとえば、intchar *) の完全指定の型情報および型名を出力しますが、タグタイプの完全な定義は出力されません。

[no%]variable

構文的にグローバル変数およびローカル変数である変数の場所の一覧情報を出力します。これには、ファイルおよび関数の static は含まれますが、クラスの static および extern は含まれません。スカラー値 (intchar * など) の完全指定の型情報および型名を出力しますが、タグタイプの完全な定義は出力されません。

[no%]decl

関数と変数の宣言、メンバー関数、およびクラス宣言の静的なデータメンバーを出力します。

[no%]tagtype

param および variable データセットから参照されるタグタイプの完全指定の型情報、およびテンプレートの定義を出力します。

[no%]macro

マクロ情報を出力します。

[no%]codetag

DWARF コードタグ (Stabs N_PATCH とも呼ばれます) を出力します。これは、RTC および discover によって使用されるビットフィールド、構造体のコピー、およびスピルに関する情報です。

[no%]hwcpro

ハードウェアカウンタプロファイルに関する重要な情報を生成します。この情報には、ldst_mapld/st 命令と参照されているシンボルテーブルのエントリのマッピング、およびバックトラックが分岐先を超えていないことを確認するため使用される分岐先アドレスの branch_target テーブルが含まれています。詳細は、-xhwcprof を参照してください。


注 -  ldst_map では、タグタイプ情報が存在している必要があります。この要件が満たされていない場合は、ドライバがエラーを発行します。

次のマクロは、-xdebuginfo およびほかのオプションの組み合わせに次のように展開されます。

-g = -g2

-gnone =
        -xdebuginfo=%none
        -xglobalize=no
        -xpatchpadding=fix
        -xkeep_unref=no%funcs,no%vars

-g1 =
        -xdebuginfo=line,param,codetag
        -xglobalize=no
        -xpatchpadding=fix
        -xkeep_unref=no%funcs,no%vars

-g2 =
        -xdebuginfo=line,param,decl,variable,tagtype,codetag
        -xglobalize=yes
        -xpatchpadding=fix
        -xkeep_unref=funcs,vars

-g3 =

        -xdebuginfo=line,param,decl,variable,tagtype,codetag,macro
        -xglobalize=yes
        -xpatchpadding=fix
        -xkeep_unref=funcs,vars

B.2.103 -xdepend=[yes|no]

ループの繰り返し内部でのデータ依存関係を解析し、ループの交換、ループの融合、スカラー置換など、ループの再構成を行います。

最適化レベルが -xO3 かそれ以上に設定されている場合はすべて、-xdepend のデフォルトは -xdepend=on です。-xdepend の明示的な設定を指定すると、デフォルト設定はオーバーライドされます。

引数なしで -xdepend を指定すると、-xdepend=yes と同等であることを意味します。

依存性の解析はシングルプロセッサシステムで役立つことがあります。ただし、シングルプロセッサシステムで -xdepend を使用する場合は、-xautopar も指定するべきではありません。-xdepend 最適化は、マルチプロセッサシステムのために行われるためです。

B.2.104 -xdryrun

このオプションは -### のマクロです。

B.2.105 -xdumpmacros[=value[,value...]]

プログラム内でマクロがどのように動作しているかを確認するときは、このオプションを使用します。このオプションは、定義済みマクロ、解除済みマクロ、実際の使用状況といった情報を提供します。マクロの処理順序に基づいて、標準エラー (stderr) に出力します。-xdumpmacros オプションは、ファイルの終わりまで、または dumpmacros プラグマまたは end_dumpmacros プラグマによって上書きされるまで有効です。dumpmacrosを参照してください。

次の表に、value の有効な引数の一覧を示します。接頭辞 no% は関連付けられた値を無効にします。

表 B-26  -xdumpmacros の値
意味
[no%]defs
すべての定義済みマクロを出力します。
[no%]undefs
すべての解除済みマクロを出力します。
[no%]use
使用されているマクロの情報を出力します
[no%]loc
defsundefsuse の位置 (パス名と行番号) も出力します。
[no%]conds
条件付き指令で使用されたマクロの使用情報を出力します。
[no%]sys
システムヘッダーファイル内のマクロについて、すべての定義済みマクロ、解除済みマクロ、使用状況を出力します。
%all
オプションを-xdumpmacros=defs,undefs,use,loc,conds,sys に設定します。この引数は、[no%] 形式の引数と併用すると効果的です。たとえば -xdumpmacros=%all,no%sys は、出力からシステムヘッダーマクロを除外しますが、そのほかのマクロに関する情報は依然として出力します。
%none
あらゆるマクロ情報を出力しません。

オプションの値は累積されるので、-xdumpmacros=sys -xdumpmacros=undefs を指定することは、-xdumpmacros=undefs,sys と同じ効果があります。


注 -  サブオプション loccondssys は、オプション defsundefsuse の修飾子です。locconds、および sys は、単独では効果はありません。たとえば -xdumpmacros=loc,conds,sys は、まったく効果を持ちません。

引数なしで -xdumpmacros を指定するときのデフォルトは、-xdumpmacros=defs,undefs,sys です。-xdumpmacros を指定しないときのデフォルトは、-xdumpmacros=%none です。

-xdumpmacros=use,no%loc オプションを使用すると、使用した各マクロの名前が一度だけ出力されます。より詳しい情報が必要であれば、-xdumpmacros=use,loc オプションを使用します。マクロを使用するたびに、そのマクロの名前と位置が印刷されます。

次のファイル t.c を考慮します。

example% cat t.c
#ifdef FOO
#undef FOO
#define COMPUTE(a, b) a+b
#else
#define COMPUTE(a,b) a-b
#endif
int n = COMPUTE(5,2);
int j = COMPUTE(7,1);
#if COMPUTE(8,3) + NN + MM
int k = 0;
#endif

次の例は、defsundefssys、および loc の引数に基づいた、ファイル t.c の出力を示しています。

example% cc -c -xdumpmacros -DFOO t.c
#define __SunOS_5_9 1
#define __SUNPRO_C 0x512
#define unix 1
#define sun 1
#define sparc 1
#define __sparc 1
#define __unix 1
#define __sun 1
#define __BUILTIN_VA_ARG_INCR 1
#define __SVR4 1
#define __SUNPRO_CC_COMPAT 5
#define __SUN_PREFETCH 1
#define FOO 1
#undef FOO
#define COMPUTE(a, b) a + b

example% cc -c -xdumpmacros=defs,undefs,loc -DFOO -UBAR t.c
command line: #define __SunOS_5_9 1
command line: #define __SUNPRO_C 0x512
command line: #define unix 1
command line: #define sun 1
command line: #define sparc 1
command line: #define __sparc 1
command line: #define __unix 1
command line: #define __sun 1
command line: #define __BUILTIN_VA_ARG_INCR 1
command line: #define __SVR4 1
command line: #define __SUN_PREFETCH 1
command line: #define FOO 1
command line: #undef BAR
t.c, line 2: #undef FOO
t.c, line 3: #define COMPUTE(a, b) a + b

次の例では、useloc、および conds の引数によって、マクロ動作がファイル t.c に出力されます。

example% cc -c -xdumpmacros=use t.c
used macro COMPUTE

example% cc -c -xdumpmacros=use,loc t.c
t.c, line 7: used macro COMPUTE
t.c, line 8: used macro COMPUTE

example% cc -c -xdumpmacros=use,conds t.c
used macro FOO
used macro COMPUTE
used macro NN
used macro MM

example% cc -c -xdumpmacros=use,conds,loc t.c
t.c, line 1: used macro FOO
t.c, line 7: used macro COMPUTE
t.c, line 8: used macro COMPUTE
t.c, line 9: used macro COMPUTE
t.c, line 9: used macro NN
t.c, line 9: used macro MM

次は、ファイル y.c の例です。

example% cat y.c
#define X 1
#define Y X
#define Z Y
int a = Z;

次の例は、y.c 内のマクロに基づく、-xdumpmacros=use,loc からの出力を示しています。

example% cc -c -xdumpmacros=use,loc y.c
y.c, line 4: used macro Z
y.c, line 4: used macro Y
y.c, line 4: used macro X

プラグマ dumpmacros/end_dumpmacros は、-xdumpmacros コマンド行オプションのスコープより優先されます。

B.2.106 -xe

ソースファイルに対して構文および意味検査を実行しますが、オブジェクトコードや実行可能コードは生成しません。

B.2.107 –xF[=v[,v...]]

リンカーによる関数と変数の最適な順序の並べ替えを有効にします。

このオプションは、コンパイラに対して、関数またはデータ変数を別々のセクションフラグメントに配置するように指示します。それによってリンカーは、リンカーの -M オプションで指定されたマップファイル内の指示を使用して、これらのセクションの順序を並べ替えてプログラムのパフォーマンスを最適化できます。この最適化は、ページフォルト時間がプログラム実行時間の多くの割合を占めているときにもっとも効果的です。

変数の並べ替えは、実行時のパフォーマンスに悪影響を及ぼす次のような問題の解決に役立ちます。

  • メモリー内で関係ない変数どうしが近接しているために生じる、キャッシュやページの競合

  • 関係のある変数がメモリー内で互いに近くにないことの結果として、不必要に大きな作業セットサイズ。

  • 使用していない weak 変数のコピーが有効なデータ密度を低下させた結果生じる、不必要に大きな作業セットサイズ

最適なパフォーマンスを得るために変数と関数の順序を並べ替えるには、次の処理が必要です。

  1. -xF によるコンパイルとリンク

  2. 関数またはデータのマップファイルの生成については、『Oracle Solaris Studio パフォーマンスアナライザ』および『Oracle Solaris リンカーとライブラリ』に記載された手順に従ってください。

  3. リンカーの -M オプションを使用して新しいマップファイルを再リンクします。

  4. アナライザで再実行して、パフォーマンスが向上したかどうかを検証します。

B.2.107.1 値

次の表に、v の値の一覧を示します。

表 B-27  –xF の値
意味
func
関数を個別のセクションにフラグメント化します。
gbldata
大域データ (外部リンケージを持つ変数) を個別のセクションにフラグメント化します。
lcldata
ローカルデータ (内部リンケージを持つ変数) を個別のセクションにフラグメント化します。
%all
関数、大域データ、局所データを細分化します。
%none
何も細分化しません。

サブオプションを無効にするには、(%all および %none を除いた) 値の前に no% を置きます。たとえば no%func などです。

-xF を指定しない場合のデフォルトは、-xF=%none です。引数を指定しないで -xF を指定した場合のデフォルトは、-xF=%none,func です。

-xF=lcldata を使用するとアドレス計算最適化が一部禁止されるので、このフラグは試験によって正しいと認められた場合にのみ使用してください。

analyzer(1)、および ld(1) のマニュアルページを参照してください。

B.2.108 -xglobalize[={yes|no}]

ファイルの静的変数のグローバル化を制御します (関数は制御しません)。

グローバル化は修正継続機能および内部手続きの最適化で必要となる手法であり、それによってファイルの静的シンボルがグローバルに拡張されます。同じ名前のシンボルを区別するために、名前に接頭辞が追加されます。

デフォルトは -xglobalize=no です。-xglobalize と指定することは -xglobalize=yes と指定することと同等です。

B.2.108.1 相互の関連性

-xpatchpadding を参照してください。

-xipo もグローバル化を要求し、-xglobalize をオーバーライドします。

B.2.109 -xhelp=flags

オンラインヘルプ情報を表示します。

-xhelp=flags は、コンパイラオプションのサマリーを表示します。

B.2.110 -xhwcprof

(SPARC) コンパイラのハードウェアカウンタによるプロファイリングのサポートを有効にします。

-xhwcprof を有効にすると、コンパイラは、プロファイル対象のロード命令およびストア命令と、それらが参照するデータ型および構造体メンバーをツールが関連付けるのに役立つ情報を、-g で生成されたシンボル情報と組み合わせて生成します。プロファイルデータを、命令領域ではなくターゲットのデータ領域に関連付けます。これにより、命令プロファイリングだけからは簡単には得られない、動作に対する洞察が提供されます。

指定した一連のオブジェクトファイルは、-xhwcprof を指定してコンパイルできます。ただし、-xhwcprof は、アプリケーション内のすべてのオブジェクトファイルに適用されたときに、もっとも役立ちます。アプリケーションのオブジェクトファイルに分散しているすべてのメモリー参照が洗い出され、相互に関連付けられます。

コンパイルとリンクを別々に行う場合は、-xhwcprof をリンク時にも使用してくだ さい。-xhwcprof への今後の拡張により、リンク時にこれを使用することが必要になる可能性があります。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

-xhwcprof=enable または -xhwcprof=disable のインスタンスは、同じコマンド行にある以前の -xhwcprof のインスタンスをすべてオーバーライドします。

-xhwcprof はデフォルトでは無効です。引数を指定せずに -xhwcprof と指定することは、-xhwcprof=enable と指定することと同等です。

-xhwcprof を使用する場合は最適化を有効にし、デバッグのデータ形式を DWARF (-xdebugformat=dwarf) に設定しておく必要があります (これは、現在の Oracle Solaris Studio コンパイラのデフォルトです)。同じコマンド行に -xhwcprof-xdebugformat=stabs を指定することはできません。

-xhwcprof-xdebuginfo を使用して必要最低限のデバッグ情報を自動的に有効にするため、-g は必要ありません。

-xhwcprof-g を組み合わせて使用すると、コンパイラに必要な一時ファイル記憶領域は、-xhwcprof-g を単独で指定することによって増える量の合計を超えて大きくなります。

-xhwcprof は、次のようにさまざまなよりプリミティブなオプションに展開されるマクロとして実装されます。

-xhwcprof
        -xdebuginfo=hwcprof,tagtype,line
-xhwcprof=enable
        -xdebuginfo=hwcprof,tagtype,line
-xhwcprof=disable
        -xdebuginfo=no%hwcprof,no%tagtype,no%line

次のコマンドは example.c をコンパイルし、ハードウェアカウンタによるプロファイリングのサポートを指定し、DWARF シンボルを使用してデータ型と構造体メンバーのシンボリック解析を指定します。

example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c

ハードウェアカウンタベースのプロファイリングの詳細は、『Oracle Solaris Studio パフォーマンスアナライザ』を参照してください。

B.2.111 -xinline=list

list for -xinline の書式を次に示します。[{%auto ,func_name,no%func_name }[,{%auto,func_name, no%func_name}]...]

-xinline は、オプションのリストで指定した関数だけのインライン化を試行します。このリストは、空か、func_nameno%func_name、または %auto のコンマ区切りのリストを含みます (func_name は関数名です)。-xinline は、–xO3 以上でのみ効果を持ちます。

表 B-28  -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= のみを指定することは、ソースファイル内のどのルーチンもインライン化されないことを示します。%auto を指定せずに func_name および no%func_name を指定した場合、コンパイラはリストで指定されたそれらの関数のみをインライン化しようとします。最適化レベルが -xO4 以上に設定された状態で、-xinline オプションの値リストで %auto が指定されている場合、コンパイラは no%func_name で明示的に除外されていないすべての関数をインライン化しようとします。

次のいずれかの条件に該当する場合、ルーチンはインライン化されません。警告は出力されませんので注意してください。

  • 最適化のレベルが -xO3 未満である。

  • ルーチンが見つからない。

  • iropt がルーチンのインライン化を実行できない。

  • ルーチンのソースが、コンパイル対象のファイル内にない (ただし、-xipo を参照)。

コマンド行で -xinline を複数指定した場合は、それらは累積されません。コマンド行の最後の -xinline が、コンパイラがインライン化しようとする関数を指定します。

-xldscope も参照してください。

B.2.112 –xinline_param=a[,a[,a]...]

このオプションは、コンパイラが関数呼び出しをインライン化するタイミングを判断するために使用するヒューリスティックを手動で変更するために使用します。

このオプションは -O3 以上でのみ有効となります。次のサブオプションは、自動インライン化がオンである場合に、-O4 以上でのみ有効となります。

次のサブオプションでは、n は正の整数である必要があります。a には次のいずれかを指定できます。

表 B-29  -xinline_param のサブオプション
サブオプション
意味
default
すべてのサブオプションの値にそのデフォルト値を設定します。
max_inst_hard[:n]
自動インライン化は、n疑似命令 (コンパイラの内部表現でカウントされます) より小さい関数のみをインライン化候補と見なします。
これより大きい関数は、インライン化の候補から常に除外されます。
max_inst_soft[:n]
インライン関数のサイズ制限に n 擬似命令 (コンパイラの内部表現でカウントされます) を設定します。
これより大きいサイズの関数はインライン化されることがあります。
max_inst_hard を指定する場合、max_inst_soft の値は max_inst_hard の値以下になるようにします (つまり、max_inst_soft <= max_inst_hard)。
通常、コンパイラの自動インライン化では、呼び出される関数のサイズが max_inst_soft の値より小さい呼び出しのみがインライン化されます。関数のサイズが max_inst_soft の値より大きいが max_inst_hard の値より小さい場合は、関数がインライン化されることがあります。この場合の例は、関数に渡されたパラメータが定数である場合です。
関数の特定の 1 つの呼び出しサイトをインライン化するために max_inst_hard または max_inst_soft の値を変更するかどうかを判断する場合は、-xinline_report=2 を使用して詳細なインライン化メッセージを出力し、そのインライン化メッセージの推奨に従います。
max_function_inst[:n]
自動インライン化によって、関数が最大 n 疑似命令 (コンパイラの内部表現でカウントされます) まで増えることを許可します。
max_growth[:n]
自動インライン化は、プログラムのサイズを最大 n% (サイズは疑似命令で計測されます) 増やすことを許可されます。
min_counter[:n]
関数を自動インライン化するかどうかを判断するために、プロファイリングフィードバック (-xprofile) によって計測される、呼び出しサイトの最小頻度カウンタ。
このオプションは、アプリケーションがプロファイリングフィードバック (-xprofile=use) を指定してコンパイルされている場合にのみ有効です。
level[:n]
このサブオプションは、自動インライン化を適用する度合いを制御するために使用します。-xinline_param=level の設定を高くすると、より多くの関数がインライン化されます。
n は 1、2、または 3 のいずれかである必要があります。
このオプションを指定しない場合、または :n を使用せずに指定した場合、n のデフォルト値は 2 です。
自動インライン化の level を指定します
level:1 基本的なインライン化 level:2 中程度のインライン化 (デフォルト) level:3 積極的なインライン化
この level によって、次のインライン化パラメータの組み合わせに指定される値が決定されます。
max_growth + max_function_inst + max_inst + max_inst_call
level = 1 の場合、すべてのパラメータはデフォルト値の半分になります。
level = 2 の場合、すべてのパラメータはデフォルト値になります。
level = 3 の場合、すべてのパラメータはデフォルト値の 2 倍になります。
max_recursive_depth[:n]
関数がそれ自体を直接または間接に呼び出している場合は、再帰呼び出しが発生していると言います。
このサブオプションは、再帰呼び出しを最大 n レベルまで自動的にインライン化することを許可します。
max_recursive_inst[:n]
自動再帰インライン化を実行することによって、再帰呼び出しの呼び出し元で増やすことができる疑似命令 (コンパイラの内部表現でカウントされます) の最大数を指定します。
max_recursive_inst および max_recursive_depth の間で相互作用が発生した場合、再帰関数呼び出しは、再帰呼び出しの max_recursive_depth の数まで、またはインライン化される関数のサイズが max_recursive_inst を超えるまでインライン化されます。これらの 2 つのパラメータの設定は、小さい再帰関数のインライン化の度合いを制御します。

-xinline_param=default を指定すると、コンパイラはサブオプションのすべての値にデフォルト値を設定します。

このオプションを指定しない場合、デフォルトは -xinline_param=default です。

値およびオプションのリストは、左から右に適用されます。このため、-xinline_param=max_inst_hard:30,..,max_inst_hard:50 と指定した場合は、値 max_inst_hard:50 がコンパイラに渡されます。

コマンド行に複数の -xinline_param オプションを指定した場合、サブオプションのリストは同様に左から右に適用されます。たとえば、次のように指定した場合は

 -xinline_param=max_inst_hard:50,min_counter:70 ...
   -xinline_param=max_growth:100,max_inst_hard:100

次の指定と同じになります。

-xinline_param=max_inst_hard:100,min_counter:70,max_growth:100

B.2.113 –xinline_report[=n]

このオプションは、コンパイラによる関数のインライン化に関する報告を生成し、標準出力に書き込みます。報告のタイプは n の値 (0、1、または 2) によって異なります。

0

レポートは生成されません。

1

インライン化パラメータのデフォルト値のサマリー報告が生成されます。

2

インライン化メッセージの詳細な報告が生成され、インライン化された呼び出しサイトとインライン化されなかった呼び出しサイト、およびインライン化されなかったことの簡潔な理由が示されます。この報告には、インライン化されなかった呼び出しサイトをインライン化するために使用できる -xinline_param の推奨値が含まれている場合があります。

-xinline_report を指定しない場合、n のデフォルト値は 0 です。-xinline_report を指定して =n を指定しない場合、デフォルト値は 1 です。

-xlinkopt が指定されている場合は、インライン化されなかった呼び出しサイトに関するインライン化メッセージが正確でないことがあります。

B.2.114 –xinstrument=[no%]datarace

スレッドアナライザで分析するためにプログラムをコンパイルして計測するには、このオプションを指定します。スレッドアナライザの詳細は、tha(1) のマニュアルページを参照してください。

そうすることで、パフォーマンスアナライザを使用して計測されたプログラムを collect –r races で実行し、データ競合の検出実験を行うことができます。計測機構の組み込まれたコードをスタンドアロンで実行した場合は、より遅く実行されます。

–xinstrument=no%datarace を指定して、スレッドアナライザ用のソースコードの準備をオフにすることができます。これはデフォルト値です。

–xinstrument= は引数付きで指定する必要があります。

コンパイルとリンクを別々に行う場合は、コンパイル時とリンク時の両方で –xinstrument=datarace を指定する必要があります。

このオプションは、プリプロセッサトークン __THA_NOTIFY を定義します。#ifdef __THA_NOTIFY を指定して、libtha(3) ルーチンへの呼び出しを保護できます。

このオプションにも、–g を設定します。

B.2.115 -xipo[=a]

a0 1、または 2 と置き換えます。引数なしの -xipo は、-xipo=1 と同義です。-xipo=0 はデフォルト設定で、-xipo を無効にします。-xipo=1 を指定した場合は、すべてのソースファイルでインライン化が実行されます。

-xipo=2 を指定した場合は、コンパイラは内部手続きの別名解析と、メモリーの割り当ておよび配置の最適化を実行し、キャッシュ性能を向上させます。

このコンパイラは、内部手続き解析コンポーネントを呼び出すことにより、プログラムの一部の最適化を実行します。このオプションを指定すると、リンク段階ですべてのオブジェクトファイルを介して最適化を実行し、最適化の対象をコンパイルコマンドのソースファイルだけに限定しません。ただし、-xipo によるプログラム全体の最適化には、アセンブリ (.s) ソースファイルは含まれません。

-xipo は、コンパイル時とリンク時の両方で指定する必要があります。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

-xipo オプションは、ファイルを介して最適化を実行する際に必要な情報を追加するため、非常に大きなオブジェクトファイルを生成します。ただし、この補足情報は最終的な実行可能バイナリファイルの一部にはなりません。実行可能プログラムのサイズが拡大するのは、最適化が追加実行されるためです。このコンパイル段階で作成されたオブジェクトファイルには、内部でコンパイルされた追加の分析情報が含まれているため、リンク段階でファイル相互の最適化を実行できます。

-xipo は、大きなマルチファイルアプリケーションをコンパイルおよびリンクする際に特に便利です。このフラグを指定してコンパイルされたオブジェクトファイルには、ソースプログラムファイルとコンパイル済みプログラムファイル間で内部手続き解析を有効にする解析情報が含まれています。

解析と最適化は、-xipo を指定してコンパイルされたオブジェクトファイルに限定され、オブジェクトファイルやライブラリまでは及びません。

-xipoは複数の段階にわかれているため、コンパイルとリンクを個別に実行する場合、各ステップで -xipo を指定する必要があります。

-xipo に関するそのほかの重要な情報を次に示します。

  • 少なくとも最適化レベル -xO4 を必要とします。

  • -xipo なしでコンパイルされたオブジェクトは、-xipo でコンパイルされたオブジェクトと自由にリンクできます。

B.2.115.1 -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.ctwo.c および three.c 間と、main.c および four.c 間で実行されますが、main.c または four.cmylib.a のルーチン間では実行されません。最初のコンパイルは未定義のシンボルに関する警告を生成する場合がありますが、内部手続きの最適化は、コンパイルおよびリンクステップであるために実行されます。

B.2.115.2 -xipo=2 による内部手続き解析を行うべきでないケース

内部手続き解析では、コンパイラは、リンクステップでオブジェクトファイル群を操作しながら、プログラム全体の解析と最適化を試みます。このとき、コンパイラは、このオブジェクトファイル群に定義されているすべての foo() 関数 (またはサブルーチン) に関して次の 2 つのことを仮定します。

  • 実行時、このオブジェクトファイル群の外部で定義されている別のルーチンによって foo() が明示的に呼び出されない。

  • オブジェクトファイル群内のルーチンからの foo() 呼び出しが、そのオブジェクトファイル群の外部に定義されている別のバージョンの foo() からの割り込みを受けない。

仮定 2 が真でない場合は、-xipo=1 または -xipo=2 でコンパイルしないでください。

1 例として、独自のバージョンの malloc で関数 malloc() を置き換え、-xipo=2 を指定してコンパイルするケースを考えてみましょう。したがって、コードとリンクされる malloc() を参照する、あらゆるライブラリのあらゆる関数のコンパイルで -xipo=2 を使用する必要があるとともに、リンクステップでそれらのオブジェクトファイルが必要になります。システムライブラリにはこの処理を実行できない場合があるため、独自のバージョンの malloc()-xipo=2 でコンパイルしないでください。

もう 1 つの例として、別々のソースファイルにある foo() および bar() という 2 つの外部呼び出しを含む共有ライブラリを構築するケースを考えてみましょう。また、bar() は foo() を呼び出すと仮定します。foo() が実行時に割り込み処理される可能性がある場合、foo() または bar() のソースファイルを -xipo=1 または -xipo=2 でコンパイルしないでください。それ以外の場合、foo() が bar() にインライン化され、それによって正しくない結果になる可能性があります。

B.2.116 -xipo_archive=[a]

新しい -xipo_archive オプションは、コンパイラが、リンカーに渡されるオブジェクトファイルと、-xipo でコンパイルされて実行可能ファイルを生成する前にアーカイブライブラリ (.a) に常駐するオブジェクトファイルを最適化することを許可します。コンパイル中に最適化されたライブラリに含まれるオブジェクトファイルはすべて、その最適化されたバージョンに置き換えられます。

次の表に、a の値の一覧を示します。

表 B-30  -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= を値付きで指定する必要があります。

B.2.117 -xipo_build=[yes|no]

-xipo_build を指定せずに -xipo を構築すると、コンパイラを通じて 2 回受け渡しが行われることになります (オブジェクトファイルを生成するとき、およびリンク時にファイル間の最適化を実行するとき)。-xipo_build を設定すると、最初の受け渡し時には最適化されず、リンク時にのみ最適化されることによって、コンパイルの時間が短縮されます。-xipo を指定するとリンク時に最適化が実行されるため、オブジェクトファイルを最適化する必要はありません。-xipo_build を指定して作成された最適化されていないオブジェクトファイルを -xipo を指定せずにリンクして最適化すると、アプリケーションのリンクが未解決のシンボルエラーで失敗します。

B.2.117.1 -xipo_build の例

次の例では、.o ファイルの高速ビルドを実行し、リンク時にファイル間の最適化を行なっています。

% cc -O -xipo -xipo_build -o code1.o -c code1.c
% cc -O -xipo -xipo_build -o code2.o -c code2.c
% cc -O -xipo -o a.out code1.o code2.o

-xipo_build は、.o ファイルを作成するときに -O をオフにして、ファイルを迅速に作成します。完全な -O の最適化は、-xipo のファイル間の最適化の一部としてリンク時に実行されます。

次の例は、-xipo を使用せずにリンクしています。

% cc -O -o a.out code1.o code2.o

-xipo_build を指定して code1.o または code2.o を生成した場合、リンク時にエラーになり、シンボル __unoptimized_object_file が未解決であることが示されます。

.o ファイルを別々に作成する場合、デフォルトの動作は -xipo_build=no です。ただし、実行可能ファイルまたはライブラリがソースファイルから 1 回の受け渡しで作成された場合は、-xipo_build が暗黙的に有効になります。例:

% cc -fast -xipo a.c b.c c.c

この場合、a.ob.o、および c.o が生成される最初の受け渡しで、-xipo_build=yes が暗黙的に有効になります。この動作を無効にするには、オプション -xipo_build=no を含めます。

B.2.118 -xivdep[=p]

#pragma ivdep プラグマの解釈を無効化または設定します (ベクトル依存を無視)。

ivdep プラグマは、最適化の目的でループ内で検出された、配列参照へのループがもたらす依存関係の一部またはすべてを無視するようにコンパイラに指示します。これによってコンパイラは、マイクロベクトル化、分散、ソフトウェアパイプラインなど、それ以外の場合は不可能なさまざまなループ最適化を実行できます。これは、依存関係が重要ではない、または依存関係が実際に発生しないことをユーザーが把握している場合に使用されます。

#pragma ivdep 指令の解釈は、—xivdep オプションの値に応じて異なります。

次のリストは、p の値とそれらの意味です。

loop

ループキャリーのベクトル依存と想定されるものを無視

loop_any

ループキャリーのベクトル依存をすべて無視

back

逆方向のループキャリーのベクトル依存と想定されるものを無視

back_any

逆方向のループキャリーのベクトル依存をすべて無視

none

依存を無視しない (ivdep プラグマの無効化)

これらの解釈は、ほかのベンダーの ivdep プラグマの解釈との互換性のために提供されます。

B.2.119 -xjobs{=n|auto}

複数のプロセスでコンパイルします。このフラグを指定しない場合、デフォルトの動作は -xjobs=auto です。

コンパイラが処理を行うために生成するプロセスの数を設定するには、-xjobs オプションを指定します。このオプションを使用すると、マルチ CPU マシン上での構築時間を短縮できます。現時点では、-xjobs とともに使用できるのは -xipo オプションだけです。-xjobs=n を指定すると、内部手続きオプティマイザ は、さまざまなファイルをコンパイルするために呼び出せるコードジェネレータインスタンスの最大数として n を使用します。

一般に、n に指定する確実な値は、使用できるプロセッサ数に 1.5 を掛けた数です。生成されたジョブ間のコンテキスト切り替えにより生じるオーバーヘッドのため、使用できるプロセッサ数の何倍もの値を指定すると、パフォーマンスが低下することがあります。また、あまり大きな数を使用すると、スワップ領域などシステムリソースの限界を超える場合があります。

-xjobs=auto を指定すると、コンパイラは適切な並列ジョブの数を自動的に選択します。

-xjobs には必ず値を指定する必要があります。それ以外の場合は、エラー診断が発行され、コンパイルは中止されます。

-xjobs を指定しない場合、デフォルトの動作は -xjobs=auto です。これは、コマンド行に -xjobs=n を追加することによってオーバーライドできます。コマンド行に複数の -xjobs のインスタンスがある場合、一番右にあるインスタンスが実行されるまで相互にオーバーライドします。

B.2.119.1 -xjobs の例

次の例は、-xipo に最大 3 つの並列プロセスを使用しています。

% cc -xipo -xO4 -xjobs=3 t1.o t2.o t3.o

次の例は、-xipo に単一のプロセスを順次リンクしています。

% cc -xipo -xO4 -xjobs=1 t1.o t2.o t3.o

次の例は、コンパイラが -xipo のジョブ数を選択して、並列でリンクしています。

% cc -xipo -xO4  t1.o t2.o t3.o

これは、-xjobs=auto を明示的に指定したときの動作とまったく同じです。

% cc -xipo -xO4 -xjobs=auto t1.o t2.o t3.o

B.2.120 -xkeep_unref[={[no%]funcs,[no%]vars}]

参照されない関数および変数の定義を維持します。接頭辞 no%は、その定義を場合によっては削除することをコンパイラに許可します。

デフォルトは no%funcs,no%vars です。-xkeep_unref を指定することは -xkeep_unref=funcs,vars を指定することと同等であり、-keep_unref によってすべてが維持されることを意味します。

B.2.121 -xkeepframe[=[%all,%none,name,no%name]]

指定した機能 (name) のスタック関連の最適化を禁止します。

%all

すべてのコードのスタック関連最適化を禁止します。

%none

すべてのコードのスタック関連最適化を許可します。

このオプションは累積的で、コマンド行で複数回指定できます。たとえば、—xkeepframe=%all —xkeepframe=no%func1 は、func1 を除くすべての関数についてスタックフレームを維持するべきであることを示しています。また、—xkeepframe —xregs=frameptr をオーバーライドします。たとえば、—xkeepframe=%all —xregs=frameptr は、すべての関数のスタックが保持されるはずですが、—xregs=frameptr の最適化は無視されることを示します。

このオプションがコマンド行で指定されていないと、コンパイラはデフォルトの -xkeepframe=%none を使用します。このオプションが値なしで指定されると、コンパイラは -xkeepframe=%all を使用します。

B.2.122 -xlang=language

-xlang フラグは、-std フラグによって指定されたデフォルトの libc の動作をオーバーライドするために使用できます。language は次のいずれかである必要があります。

c89

libc のランタイムライブラリの動作が C90 標準に準拠するように指定します。

c99

libc のランタイムライブラリの動作が C99 標準に準拠するように指定します。

c11

c99 と同義です。c99 および c11 の libc のランタイムライブラリの動作は同じです。

-xlang を指定しない場合のデフォルト値は、-std=c99 を指定したときは c99、および -std=c11 を指定したときは c11 です。それ以外の場合、デフォルト値は c89 です。

-xlang を指定した場合、-Xc-Xa-Xt-Xs、および -xc99 フラグは使用できません。一緒に指定するとコンパイラによってエラーが発行されます。

別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xlang の値を使用する必要があります。

言語混合リンクに使用するドライバを決定するには、次の言語階層を使用します。

C++

CC コマンドを使用します。詳細は、『C++ ユーザーズガイド 』を参照してください。

Fortran 95 (または Fortran 90)

f95 コマンドを使用します。詳細は、『Fortran ユーザーズガイド』を参照してください。

Fortran 77

f95 -xlang=f77 を使用します。詳細は、『Fortran ユーザーズガイド』を参照してください。

C

cc コマンドを使用します。

B.2.123 -xldscope={v}

extern シンボルの定義に対するデフォルトのリンカースコープを変更するには、-xldscope オプションを指定します。デフォルトを変更すると、実装がよりうまく隠されるので、より早く、より安全に共有ライブラリを使用できます。

v には、次のいずれかを指定します。

表 B-31  -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 を置き換えようとする場合、ABC_allocator を呼び出したライブラリコンポーネント内では置き換えは発生しません。最終的なプログラムには、この関数の相異なるバージョンが含まれることになります。

__hidden 指定子または __symbolic 指定子で宣言されたライブラリ関数は、ライブラリの構築時にインラインで生成できます。これらの関数では、ユーザーによるオーバーライドはサポートされていません。詳細については、リンカースコープ指定子を参照してください。

__global 指示子で宣言されたライブラリ関数はインラインで宣言しないでください。また、-xinline コンパイラオプションを使用してインライン化することから保護されるようにしてください。

-xinline-xO-xipo #pragma inline も参照してください。

B.2.124 -xlibmieee

例外が起きた場合の数学ルーチンの戻り値を強制的に IEEE 754 形式にします。 この場合、例外メッセージは出力されないので、errno には依存しないでください。

B.2.125 -xlibmil

実行速度を上げるため、一部のライブラリルーチンをインライン化します。オプションによって浮動小数点演算用オプションとプラットフォームに適したアセンブリ言語のインラインテンプレートが選択されます。

-xlibmil は、-xinline フラグで関数を指定しているかどうかに関係なく、関数をインライン化します。

ただし、こうした置換によって errno の値の信頼性が失われることがあります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。errno の値の保持も参照してください。

B.2.126 -xlibmopt

このオプションによって、コンパイラは最適化された数学ルーチンのライブラリを利用できます。このオプションを使用するときは -fround=nearest を指定することによって、デフォルトの丸めモードを使用する必要があります。

数学ルーチンライブラリは最高のパフォーマンスが得られるように最適化されており、通常、高速なコードを生成します。この結果は、通常の数学ライブラリが生成する結果と少し異なることがあります。その場合、通常、異なるのは最後のビットです。

これらの置換によって、errno の設定の信頼性が失われる可能性があります。プログラムが errno の値に依存している場合、このオプションの使用は避けてください。詳細は、errno の値の保持を参照してください。

このライブラリオプションをコマンド行に指定する順序は重要ではありません。

このオプションは -fast オプションを指定した場合にも設定されます。

-fast および -xnolibmopt も参照してください。

B.2.127 -xlic_lib=sunperf

(廃止) Sun Performance Library とリンクするときは、-library=sunperf を使用してください。

B.2.128 -xlicinfo

このオプションは、コンパイル時には暗黙的に無視されます。

B.2.129 -xlinkopt[=level]

再配置可能なオブジェクトファイルのリンク時の最適化を実行するようコンパイラに指示します。このような最適化は、リンク時にオブジェクトのバイナリコードを解析することによって実行されます。オブジェクトファイルは書き換えられませんが、結果の実行可能コードは元のオブジェクトコードとは異なる場合があります。

-xlinkopt をリンク時に有効にするには、少なくともコンパイルコマンドで -xlinkopt を使用する必要があります。-xlinkopt を指定しないでコンパイルされたオブジェクトバイナリについても、オプティマイザは限定的な最適化を実行できます。

-xlinkopt は、コンパイラのコマンド行にある静的ライブラリのコードは最適化しますが、コマンド行にある共有 (動的) ライブラリのコードは最適化しません。共有ライブラリを構築 (-G でコンパイル) するときに、-xlinkopt も使用できます。

level には、実行する最適化のレベルを 0、1、2 のいずれかで設定します。次の表に、最適化レベルの一覧を示します。

表 B-32  -xlinkopt のフラグ
フラグ
意味
0
ポストオプティマイザは無効です。これがデフォルトです。
1
リンク時の命令キャッシュカラーリングと分岐の最適化を含む、制御フロー解析に基づき最適化を実行します。
2
リンク時のデッドコードの除去とアドレス演算の簡素化を含む、追加のデータフロー解析を実行します。

別の手順でコンパイルする場合は、コンパイルとリンクの両方の手順で -xlinkopt を指定する必要があります。

example% cc -c -xlinkopt a.c b.c
example% cc -o myprog -xlinkopt=2 a.o

Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

レベルパラメータは、コンパイラのリンク時にだけ使用されます。例では、オブジェクトバイナリが暗黙のレベル 1 でコンパイルされた場合でも、使用される最適化後レベルは 2 です。

-xlinkopt をレベルパラメータなしで指定した場合は、-xlinkopt=1 を示します。

-xlinkopt オプションでは、プログラムを最適化するためにプロファイルフィードバック (-xprofile) が必要です。プロファイリングは、コードの使用頻度がもっとも高い部分ともっとも低い部分を明らかにし、オプティマイザにそれに基づいて処理を集中するよう指示します。リンク時の最適化は、コードの最適な配置によって命令キャッシュミスを大幅に削減できる大規模アプリケーションで特に重要です。また、-xlinkopt はプログラム全体のコンパイル時に使用するともっとも効果的です。このオプションは次のように使用します。

example% cc -o progt -xO5 -xprofile=collect:prog file.c
example% progt
example% cc -o prog -xO5 -xprofile=use:prog -xlinkopt file.c

プロファイルフィードバックの使用方法についての詳細は、–xprofile=pを参照してください。

-xlinkopt でコンパイルする場合は、-zcombreloc リンカーオプションは使用しないでください。

このオプションを指定してコンパイルすると、リンク時間がわずかに増えます。オブジェクトファイルも大きくなりますが、実行可能ファイルのサイズは変わりません。-xlinkopt-g を指定してコンパイルすると、デバッグ情報が取り込まれるので、実行可能ファイルのサイズが増えます。

B.2.130 -xloopinfo

どのループが並列化されるかを表示します。ループを並列化しない理由を簡潔に提供します。-xloopinfo オプションは、-xautopar が指定されている場合にのみ有効です。指定されていない場合は、コンパイラによって警告が表示されます。

コードの実行速度を上げるには、このオプションにマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。

B.2.131 -xM

指定された C プログラムで 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 で指定したファイルに、コンパイラはすべてのメイクファイルの依存関係情報を追加します。

B.2.132 -xM1

-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 で指定したファイルに、コンパイラはすべてのメイクファイルの依存関係情報を追加します。

B.2.133 -xMD

-xM と同様にメイクファイル依存関係を生成しますが、コンパイルは続行します。-xMD は、-o 出力 filename (指定されている場合、つまり入力ソース filename) から派生した、メイクファイル依存関係情報のための出力ファイルを生成します。filename の接尾辞は .d で置換 (または追加) されます。-xMD-xMF を指定する場合、-xMF で指定したファイルに、プリプロセッサはすべてのメイクファイルの依存関係情報を書き込みます。複数のソースファイルを使って -xMD -xMF または -xMD -o filename でコンパイルすることは許可されず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。

B.2.134 -xMF filename

makefile の依存関係の出力先ファイルを指定するには、このオプションを使用します。1 つのコマンド行の -xMF で、複数の入力ファイルに個々の filename を指定することはできません。複数のソースファイルで -xMD -xMF または -xMMD -xMF を使用してコンパイルすることはできず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。

このオプションは -xM または -xM1 とともに使用できません。

B.2.135 -xMMD

システムヘッダーファイルを除き、メイクファイルの依存関係を生成するには、このオプションを使用します。このオプションは -xM1 と同じ機能を提供しますが、コンパイルは続行します。-xMMD は、-o 出力 filename (指定されている場合、つまり入力ソース filename) から派生した、メイクファイル依存関係情報のための出力ファイルを生成します。filename の接尾辞は .d で置換 (または追加) されます。-xMF を指定する場合、コンパイラは代わりに、ユーザーが指定したファイル名を使用します。複数のソースファイルで -xMMD -xMF または -xMMD -o filename を使用してコンパイルすることはできず、エラーが生成されます。依存関係ファイルがすでに存在する場合は上書きされます。

B.2.136 -xMerge

データセグメントをテキストセグメントにマージします。このコンパイルで生成するオブジェクトファイルで初期化されるデータは読み取り専用なので、ld -N でリンクしていないかぎり、プロセスどうしで共有することができます。

3 つのオプション -xMerge -ztext -xprofile=collect を一緒に使用するべきではありません。-xMerge を指定すると、静的に初期化されたデータを読み取り専用記憶領域に強制的に配置します。 -ztext を指定すると、位置に依存するシンボルを読み取り専用記憶領域内で再配置することを禁止します。-xprofile=collect を指定すると、書き込み可能記憶領域内で、静的に初期化された、位置に依存するシンボルの再配置を生成します。

B.2.137 -xmaxopt[=v]

このオプションは、pragma opt のレベルを指定されたレベルに制限します。 v は、off12345 のいずれかです。デフォルト値は -xmaxopt=off であり、pragma opt は無視されます。引数を指定せずに -xmaxopt を指定することは、-xmaxopt=5 を指定することと同義です。

-xO-xmaxopt の両方を指定する場合、-xO で設定する最適化レベルが -xmaxopt 値を超えてはいけません。

B.2.138 -xmemalign=ab

(SPARC) データの境界整列についてコンパイラが行う想定を制御するには、-xmemalign オプションを使用します。潜在的に不正な境界整列メモリーアクセスのために生成されたコードを制御し、不正境界整列アクセスの場合のプログラム動作を制御することで、より簡単に SPARC プラットフォームにコードを移植できます。

最大想定メモリー境界整列と不正境界整列データアクセスの動作を指定します。a (境界整列) と b (動作) の両方の値を指定する必要があります。a は、最大想定メモリー境界整列を指定します。b は、不正境界整列メモリーアクセスの動作を指定します。次に、-memalign の境界整列と動作の値を示します。

表 B-33  -xmemalign の境界整列と動作のフラグ
a
b
1
最大 1 バイトの境界整列
i
アクセスを解釈し、実行を継続する
2
最大 2 バイトの境界整列
s
シグナル SIGBUS を発生させます。
4
最大 4 バイトの境界整列
f
64 ビット SPARC (-m64) のみ:
4 以下の境界整列の場合にシグナル SIGBUS を発生させます。それ以外の場合、アクセスを解釈して実行を継続します。32 ビットプログラムの場合、f フラグは i と同義です。
8
最大 8 バイトの境界整列
16
最大 16 バイトの境界整列

bif のいずれかに設定してコンパイルしたオブジェクトファイルにリンクする場合は、必ず、-xmemalign を指定する必要があります。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

コンパイル時に境界整列が判別できるメモリーへのアクセスの場合、コンパイラはそのデータの境界整列に適したロードおよびストア命令を生成します。

境界整列がコンパイル時に決定できないメモリーアクセスの場合、コンパイラは、境界整列を想定して、必要なロード/ストア命令のシーケンスを生成します。-xmemalign オプションは、これらの状況のときにコンパイラが想定するデータの最大メモリー境界整列を指定できます。-xmemalign オプションは、境界整列に失敗したメモリーへのアクセスが実行時に発生した場合に行われるエラー動作 (処理) についても指定できます。

実行時の実際のデータ境界整列が指定された整列に達しない場合、境界整列に失敗したアクセス (メモリー読み取りまたは書き込み) が行われると、トラップが発生します。このトラップに対して可能な応答は 2 つあります。

  • OS がトラップを SIGBUS シグナルに変換します。プログラムがこのシグナルを捕捉しない場合、プログラムは停止します。プログラムがシグナルを捕捉しても、境界整列に失敗したアクセスが成功するわけではありません。

  • 境界整列に失敗したアクセスが正常に成功したかのように OS がアクセスを解釈し、プログラムに制御を戻すことによってトラップを処理します。

次のデフォルトの値は、-xmemalign オプションがまったく指定されていない場合にのみ適用されます。

  • すべての 32 ビットプラットフォーム (-m32) で -xmemalgin=8i

  • すべての 64 ビットプラットフォーム (-m64) で -xmemalign=8s

-xmemalign オプションが指定されているけれども値が与えられていないときのデフォルトは、すべてのプラットフォームで -xmemalign=1i です。

次の表は、さまざまな境界整列状況を扱うために -xmemalign をどのように使用できるかについての説明です。

表 B-34  -xmemalign の例
コマンド
状況
-xmemalign=1s
境界整列されていないデータへのアクセスが多いため、トラップ処理が遅すぎる
-xmemalign=8i
コード内に境界整列されていないデータへのアクセスが意図的にいくつか含まれているが、それ以外は正しい
-xmemalign=8s
プログラム内に境界整列されていないデータへのアクセスは存在しないと思われる
-xmemalign=2s
奇数バイトへのアクセスが存在しないか検査したい
-xmemalign=2i
奇数バイトへのアクセスが存在しないか検査し、プログラムを実行したい

B.2.139 -xmodel=[a]

(x86) -xmodel オプションは、コンパイラが Oracle Solaris x86 プラットフォームのために 64 ビットオブジェクトの形式を変更することを許可します。そのようなオブジェクトのコンパイルにのみ指定するようにしてください。

このオプションは、64 ビット対応の x64 プロセッサで –m64 も指定した場合にのみ有効です。

次の表に、a の値の一覧を示します。

表 B-35  -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 システムが medium モデルをサポートしているわけではありません。

B.2.140 -xnolib

デフォルトのライブラリリンクを行いません。つまり ld(1) に -l オプションを渡しません。通常は、cc ドライバが -lcld に渡します。

-xnolib を使用する場合、すべての -l オプションをユーザーが渡さなければいけません。

B.2.141 -xnolibmil

数学ライブラリのルーチンをインライン化しません。このオプションは、–fast オプションのあとで使用します。例:

% cc– fast– xnolibmil....

B.2.142 -xnolibmopt

以前に指定された -xlibmopt オプションを無効にすることによって、最適化された数学ライブラリがコンパイラによって使用されることを防ぎます。たとえば、このオプションは -xlibmopt を有効にする -fast のあとで使用します。

% cc -fast -xnolibmopt ...

B.2.143 –xnorunpath

実行可能ファイルに共有ライブラリへの実行時検索パスを組み込みません。

このオプションは、プログラムで使用される共有ライブラリに異なるパスを持つ可能性がある顧客に出荷される実行可能ファイルを構築する場合に推奨されます。

B.2.144 -xO[1|2|3|4|5]

コンパイラ最適化レベルを設定します。 大文字 O のあとに数字 123 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 つの関数内のコードが数千行になるような) 大きな関数を最適化する場合、膨大な量の仮想メモリーが必要になり、そのような場合、マシンパフォーマンスが低下することがあります。

B.2.144.1 SPARC 最適化

次の表は、SPARC プラットフォームでの最適化レベルの一覧です。

表 B-36  SPARC プラットフォームでの -xO のフラグ
意味
-xO1
最小限の局所的な最適化 (ピープホール) を行います。
-xO2
基本的な局所的および大域的最適化を行います。ここでは帰納変数の削除、局所的および大域的な共通部分式の除去、算術の簡素化、コピー通達、定数通達、不変ループの最適化、レジスタの割り当て、基本ブロックのマージ、再帰的末尾の除去、無意味なコードの除去、末尾呼び出しの削除、複雑な式の展開を行います。
-xO2レベルでは、大域、外部、間接の参照または定義はレジスタに割り当てられません。これらの参照や定義は、あたかも volatile 型として宣言されたかのように取り扱われます。一般的 -xO2 レベルではコードサイズはもっとも小さくなります。
-xO3
-xO2 に加えて、外部変数の参照または定義も最適化します。ループの展開やソフトウェアのパイプラインなども実行されます。このレベルでは、ポインタ代入の影響は追跡されません。シグナルハンドラの内部から外部変数を変更するデバイスドライバまたはプログラムをコンパイルするときは、volatile 型修飾子を使用してオブジェクトを最適化から保護する必要がある場合があります。-xO3 レベルは通常、コードサイズが増大します。
-xO4
-xO3 に加えて、同一のファイルに含まれている関数の自動的なインライン化も行います。通常はこれによって実行速度が上がります。どの関数がインライン化されるかを制御するには、-xinline=listを参照してください。
このレベルでは、ポインタ代入の結果が追跡され、通常はコードサイズが増大します。
-xO5
最高レベルの最適化を行おうとします。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。このレベルの最適化によってパフォーマンスが改善される確率を高くするには、プロファイルのフィードバックを使用します。詳細は、–xprofile=pを参照してください。

B.2.144.2 x86 最適化レベル

次の表は、x86 プラットフォームでの最適化レベルの一覧です。

表 B-37  x86 プラットフォームでの -xO のフラグ
意味
-xO1
単一段階のデフォルト最適化のほかに、メモリーからの引数の事前ロードと、クロスジャンプ (末尾融合) を行います。
-xO2
高レベルと低レベルの両方の命令をスケジュールし、改良されたスピル解析、ループメモリー参照の除去、レジスタ寿命解析、高度なレジスタ割り当て、大域共通部分式の除去を行います。
-xO3
レベル 2 で行われる最適化のほかに、ループ強度削減と誘導変数除去を行います。
-xO4
-xO3 の最適化の実行に加えて、同じファイルに含まれている関数の自動インライン化を実行します。この自動インライン化は通常、実行速度を改善しますが、ときには悪化することもあります。このレベルは通常、コードサイズが増大します。
-xO5
最高レベルの最適化を行います。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。これらの一部は、エクスポートされた関数がローカル呼び出し規則エントリポイントを生成したり、スピルコードをさらに最適化したり、命令スケジュールを向上するための解析を追加したりすることを含みます。

デバッグの詳細は、Oracle Solaris Studio: dbx コマンドによるデバッグを参照してください。最適化の詳細は、Oracle Solaris Studio パフォーマンスアナライザマニュアルを参照してください。

-xldscope および -xmaxopt も参照してください。

B.2.145 -xopenmp[={parallel|noopt|none}]

OpenMP 指令で明示的な並列化を有効にします。

-xopenmp の値を次の表に示します。

表 B-38  -xopenmp のフラグ
意味
parallel
OpenMP プラグマの認識を有効にします。-xopenmp=parallel での最適化レベルは -xO3 です。コンパイラは必要に応じて最適化レベルを -xO3 に引き上げ、警告を発行します。
このフラグは、プリプロセッサマクロ _OPENMP も定義します。_OPENMP マクロは、10 進値 yyyymm が含まれるように定義します。ここで、yyyymm は、この実装がサポートする OpenMP API のバージョンの年と月を示します。特定のリリースの _OPENMP マクロの値については、『Oracle Solaris Studio OpenMP API ユーザーガイド』を参照してください。
noopt
OpenMP プラグマの認識を有効にします。最適化レベルが -O3 より低い場合は、最適化レベルは上げられません。
cc -O2 -xopenmp=noopt のように -O3 より低い最適化レベルを明示的に設定すると、エラーが表示されます。-xopenmp=noopt で最適化レベルを指定しなかった場合、OpenMP プラグマが認識され、その結果プログラムが並列化されますが、最適化は行われません。
このフラグは、プリプロセッサトークン _OPENMP も定義します。
none
OpenMP プラグマの認識を有効にせず、プログラムの最適化レベルへの変更は行わず、プリプロセッサマクロを定義しません。-xopenmp が指定されない場合は、これがデフォルトになります。

-xopenmp を指定するけれども値を指定しない場合、コンパイラは -xopenmp=parallel であると見なします。-xopenmp を一切指定しない場合、コンパイラは -xopenmp=none であると見なします。

dbx を指定して OpenMP プログラムをデバッグする場合、-g -xopenmp=noopt を指定してコンパイルすれば、並列化部分にブレークポイントを設定して変数の内容を表示できます。

-xopenmp のデフォルトは、将来のリリースで変更される可能性があります。警告メッセージを出力しないようにするには、適切な最適化レベルを明示的に指定します。

OpenMP プログラムを実行するときに使用するスレッドの数を指定するには、OMP_NUM_THREADS 環境変数を使用します。OMP_NUM_THREADS が設定されていない場合、並列領域の実行に使用されるスレッドのデフォルトの数は、マシンで利用できるコアの数になりますが、上限は 32 です。別のスレッド数を指定するには、OMP_NUM_THREADS 環境変数を設定するか、omp_set_num_threads() OpenMP 実行時ルーチンを呼び出すか、並列領域ディレクティブの num_threads 節を使用します。最高のパフォーマンスを得るため、並列領域の実行に使用するスレッドの数が、マシン上で使用できるハードウェアスレッド (仮想プロセッサ) の数を超えないようにしてください。Oracle Solaris システムでは、psrinfo (1M) コマンドを使用すると、この数を特定できます。Linux システムでは、ファイル /proc/cpuinfo を調べることでこの数を特定できます。詳細は、『OpenMP API ユーザーズガイド』を参照してください。

入れ子並列は、デフォルトでは無効です。入れ子並列を有効にするには、OMP_NESTED 環境変数を TRUE に設定する必要があります。詳細は、『OpenMP API ユーザーズガイド』を参照してください。

コンパイルとリンクを別々に実行する場合は、コンパイル手順とリンク手順の両方に -xopenmp を指定してください。リンク手順とともに使用した場合、-xopenmp オプションは、OpenMP 実行時サポートライブラリ libmtsk.so とリンクします。

最新の機能と最適なパフォーマンスを得るために、OpenMP 実行時ライブラリの最新のパッチ、libmtsk.so がシステムにインストールされていることを確認してください。

マルチスレッド対応アプリケーションを構築するための OpenMP Fortran 95、C および C++ アプリケーションプログラムインタフェース (API) の詳細は、『Oracle Solaris Studio OpenMP ユーザーガイド』を参照してください。

B.2.146 -xP

すべての K&R C 関数のプロトタイプを出力する際、コンパイラはソースファイルに対して構文および意味検査のみ行います。このオプションは、オブジェクトコードや実行可能コードを生成しません。たとえば次のソースファイルに -xP を指定したと仮定します。

f()
{
}

main(argc,argv)
int argc;
char *argv[];
{
}

この出力を生成します。

int f(void);
int main(int, char **);

B.2.147 -xpagesize=n

スタックとヒープ用の優先ページサイズを設定します。

SPARC: 次の値が有効です: 4k8K64K512K2M4M32M256M2G16G、または default

x86: 次の値が有効です: 4K2M4M1G、または default

有効なページサイズを指定しない場合は、要求は実行時にサイレントに無視されます。ターゲットプラットフォームに対して有効なページサイズを指定する必要があります。

ページ内のバイト数を判断するには、pagesize(1) Oracle Solaris コマンドを使用します。オペレーティングシステムでは、ページサイズ要求に従うという保証はありません。ただし、適切なセグメントの整合を使用して、要求されたページサイズを取得できる可能性を高められます。セグメントの整合の設定方法は、-xsegment_align オプションを参照してください。ターゲットプラットフォームのページサイズを判断するには、 pmap(2) または meminfo(2) を使用します。

-xpagesize オプションは、コンパイル時とリンク時に使用しないかぎり無効です。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

-xpagesize=default を指定する場合は、Oracle Solaris オペレーティングシステムがページサイズを設定します。

このオプションを指定してコンパイルすることは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Oracle Solaris コマンド ppgsz(1) を実行することと同じ効果を持ちます。詳細は、関連する Oracle Solaris マニュアルページを参照してください。

このオプションは -xpagesize_heap -xpagesize_stack のマクロです。これらの 2 つのオプションは -xpagesize と同じ次の引数を使用します。-xpagesize を指定することで両方のオプションに同じ値を設定したり、それらをそれぞれ別々の値で指定したりできます。

B.2.148 -xpagesize_heap=n

ヒープ用のメモリーページサイズを設定します。

このオプションは、—xpagesize と同じ値を受け入れます。有効なページサイズを指定しないと、要求は実行時に暗黙的に無視されます。

Oracle Solaris オペレーティングシステムでページのバイト数を判断するには、getpagesize(3C) コマンドを使用します。Oracle Solaris オペレーティングシステムは、ページサイズ要求に従うという保証を提供しません。ターゲットプラットフォームのページサイズを判断するには、 pmap(1) または meminfo(2) を使用します。

-xpagesize_heap=default を指定する場合は、Oracle Solaris オペレーティングシステムがページサイズを設定します。

このオプションを指定してコンパイルすることは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Oracle Solaris コマンド ppgsz(1) を実行することと同じ効果を持ちます。詳細は、関連する Oracle Solaris マニュアルページを参照してください。

-xpagesize_heap オプションは、コンパイル時とリンク時に使用しないかぎり無効です。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

B.2.149 -xpagesize_stack=n

スタック用のメモリーページサイズを設定します。

このオプションは、—xpagesize と同じ値を受け入れます。有効なページサイズを指定しないと、要求は実行時に暗黙的に無視されます。

Oracle Solaris オペレーティングシステムでページのバイト数を判断するには、getpagesize(3C) コマンドを使用します。Oracle Solaris オペレーティングシステムは、ページサイズ要求に従うという保証を提供しません。ターゲットプラットフォームのページサイズを判断するには、 pmap(1) または meminfo(2) を使用します。

-xpagesize_stack=default を指定する場合は、Oracle Solaris オペレーティングシステムがページサイズを設定します。

このオプションを指定してコンパイルすることは、LD_PRELOAD 環境変数を同等のオプションで mpss.so.1 に設定するか、またはプログラムを実行する前に同等のオプションを指定して Oracle Solaris コマンド ppgsz(1) を実行することと同じ効果を持ちます。詳細は、関連する Oracle Solaris マニュアルページを参照してください。

-xpagesize_stack オプションは、コンパイル時とリンク時に使用しないかぎり無効 です。Table A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。

B.2.150 -xpatchpadding[={fix|patch|size}]

各関数の開始前にメモリー領域を予約します。fix を指定した場合、コンパイラは fix で必要となる領域を予約して続行します。これは最初のデフォルトです。patch を指定した場合、または値を指定しない場合、コンパイラはプラットフォーム固有のデフォルト値で予約します。値 -xpatchpadding=0 は 0 バイトの領域を予約します。size の最大値は、x86 では 127 バイト、および SPARC では 2048 バイトです。

B.2.151 -xpch=v

このコンパイラオプションは、プリコンパイル済みヘッダー機能を起動します。v には、autoautofirstcollect:pch_filenameuse:pch_filename のいずれかを指定できます。この機能は、-xpch-xpchstop オプションを、#pragma hdrstop ディレクティブと組み合わせることで利用できます。

-xpch オプションは、プリコンパイル済みヘッダーファイルを作成して、コンパイル時間を短縮するときに使用します。プリコンパイル済みヘッダーファイルは、大量のソースコードを含む一連の共通インクルードファイルセットをソースファイルが共有しているアプリケーションの、コンパイル時間を短縮します。プリコンパイル済みヘッダーを使用することによって、1 つのソースファイルから一連のヘッダーファイルに関する情報を収集し、そのソースファイルを再コンパイルする場合や、同じ一連のヘッダーを持つほかのソースファイルをコンパイルする場合に、その情報を使用することができます。コンパイラが収集する情報は、プリコンパイル済みヘッダーファイルに格納されます。

詳細は、次を参照してください。

B.2.151.1 プリコンパイル済みヘッダーファイルの自動作成

コンパイラは、2 つの方法のいずれかでプリコンパイル済みヘッダーファイルを自動的に生成できます。1 つは、ソースファイルで検出された最初のインクルードファイルからプリコンパイル済みヘッダーファイルを作成する方法、もう 1 つの方法は、コンパイラが、ソースファイルで検出されたインクルードファイルのセット (最初のインクルードファイルから始めて、どのインクルードファイルが最後のものであるかを判断するためのよく定義されたポイントまで) から選択する方法です。プリコンパイル済みヘッダーを自動的に生成するためにコンパイラがどの方法を使用するかを判断するには、次の表で説明するフラグのいずれかを使用します。

表 B-39  –xpch のフラグ
フラグ
意味
-xpch=auto
プリコンパイル済みヘッダーファイルの内容は、コンパイラがソースファイル内で検出する使用可能な最長の接頭辞に基づきます。このフラグは、最大限の数のヘッダーファイルで構成されるプリコンパイル済みヘッダーファイルを生成します。詳細は、活性文字列 (Viable Prefix)を参照してください。
-xpch=autofirst
このフラグは、ソースファイル内で最初に検出されたヘッダーのみからなるプリコンパイル済みヘッダーファイルを生成します。

B.2.151.2 プリコンパイル済みヘッダーファイルの手動作成

プリコンパイル済みヘッダーファイルを手動で作成するには、最初に -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 と呼ばれます。

B.2.151.3 既存のプリコンパイル済みヘッダーファイルの処理方法

コンパイラが -xpch=auto および -xpch=autofirst と一緒にプリコンパイル済みヘッダーファイルを使用できない場合、新しいプリコンパイル済みヘッダーファイルを生成します。コンパイラが -xpch=use と一緒にプリコンパイル済みヘッダーファイルを使用できない場合は、警告が発行され、実際のヘッダーを使ってコンパイルが行われます。

B.2.151.4 特定のプリコンパイル済みヘッダーファイルの使用の指定

-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 で指定したファイル内の前処理ディレクティブのシーケンスと同じであること。

B.2.151.5 活性文字列 (Viable Prefix)

プリコンパイル済みヘッダーファイルを複数のソースファイル間で共有するために、これらのソースファイルには、最初のトークンの並びとして一連の同じインクルードファイルを使用していなければいけません。トークンはキーワードか名前、句読点のいずれかです。コンパイラは、コードおよび、#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 の場合は、それぞれが同じ値を参照する必要があります。各活性文字列内での順序も同じである必要があります。対応する各プラグマも同じで、その順序もプリコンパイル済みヘッダーを共有するすべてのファイルで同じでなければいけません。

B.2.151.6 ヘッダーファイルの妥当性の判定

ヘッダーファイルは、異なるソースファイル間で整合性のある方法で解釈されるとき (具体的には、完全な宣言のみを含むとき) に、プリコンパイル可能です。すなわち、どのファイルの宣言も有効な宣言として独立している必要があります。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が含まれていてはいけません。

ヘッダーに変数と関数の宣言が含まれている場合は、ヘッダーも同様にプリコンパイル可能です。

B.2.151.7 プリコンパイル済みヘッダーファイルキャッシュ

プリコンパイル済みヘッダーファイルの自動作成では、コンパイラは、そのファイルを SunWS_cache ディレクトリに書き込みます。このディレクトリは常に、オブジェクトファイルが作成される場所に置かれます。dmake の下で適切に機能するように、ファイルの更新はロックして行われます。

自動生成されるプリコンパイル済みヘッダーファイルをコンパイラに強制的に再構築させる必要がある場合は、CCadmin ツールを使って、プリコンパイル済みヘッダーファイルキャッシュディレクトリをクリアできます。詳細は、CCadmin(1) のマニュアルページを参照してください。

B.2.151.8 警告

  • 矛盾する -xpch フラグをコマンド行に指定しないでください。たとえば、-xpch=collect-xpch=auto の両方を指定したり、-xpchstop=<include> を付けて -xpch=autofirst を指定したりすると、エラーになります。

  • -xpch=autofirst を指定するか、-xpchstop なしで -xpch=auto を指定した場合、最初のインクルードファイル、あるいは -xpch=auto-xpchstop を付けて指定したインクルードファイルの前に宣言や定義、#line 指令があると、エラーになり、プリコンパイル済みヘッダーファイルの自動生成が無効になります。

  • -xpch=autofirst または -xpch=auto で、最初のインクルードファイルの前に #pragma hdrstop があると、プリコンパイル済みヘッダーファイルの自動生成が無効になります。

B.2.151.9 プリコンパイル済みヘッダーファイルの依存関係と make ファイル

-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 規則を作成する必要はありません。

B.2.152 -xpchstop=[file|<include>]

-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 も参照してください。

B.2.153 –xpec[={yes|no}]

(Solaris のみ) 移植可能な実行可能コード (Portable Executable Code、PEC) バイナリを生成します。このオプションは、プログラム中間表現をオブジェクトファイルとバイナリに入れます。このバイナリは、あとでチューニングやトラブルシューティングのために、使用される場合があります。

–xpec を指定して構築したバイナリは通常、–xpec なしで構築したバイナリより 5 ~ 10 倍の大きさになります。

–xpec を指定しない場合、コンパイラは –xpec=no と見なします。–xpec を指定するけれどもフラグを指定しない場合は、コンパイラは –xpec=yes と見なします。

B.2.154 -xpentium

(x86) Pentium プロセッサ用のコードを生成します。

B.2.155 -xpg

gprof(1) によるプロファイリングの準備として、データを収集するためのオブジェクトコードを生成します。この記録メカニズムは実行が正常終了すると、gmon.outファイルを作成します。


注 -  -xprofile とともに使用される場合、-xpg は追加の利点を提供しません。これら 2 つのオプションは、他方で提供されるデータを準備または使用しません。

プロファイルは、64 ビット Oracle Solaris プラットフォームでは prof(1) または gprof (1) を使用して、32 ビット Oracle Solaris プラットフォームでは gprof のみを使用して生成され、メイン実行可能ファイル内のルーチンと、実行可能ファイルのリンク時にリンカー引数として指定された共有ライブラリ内のルーチンの PC 標本データ (pcsample(2) を参照) から求められる、ユーザー CPU 時間の概算値を取り込みます。そのほかの共有ライブラリ (dlopen(3DL) を使用してプロセスの起動後に開かれたライブラリ) のプロファイルは作成されません。

32 ビット Oracle Solaris システムの場合、prof(1) を使用して生成されるプロファイルは、実行可能ファイル内のルーチンに制限されます。32 ビット共有ライブラリは、-xpg で実行可能ファイルをリンクし、gprof(1) を使用することでプロファイリングできます。

x86 システムでは、-xpg-xregs=frameptr と互換性がありません。これら 2 つのオプションを一緒に使用しないでください。-xregs=frameptr-fast に含まれている点にも注意してください。-fast-xpg とともに使用するときは、-fast -xregs=no%frameptr -xpg を指定してコンパイルします。

現行の Oracle Solaris リリースには、-p でコンパイルされるシステムライブラリが含まれません。その結果、現行の Solaris プラットフォームで収集されるプロファイルには、システムライブラリルーチンの呼び出し回数が含まれません。

コンパイル時に -xpg を指定した場合は、リンク時にも指定する必要があります。コンパイル時とリンク時のオプションに、コンパイル時とリンク時の両方に指定する必要があるオプションの全一覧をまとめています。


注 -  gprof プロファイリングのために -xpg でコンパイルされたバイナリは、binopt(1) では使用しないでください。互換性がないため、内部エラーになる可能性があります。

B.2.156 -xprefetch[=val[,val]]

先読みをサポートするそれらのアーキテクチャーで先読み命令を有効にします。

明示的な先読みは、測定方法によってサポートされる特殊な環境でのみ使用してください。

次の表に、val の値の一覧を示します。

表 B-40  -xprefetch のフラグ
フラグ
意味
latx:factor
(SPARC) 指定の係数により、コンパイラの先読みからロード、および先読みからストアまでの応答時間を調整します。このフラグは、-xprefetch=auto とのみ組み合わせることができます。先読み応答率 (SPARC)を参照してください。
[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 ヘッダーファイルには、明示的な先読み命令を指定するためのマクロが含まれています。先読み命令は、実行コード中のマクロの位置にほぼ相当するところに挿入されます。

B.2.156.1 先読み応答率 (SPARC)

先読みの応答時間とは、先読み命令を実行してから先読みされたデータがキャッシュで利用可能となるまでのハードウェアの遅延のことです。

係数には、n.n. という形式の正の数値を使用します。

コンパイラは、先読み命令と先読みされたデータを使用するロードまたはストア命令の距離を決定する際に先読み応答時間の値を想定します。先読みからロードまでの想定応答時間は、先読みからストアまでの想定応答時間と同じでない場合があります。

コンパイラは、幅広いマシンとアプリケーションで最適なパフォーマンスを得られるように先読みメカニズムを調整します。しかし、コンパイラの調整作業が必ずしも最適であるとはかぎりません。メモリーに負担のかかるアプリケーション、特に大型のマルチプロセッサでの実行を意図したアプリケーションの場合、先読みの応答時間の値を引き上げることにより、パフォーマンスを向上できる場合があります。この値を増やすには、1 よりも大きい係数を使用します。.5 と 2.0 の間の値は、おそらく最高のパフォーマンスを提供します。

外部キャッシュの中に完全に常駐するデータセットを持つアプリケーションの場合は、先読み応答時間の値を減らすことでパフォーマンスを向上できる場合があります。値を小さくするには、1 よりも小さな係数を使用します。

latx:factor サブオプションを使用するには、1.0 程度の係数から順にアプリケーションの性能テストを実行します。それに応じて係数を増減し、パフォーマンステストを再実行します。係数の調整を継続し、最適なパフォーマンスに到達するまでパフォーマンステストを実行します。係数を小刻みに増減すると、しばらくはパフォーマンスに変化がなく、突然変化し、再び平常に戻ります。

B.2.157 -xprefetch_auto_type=a

a の値は [no%]indirect_array_access です。

直接メモリーアクセス用の先読みが生成されるのと同じ方法で、-xprefetch_level オプションで指定するループ用の間接先読みをコンパイラが生成することを許可するときは、-xprefetch_auto_type=indirect_array_access を使用します。

-xprefetch_auto_type の値が指定されていない場合、-xprefetch_auto_type=no%indirect_array_access に設定されます。

-xalias_level などのオプションは、メモリー別名を明確化する情報の生成に役立つため、間接プリフェッチ候補の計算の積極性に影響し、このため、自動的な間接プリフェッチの挿入が促進されることがあります。

B.2.158 -xprefetch_level=l

-xprefetch=auto で判断される先読み命令の自動挿入の積極性を制御するには、-xprefetch_level オプションを使用します。l12、または 3 である必要があります。-xprefetch_level が高いレベルであるほど、コンパイラはより積極的になります。つまり、より多くの先読みを取り込みます。

-xprefetch_level に適した値は、アプリケーションが持つキャッシュミス数によって異なります。-xprefetch_level の値を高くするほど、アプリケーションのパフォーマンスが向上する可能性が高くなります。

このオプションは、最適化レベル 3 以上、-xprefetch=auto でコンパイルされたときにのみ有効で、先読みをサポートするプラットフォーム (v8plusv8plusav9v9av9bsse2sse2asse3amdsse4asse4_1sse4_2aesavxavx_i、 avx2、 generic64、および native64) 用のコードを生成します。

-xprefetch_level=1 は、先読み命令の自動生成を有効にします。-xprefetch_level=2 は、レベル 1 を上回る追加生成を有効にします。-xprefetch_level=3 は、レベル 2 を上回る追加生成を有効にします。

デフォルトは、-xprefetch=auto を指定した場合は -xprefetch_level=1 になります。

B.2.159 -xprevise={yes|no}

コードアナライザを使用して表示できるソースコードの静的分析を生成する場合は、このオプションを指定してコンパイルします。

-xprevise=yes でコンパイルし、別の手順でリンクする場合、リンク手順でも -xprevise=yes をインクルードします。

デフォルトは -xprevise=no です。

Linux では、-xprevise=yes-xannotate とともに指定する必要があります。

詳細は、Oracle Solaris Studio コードアナライザのドキュメントを参照してください。

B.2.160 –xprofile=p

プロファイルのデータを収集したり、プロファイルを使用して最適化したりします。

p には、collect[ :profdir]、use[ :profdir]、または tcov[ :profdir] を指定する必要があります。

このオプションは、実行中の実行頻度データを収集および保存します。その後の実行で、パフォーマンスを向上させるためにこのデータを使用できます。プロファイルの収集は、マルチスレッド対応のアプリケーションにとって安全です。すなわち、独自のマルチタスク (-mt) を実行するプログラムをプロファイリングすることで、正確な結果が得られます。このオプションは、-xO2 以上の最適化レベルを指定するときにのみ有効です。コンパイルとリンクを別々の手順で実行する場合は、リンク手順とコンパイル手順の両方で同じ -xprofile オプションを指定する必要があります。

collect[:profdir]

実行頻度のデータを集めて保存します。のちに -xprofile=use を指定した場合にオプティマイザがこれを使用します。コンパイラによって文の実行頻度を測定するためのコードが生成されます。

-xMerge、-ztext、および -xprofile=collect を一緒に使用しないでください。-xMerge を指定すると、静的に初期化されたデータを読み取り専用記憶領域に強制的に配置します。 -ztext を指定すると、位置に依存するシンボルを読み取り専用記憶領域内で再配置することを禁止します。-xprofile=collect を指定すると、書き込み可能記憶領域内で、静的に初期化された、位置に依存するシンボルの再配置を生成します。

プロファイルディレクトリ名として profdir を指定すると、この名前が、プロファイル化されたオブジェクトコードを含むプログラムまたは共有ライブラリの実行時にプロファイルデータが保存されるディレクトリのパス名になります。profdir パス名が絶対パスではない場合、プログラムがオプション -xprofile=use:profdir でコンパイルされるときの現在の作業用ディレクトリの相対パスとみなされます。

—xprofile=collect: prof_dir または —xprofile=tcov: prof_dir でプロファイルディレクトリ名を指定しない場合、プロファイルデータは実行時に、program.profile という名前のディレクトリに保存されます (program はプロファイリングされたプロセスのメインプログラムのベース名)。この場合は、環境変数 SUN_PROFDATA および SUN_PROFDATA_DIR を使用して、実行時にプロファイルデータが保存される場所を制御できます。設定する場合、プロファイルデータは $SUN_PROFDATA_DIR/$SUN_PROFDATA で指定されたディレクトリに書き込まれます。プロファイルディレクトリ名がコンパイル時に指定されても、実行時に SUN_PROFDATA_DIR および SUN_PROFDATA の効果はありません。これらの環境変数は、tcov で書き込まれるプロファイルデータファイルのパスと名前を同様に制御します (tcov(1) マニュアルページを参照)。

これらの環境変数が設定されていない場合、プロファイルデータは現在のディレクトリの profdir .profile ディレクトリに書き込まれます (profdir は実行可能ファイルの名前または -xprofile=collect: profdir フラグで指定された名前)。 profdir.profile ですでに終了している場合、-xprofile では、.profileprofdir に追加されません。プログラムを複数回実行すると、実行頻度データは profdir.profile ディレクトリに蓄積されていくので、以前の実行頻度データは失われません。

別々の手順でコンパイルしてリンクする場合は、-xprofile=collect を指定してコンパイルしたオブジェクトファイルは、リンクでも必ず -xprofile=collect を指定してください。

次の例では、プログラムが構築されたディレクトリと同じディレクトリ内にある 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

次の例では、/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
use[:profdir]

プロファイリングされたコードが実行されたときに実行された作業のために最適化するときは、—xprofile=collect[: profdir] または —xprofile=tcov[: profdir] でコンパイルされたコードから収集された実行頻度データを使用します。profdir は、—xprofile=collect[: profdir] または —xprofile=tcov[: profdir] でコンパイルされたプログラムを実行して収集されたプロファイルデータを含むディレクトリのパス名です。

tcov—xprofile=use[:profdir] の両方で使用できるデータを生成するには、 —xprofile=tcov[:profdir] オプションを使用して、コンパイル時にプロファイルディレクトリを指定する必要があります。—xprofile=tcov: profdir—xprofile=use: profdir の両方で同じプロファイルディレクトリを指定する必要があります。混乱を最小限に抑えるには、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 オプションを除き、ソースファイルおよびコンパイラのほかのオプションは、フィードバックファイルを生成したコンパイル済みプログラムのコンパイルに使用したものと完全に同一のものを指定する必要があります。同じバージョンのコンパイラは、collect 構築と use 構築の両方に使用する必要があります。

-xprofile=collect:profdir を付けてコンパイルした場合は、-xprofile=use: profdir のコンパイルの最適化に同じプロファイルディレクトリ名 profdir を使用する必要があります。

収集 (collect) 段階と使用 (use) 段階の間のコンパイル速度を高める方法については、-xprofile_ircache も参照してください。

tcov[:profdir]

tcov(1) を使用する基本のブロックカバレッジ分析用の命令オブジェクトファイル。

オプションの profdir 引数を指定した場合、コンパイラは指定された場所にプロファイルディレクトリを作成します。プロファイルディレクトリに格納したデータは、tcov(1)、または -xprofile=use:profdir を指定したコンパイラで使用できます。オプションの profdir パス名を省略すると、プロファイルリングされたプログラムの実行時にプロファイルディレクトリが作成されます。プロファイルディレクトリに保存されたデータは、tcov(1) でのみ使用できます。プロファイルディレクトリの場所は、環境変数 SUN_PROFDATA および SUN_PROFDATA_DIR を使用して指定できます。

profdir で指定される場所が絶対パス名でない場合、コンパイル時に、現在の作業ディレクトリからの相対パスと解釈されます。

場所が profdir で指定されているディレクトリには、プロファイル化されたプログラムを実行するときにすべてのマシンからアクセスできる必要があります。プロファイルディレクトリはその内容が必要なくなるまで削除できません。コンパイラでプロファイルディレクトリに保存されたデータは、再コンパイルする以外復元できません。

例 1: 1 つ以上のプログラムのオブジェクトファイルが -xprofile=tcov:/test/profdata でコンパイルされる場合、/test/profdata.profile という名前のディレクトリがコンパイラによって作成されて、プロファイリングされたオブジェクトファイルを記述するデータの保存に使用されます。実行時に同じディレクトリを使用して、プロファイル化されたオブジェクトファイルに関連付けられた実行データを保存できます。

例 2: myprog という名前のプログラムが -xprofile=tcov でコンパイルされ、ディレクトリ /home/joe で実行されると、実行時にディレクトリ /home/joe/myprog.profile が作成されて、実行時プロファイルデータの保存に使用されます。

B.2.161 -xprofile_ircache[=path]

(SPARC) collect 段階で保存されたコンパイルデータを再利用して use 段階のコンパイル時間を向上するには、-xprofile=collect|use-xprofile_ircache[=path] を使用します。

大きなプログラムでは、中間データが保存されるため、use 段階のコンパイル時間の効率を大幅に向上させることができます。保存されたデータが必要なディスク容量を相当増やすことがある点に注意してください。

-xprofile_ircache[=path] を使用すると、path はキャッシュファイルが保存されているディレクトリをオーバーライドします。デフォルトでは、これらのファイルはオブジェクトファイルと同じディレクトリに保存されます。collectuse 段階が 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

B.2.162 -xprofile_pathmap

(SPARC) -xprofile=use コマンドも指定する場合は、-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 がオブジェクトファイルパス名と一致しないことが確認されるまで、オブジェクトファイルパス名と比較されます。

B.2.163 -xreduction

自動並列化での縮約のためにループを分析します。 このオプションは、-xautopar が指定する場合のみ有効です。それ以外の場合は、コンパイラは警告を発行します。

縮約の認識が有効になっている場合、コンパイラは内積、最大値発見、最小値発見などの縮約を並列化します。これらの縮約によって非並列化コードによる四捨五入の結果と異なります。

Oracle Solaris Studio OpenMP API ユーザーズガイド』も参照してください。

B.2.164 -xregs=r[,r…]

生成コード用のレジスタの使用法を指定します。

r には、applfloat、frameptr サブオプションのいずれか 1 つ以上をコンマで区切って指定します。

サブオプションの前に no% を付けるとそのサブオプションは無効になります。

—xregs サブオプションは、特定のハードウェアプラットフォームでしか使用できません。

例: -xregs=appl,no%float

表 B-41  -xregs のサブオプション
意味
appl
(SPARC) コンパイラがアプリケーションレジスタをスクラッチレジスタとして使用してコードを生成することを許可します。アプリケーションレジスタは次のとおりです。
g2g3g4 ( 32 ビットプラットフォーム)
g2g3 (64 ビットプラットフォーム)
すべてのシステムソフトウェアおよびライブラリは、-xregs=no%appl を使用してコンパイルしてください。システムソフトウェア (共有ライブラリを含む) は、アプリケーション用のレジスタの値を保持する必要があります。これらの値は、コンパイルシステムによって制御されるもので、アプリケーション全体で整合性が確保されている必要があります。
SPARC ABI では、これらのレジスタはアプリケーションレジスタと記述されています。これらのレジスタを使用すると必要なロードおよびストア命令が少なくてすむため、パフォーマンスが向上します。ただし、アセンブリコードで記述された古いライブラリプログラムとの間で衝突が起きることがあります。
float
(SPARC) コンパイラが浮動小数点レジスタを整数値用のスクラッチレジスタとして使用してコードを生成することを許可します。浮動小数点値は、このオプションに関係なくこれらのレジスタを使用する場合があります。浮動小数点レジスタへのすべての参照をコードから解放する必要がある場合は、-xregs=no%float を使用し、コードは浮動小数点型を一切使わないでください。
(x86) コンパイラが浮動小数点レジスタをスクラッチレジスタとして使用してコードを生成することを許可します。浮動小数点値は、このオプションに関係なくこれらのレジスタを使用する場合があります。浮動小数点レジスタに対するすべての参照を排除したバイナリコードを生成するには、-xregs=no%float を使用するとともに、決して浮動小数点型をソースコードで使わないようにします。コードの生成時に、コンパイラは浮動小数点、simd、または x87 の命令を使用した結果のコードを診断しようとします。
frameptr
(x86) フレームポインタレジスタ (IA32 の場合 %ebp、AMD64 の場合 %rbp) をコンパイラが汎用レジスタとして使用することを許可します。
デフォルトは -xregs=no%frameptr です。
—features=no%except によって例外も無効になっている場合を除いて、C++ コンパイラは —xregs=frameptr を無視します。-xregs=frameptr-fast の一部です。
-xregs=framptr を使用すると、コンパイラは浮動小数点レジスタを自由に使用できるので、プログラムのパフォーマンスが向上します。ただし、この結果としてデバッガおよびパフォーマンス測定ツールの一部の機能が制限される場合があります。スタックトレース、デバッガ、およびパフォーマンスアナライザは、—xregs=frameptr を使用してコンパイルされた機能についてレポートできません。
C、Fortran、C++ が混在しているコードで、C または Fortran 関数から直接または間接的に呼び出された C++ 関数が例外をスローする可能性がある場合、このコードは —xregs=frameptr でコンパイルできません。このような言語が混在するソースコードを —fast でコンパイルする場合は、コマンド行の —fast オプションのあとに —xregs=no%frameptr を追加します。
64 ビットのプラットフォームでは利用できるレジスタが多いため、—xregs=frameptr でコンパイルすると、64 ビットコードよりも 32 ビットコードのパフォーマンスが向上する可能性が高くなります。
-xpg も指定されている場合、コンパイラは -xregs=frameptr を無視し、警告を表示します。また、—xkeepframe —xregs=frameptr をオーバーライドします。たとえば、—xkeepframe=%all —xregs=frameptr は、すべての関数のスタックが保持されるはずですが、—xregs=frameptr の最適化は無視されることを示します。

SPARC のデフォルトは -xregs=appl,float です。

x86 のデフォルトは -xregs=no%frameptr,float です。

x86 システムでは、-xpg-xregs=frameptr と互換性がありません。これら 2 つのオプションを一緒に使用しないでください。-xregs=frameptr-fast に含まれている点にも注意してください。

アプリケーションにリンクする共有ライブラリ用に意図したコードは、-xregs=no%appl,float を指定してコンパイルしてください。少なくとも、共有ライブラリとリンクするアプリケーションがこれらのレジスタの割り当てを認識するように、共有ライブラリがアプリケーションレジスタを使用する方法を明示的に示す必要があります。

たとえば、大局的な方法でレジスタを使用する (重要なデータ構造体を指し示すためにレジスタを使用するなど) アプリケーションは、ライブラリと安全にリンクするため、-xregs=no%appl なしでコンパイルされたコードを含むライブラリがアプリケーションレジスタをどのように使用するかを認識する必要があります。

B.2.165 -xrestrict[=f]

ポインタ値の関数パラメータを制限付きポインタとして扱います。f は、%all%none、あるいは 1 つまたは複数の関数名のコンマ区切りリストです: {%all| %none|fn[,fn...]}。

このオプションとともに関数リストを指定する場合は、指定した関数内のポインタパラメータが制限付きとして扱われます。-xrestrict=%all を指定する場合は、C ファイル全体のすべてのポインタパラメータが制限付きとして扱われます。詳細は、制限付きポインタを参照してください。

このコマンド行オプションは独立して使用できますが、最適化時に使用するのがもっとも適しています。たとえば、このコマンドは、ファイル prog.c 内のすべてのポインタパラメータを制限付きポインタとして扱います。

%cc -xO3 -xrestrict=%all prog.c

このコマンドは、ファイル prog.c 内の関数 agc 内のすべてのポインタパラメータを制限付きポインタとして扱います。

%cc -xO3 -xrestrict=agc prog.c

デフォルトは %none です。-xrestrict を指定することは、-xrestrict=%all を指定することと同義です。

B.2.166 –xs[={yes|no}]

dbx

(Oracle Solaris) オブジェクトファイルからのデバッグ情報を実行可能ファイルにリンクします。

-xs-xs=yes と同じです。

-xdebugformat=dwarf のデフォルトは -xs=yes と同じです。

-xdebugformat=stabs のデフォルトは -xs=no と同じです。

このオプションは、実行可能ファイルのサイズ、およびデバッグのためにオブジェクトファイルを保持する必要性のトレードオフを制御します。dwarf の場合は、-xs=no を使用して実行可能ファイルを小さくしますが、オブジェクトファイルに依存しています。stabs の場合は、-xs または -xs=yes を使用してオブジェクトファイルに依存しないようにしますが、実行可能ファイルが大きくなります。このオプションは、dbx のパフォーマンスやプログラムの実行時パフォーマンスにはほとんど影響しません。

コンパイルコマンドがリンクを強制した (つまり、-c を指定しない) 場合、オブジェクトファイルはなく、デバッグ情報を実行可能ファイルに含める必要があります。この場合、-xs=no (暗黙的または明示的) は無視されます。

この機能は、コンパイラが生成されるオブジェクトファイル内のセクションフラグおよびセクション名を調整し、リンカーにそのオブジェクトファイルのデバッグ情報に関する処理を指示することによって実装されます。このため、これはコンパイラオプションであり、リンカーオプションではありません。一部のオブジェクトファイルが -xs=yes でコンパイルされ、ほかのオブジェクトファイルが -xs=no でコンパイルされた実行可能ファイルを作成することが可能です。

Linux コンパイラは -xs を受け入れますが無視します。Linux コンパイラは -xs={yes|no} を受け入れません。

B.2.167 -xsafe=mem

(SPARC) コンパイラが記憶域保護違反が発生した場合を前提とできるようにします。

このオプションを使用すると、コンパイラでは SPARC V9 アーキテクチャーで違反のないロード命令を使用できます。


注 -  アドレスの位置合わせが合わない、またはセグメンテーション侵害などの違反が発生した場合は違反のないロードはトラップを引き起こさないので、このオプションはこのような違反が起こる可能性のないプログラムでしか使用しないでください。ほとんどのプログラムではメモリーに関するトラップは起こらないので、大多数のプログラムでこのオプションを安全に使用できます。例外条件の処理にメモリーベースのトラップを明示的に使用するプログラムでは、このオプションは使用しないでください。

このオプションは、最適化レベルの –xO5 と、次のいずれかの値の –xarch を組み合わせた場合にだけ有効です: m32m64 の両方で sparcsparcvis–sparcvis2、または –sparcvis3

B.2.168 -xsegment_align=n

(Oracle Solaris) このオプションを指定すると、ドライバはリンク行で特殊なマップファイルをインクルードします。マップファイルはテキスト、データ、および bss セグメントを、n で指定された値に整列します。非常に大きなページを使用する場合は、ヒープセグメントおよびスタックセグメントが適切な境界に整列されることが重要です。これらのセグメントが整列されない場合、次の境界まで小さなページが使用され、この結果、パフォーマンスが低下することがあります。マップファイルにより、セグメントは確実に適切な境界上に整列されます。

n の値は次のいずれかである必要があります。

SPARC: 有効な値は、8K64K512K2M4M32M256M1G、および none です。

x86: 有効な値は、4K8K64K512K2M4M32M256M1G、および none です。

SPARC と x86 のデフォルトはどちらも none です。

推奨の使用法は次のとおりです。

SPARC 32-bit compilation: -xsegment_align=64K
SPARC 64-bit compilation: -xsegment_align=4M

x86 32-bit compilation: -xsegment_align=8K
x86 64-bit compilation: -xsegment_align=4M

ドライバは適切なマップファイルをインクルードします。たとえば、ユーザーが -xsegment_align=4M と指定した場合、ドライバは -Minstall-directory/lib/compilers/mapfiles/map.4M.align をリンク行に追加します。install-directory はインストールディレクトリです。前述のセグメントは、4M 境界上に整列されます。

B.2.169 -xsfpconst

接尾辞のない浮動小数点定数を、デフォルトの倍精度モードではなく、単精度として表します。-pedantic とともに指定した場合は無効となります。

B.2.170 -xspace

コードサイズを増やすループの最適化や並列化を行いません。

例: コードサイズが増える場合は、ループの展開や並列化は行われません。

B.2.171 -xstrconst

このオプションは非推奨であり、将来のリリースで削除される可能性があります。 —xstrconst —features=conststrings の別名です。

B.2.172 -xtarget=t

命令セットと最適化の対象となるシステムを指定します。

t の値は、nativegenericnative64generic64、または system-name のいずれかである必要があります。

-xtarget に指定する値は、-xarch-xchip-xcache の各オプションの値に展開されます。実行中のシステムで -xtarget=native の展開を調べるには、-xdryrun コマンドを使用します。

たとえば、-xtarget=ultra4-xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2 と同義です。


注 -  特定のホストプラットフォームで -xtarget を展開した場合、そのプラットフォームでコンパイルすると -xtarget=native と同じ -xarch-xchip、または -xcache 設定にならない場合があります。
表 B-42  すべてのプラットフォームでの -xtarget の値
意味
native
次と同義です。
—m32 —xarch=native —xchip=native —xcache=native
ホスト 32 ビットシステムに最高のパフォーマンスを与えます。
native64
次と同義です。
—m64 —xarch=native64 —xchip=native64 —xcache=native64
ホスト 64 ビットシステムに最高のパフォーマンスを与えます。
generic
次と同義です。
—m32 —xarch=generic —xchip=generic —xcache=generic
ほとんどの 32 ビットシステムに最高のパフォーマンスを与えます。
generic64
次と同義です。
—m64 —xarch=generic64 —xchip=generic64 —xcache=generic64
ほとんどの 64 ビットシステムに最高のパフォーマンスを与えます。
system-name
指定するシステムで最高のパフォーマンスが得られます。
対象となる実際のシステムを表すシステム名を、次のリストから選択してください。

対象となるハードウェア (コンピュータ) の正式な名前をコンパイラに指定した方がパフォーマンスが優れているプログラムもあります。プログラムパフォーマンスがクリティカルな場合、ターゲットハードウェアの適切な指定は、より新しい SPARC プロセッサ上での実行時は特に、非常に重要である可能性があります。しかし、ほとんどのプログラムおよび旧式の SPARC システムではパフォーマンスの向上はわずかであるため、汎用的な指定方法で十分です。

B.2.172.1 SPARC プラットフォームの –xtarget の値

SPARC または UltraSPARC V9 で 64 ビット Oracle Solaris ソフトウェアをコンパイルすることは、–m64 オプションで示されます。–xtargetnative64 または generic64 以外のフラグとともに指定する場合は、–xtarget=ultra ... –m64 のように、–m64 オプションも指定する必要があります。そうでない場合は、コンパイラは 32 ビットメモリーモデルを使用します。

表 B-43  SPARC での -xtarget 展開
-xtarget=
-xarch
-xchip
-xcache
ultra
sparcvis
ultra
16/32/1:512/64/1
ultra1/140
sparcvis
ultra
16/32/1:512/64/1
ultra1/170
sparcvis
ultra
16/32/1:512/64/1
ultra1/200
sparcvis
ultra
16/32/1:512/64/1
ultra2
sparcvis
ultra2
16/32/1:512/64/1
ultra2/1170
sparcvis
ultra
16/32/1:512/64/1
ultra2/1200
sparcvis
ultra
16/32/1:1024/64/1
ultra2/1300
sparcvis
ultra2
16/32/1:2048/64/1
ultra2/2170
sparcvis
ultra
16/32/1:512/64/1
ultra2/2200
sparcvis
ultra
16/32/1:1024/64/1
ultra2/2300
sparcvis
ultra2
16/32/1:2048/64/1
ultra2e
sparcvis
ultra2e
16/32/1:256/64/4
ultra2i
sparcvis
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
T3
sparcvis3
ultraT3
8/16/4:6144/64/24
T4
sparc4
T4
16/32/4:128/32/8:4096/64/16
sparc64vi
sparcfmaf
sparc64vi
128/64/2:5120/64/10
sparc64vii
sparcima
sparc64vii
64/64/2:5120/256/10
sparc64viiplus
sparcima
sparc64viiplus
64/64/2:11264/256/11
sparc64x
sparcace
sparc64x
64/128/4/2:24576/128/24/32
sparc64xplus
sparcaceplus
sparc64xplus
64/128/4/2:24576/128/24/32
T5
sparc4
T5
16/32/4/8:128/32/8/8:8192/64/16/128
M5
sparc4
M5
16/32/4/8:128/32/8/8:49152/64/12/48

注 -  廃止されており、今後のリリースで削除される予定の SPARC -xtarget 値は、 ultraultra1/140ultra1/170ultra1/200ultra2ultra2eultra2iultra2/1170ultra2/1200ultra2/1300ultra2/2170ultra2/2200ultra2/2300ultra3ultra3cuultra3iultra4、および ultra4plus です。

B.2.172.2 x86 プラットフォームの –xtarget の値

64 ビット x86 プラットフォームで 64 ビット Oracle Solaris ソフトウェアをコンパイルすることは、–m64 オプションで示されます。–xtargetnative64 または generic64 以外のフラグとともに指定する場合は、次のように–m64 オプションも指定する必要があります。

–xtarget=opteron ... –m64

そうでない場合は、コンパイラは 32 ビットメモリーモデルを使用します。

表 B-44  x86 での -xtarget の展開
-xtarget=
-xarch
-xchip
-xcache
pentium
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
opteron
sse2a
opteron
64/64/2:1024/64/16
woodcrest
ssse3
core2
32/64/8:4096/64/16
barcelona
amdsse4a
amdfam10
64/64/2:512/64/16
penryn
sse4_1
penryn
2/64/8:6144/64/24
nehalem
sse4_2
nehalem
32/64/8:256/64/8:8192/64/16
westmere
aes
westmere
32/64/8:256/64/8:30720/64/24
sandybridge
avx
sandybridge
32/64/8/2:256/64/8/2:20480/64/20/16
ivybridge
avx_i
ivybridge
32/64/8/2:256/64/8/2:20480/64/20/16
haswell
avx2
haswell
32/64/8/2:256/64/8/2:20480/64/20/16

B.2.173 -xtemp=path

-temp=path と同義です。

B.2.174 -xthreadvar[=o]

スレッドローカルな変数の実装を制御するには -xthreadvar を指定します。コンパイラのスレッドローカルな記憶領域機能を利用するには、このオプションを __thread 宣言指定子と組み合わせて使用します。__thread 指定子を使用してスレッド変数を宣言したあとは、-xthreadvar を指定して動的 (共有) ライブラリの位置に依存しないコード (PIC 以外のコード) でスレッド固有の記憶領域を使用できるようにします。__thread の使用方法についての詳細は、スレッドローカルな記憶領域指示子を参照してください。

odynamic または no%dynamic である必要があります。

表 B-45  -xthreadvar のフラグ
フラグ
意味
[no%]dynamic
動的ロード用の変数をコンパイルします。
-xthreadvar=no%dynamic を指定すると、スレッド変数へのアクセスは非常に早くなりますが、動的ライブラリ内のオブジェクトファイルは使用できません。すなわち、実行可能ファイル内のオブジェクトファイルだけが使用可能です。

-xthreadvar を指定しない場合、コンパイラが使用するデフォルトは位置独立コード (PIC) が有効になっているかどうかによって決まります。位置独立コードが有効になっている場合、オプションは -xthreadvar=dynamic に設定されます。位置独立コードが無効になっている場合、オプションは -xthreadvar=no%dynamic に設定されます。

-xthreadvar を指定するけれども値を指定しない場合は、オプションは -xthreadvar=dynamic に設定されます。

位置独立ではないコードが動的ライブラリに含まれる場合、-xthreadvar を指定する必要があります。

リンカーは、動的ライブラリ内の位置依存コード (非 PIC) スレッド変数と同等のスレッド変数はサポートできません。PIC でないスレッド変数は非常に高速なため、実行可能ファイルのデフォルトにするべきです。

-xcode-KPIC、および -Kpic の説明も参照してください。

B.2.175 -xthroughput[={yes|no}]

-xthroughput オプションは、システム上で多数のプロセスが同時に実行されている状況でアプリケーションが実行されることをコンパイラに示します。

-xthroughput=yes を指定すると、コンパイラは、単一のプロセスのパフォーマンスは若干低下するが、システム上のすべてのプロセスによって実行される作業量が増加するように最適化を行います。たとえば、コンパイラがデータの先読みの積極性を下げることを選択する可能性があります。そのように選択すると、そのプロセスによって消費されるメモリー帯域幅が減少し、プロセスの実行が遅くなることがありますが、ほかのプロセスが共有するメモリー帯域幅が増加します。

デフォルトは -xthroughput=no です。

B.2.176 -xtime

コンパイルの各コンポーネントが占有した実行時間とリソースを報告します。

B.2.177 -xtransition

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

  • ISO C では operator の意味が変わります。明示的なキャストを使用してください。

B.2.178 -xtrigraphs[={yes|no}]

-xtrigraphs オプションは、コンパイラが ISO C 規格で定義されている 3 文字表記シーケンスを認識するかどうかを決定します。

デフォルトにより、コンパイラは -xtrigraphs=yes を仮定し、コンパイル単位をとおしてすべての三文字表記シーケンスを認識します。

コンパイラが 3 文字表記シーケンスとして解釈している疑問符 (?) が含まれるリテラル文字列がソースコードにある場合は、-xtrigraph=no サブオプションを使用して 3 文字表記シーケンスの認識を無効にできます。-xtrigraphs=no オプションは、コンパイル単位全体ですべての 3 文字表記シーケンスの認識を無効にします。

次の例は、ソースファイル 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 (??)

B.2.179 -xunboundsym={yes|no}

動的に結合されたシンボルへの参照がプログラムに含まれているかどうかを指定します。

-xunboundsym=yes は、動的に結合されたシンボルへの参照がプログラムに含まれていることを意味します。

-xunboundsym=no は、動的に結合されているシンボルへの参照がプログラムに含まれていないことを意味します。

デフォルトは -xunboundsym=no です。

B.2.180 -xunroll=n

ループを n 回展開するようオプティマイザに指示します。n は正の整数です。n が 1 のとき、ループを展開しないようコンパイラに要求します。n が 1 より大きいとき、-xunroll=n は、該当する場合にループを n 回展開することをコンパイラに推奨します。

B.2.181 -xustr={ascii_utf16_ushort|no}

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_ustf16_ushort は、U"ASCII_string" 文字列リテラルを一緒に指定しなくても指定できます。

-std=c11 (デフォルトを含む) が有効である場合、フラグ -xustr=ascii_utf16_ushort を指定するとエラーになります。-xustr=ascii_utf16_ushort を指定した場合は、-Xc-Xa-Xt-Xs-xc99-std=c99-std=c89、または -ansi のいずれかも指定する必要があります。

すべてのファイルを、このオプションによってコンパイルしなければならないわけではありません。

次の例では、前に 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';

B.2.182 -xvector[=a]

SIMD (Single Instruction Multiple Data) をサポートする x86 プロセッサで、ベクトルライブラリ関数への呼び出しの自動生成や、SIMD 命令の生成を有効にします。このオプションを使用するときは -fround=nearest を指定することによって、デフォルトの丸めモードを使用する必要があります。

次の表は、a の値の一覧です。no% 接頭辞は関連付けられたサブオプションを無効にします。

表 B-46  -xvector のフラグ
意味
[no%]lib
(Oracle Solaris) コンパイラは可能な場合はループ内の数学ライブラリへの呼び出しを、同等のベクトル数学ルーチンへの単一の呼び出しに変換します。大きなループカウントを持つループでは、これによりパフォーマンスが向上します。このオプションを無効にするには no%lib を使用します。
[no%]simd
(SPARC) -xarch=sparcace-xarch=sparcaceplus の場合、特定のループのパフォーマンスを改善するために、浮動小数点および整数の SIMD 命令を使用するようにコンパイラに指示します。ほかの SPARC プラットフォームの場合とは反対に、-xvector=simd は、-xvector=none および -xvector=no%simd を除き、任意の -xvector オプションを指定した -xarch=sparcace および -xarch=sparcaceplus のもとで常に有効です。さらに、-xvector=simd には 3 よりも大きい -O が必要であり、それ以外の場合はスキップされ、警告は発行されません。
ほかのすべての -xarch 値の場合、特定のループのパフォーマンスを改善するために Visual Instruction Set [VIS1、VIS2、ViS3 など] SIMD 命令を使用するようにコンパイラに指示します。基本的に -xvector=simd オプションを明示的に使用すると、コンパイラは、ループ繰り返し数を減らすためにループ変換を実行して、特殊なベクトル化した SIMD 命令の生成を有効にします。-xvector=simd オプションは、-O が 3 より大きく -xarchsparcvis3 以上である場合にのみ有効です。それ以外の場合、-xvector=simd はスキップされ、警告は発行されません。
[no%]simd
(x86) コンパイラにネイティブ x86 SSE SIMD 命令を使用して特定のループのパフォーマンスを向上させるよう指示します。ストリーミング拡張機能は、x86 で最適化レベルが 3 かそれ以上に設定されている場合にデフォルトで使用されます。このオプションを無効にするには no%simd を使用します。
コンパイラは、ストリーミング拡張機能がターゲットのアーキテクチャーに存在する場合、つまりターゲットの ISA が SSE2 以上である場合にのみ SIMD を使用します。たとえば、最新のプラットフォームで -xtarget=woodcrest、—xarch=generic64、-xarch=sse2、-xarch=sse3、または -fast を指定して使用できます。ターゲットの ISA にストリーミング拡張機能がない場合、このサブオプションは無効です。
%none
このオプションを完全に無効にします。
yes
これは非推奨であり、代わりに -xvector=lib を指定します。
no
これは非推奨です。代わりに -xvector=%none を指定してください。

デフォルトは、x86 では -xvector=simd で、SPARC プラットフォームでは -xvector=%none です。サブオプションなしで -xvector を指定すると、コンパイラは x86 Solaris では -xvector=simd,lib、SPARC Solaris では -xvector=lib、Linux プラットフォームでは -xvector=simd と想定します。

-xvector オプションを指定するには、最適化レベルが -xO3 かそれ以上に設定されていることが必要です。最適化レベルが指定されていない場合や —xO3 よりも低い場合はコンパイルは続行されず、メッセージが表示されます。


注 -  x86 プラットフォーム向けの Oracle Solaris カーネルコードをコンパイルするときは、-xvector=%none を指定してコンパイルします。

コンパイラは、リンク時に libmvec ライブラリを取り込みます。別々の手順でコンパイルおよびリンクする場合は、同じ -xvector オプションを両方のコマンドで使用します。

B.2.183 -xvis

(SPARC) -xvis=[yes|no] コマンドは、vis.h ヘッダーを使用して VIS 命令を生成するときや、VIS 命令を使用するアセンブラインラインコード (.il) を使用するときに使用します。デフォルトは -xvis=no です。-xvis と指定すると -xvis=yes と指定した場合と同様の結果が得られます。

VIS 命令セットは、SPARC-V9 命令セットの拡張機能です。UltraSPARC プロセッサが 64 ビットの場合でも、多くの場合、特にマルチメディアアプリケーションではデータサイズが 8 ビットまたは 16 ビットに制限されています。VIS 命令は 1 つの命令で 4 つの 16 ビットデータを処理できるので、画像、線形代数、信号処理、オーディオ、ビデオ、ネットワーキングなどの新しいメディアを扱うアプリケーションのパフォーマンスが大幅に向上させます。

B.2.184 -xvpara

OpenMP を使用するときに正しくない結果をもたらす可能性のある、並列プログラミングに関連する潜在的な問題に関して、警告を発行します。-xopenmp および OpenMP API 指令とともに使用します。

次の状況が検出された場合は、コンパイラは警告を発行します。

  • 異なるループ繰り返し間でデータに依存関係がある場合に、MP 指令を使用して並列化されたループ。

  • OpenMP データ共有属性節に問題がある場合。たとえば、変数「shared」を宣言するとき (OpenMP 並列領域でのアクセスがデータ競合を招く可能性がある) や、変数「private」を宣言するとき (並列領域内のその値が並列領域のあとで使用される) です。

すべての並列化命令が問題なく処理される場合、警告は表示されません。

例:

cc -xopenmp -vpara any.c

B.2.185 -Yc, dir

コンポーネント c の場所として新しい dir を指定します。c-W オプションで示したコンポーネントを表す文字です。

コンポーネントの検索が指定されている場合、ツールのパス名は dir/tool になります。2 つ以上の -Y オプションが 1 つの項目に適用されている場合には、最後に指定されたものが有効です。

B.2.186 -YA, dir

コンパイラのすべてのコンポーネントの検索場所にするディレクトリ dir を指定します。dir 内でコンポーネントが見つからない場合は、コンパイラがインストールされているディレクトリに戻って検索されます。

B.2.187 -YI, dir

include ファイルを検索するデフォルトディレクトリを変更します。

B.2.188 -YP, dir

ライブラリファイルを検索するデフォルトのディレクトリを変更します。

B.2.189 -YS, dir

起動用のオブジェクトファイルのデフォルトのディレクトリを変更します。

B.2.190 -Zll

(SPARC) lock_lint 用にプログラムデータベースを作成しますが、実行可能コードは生成しません。詳細は、lock_lint(1) のマニュアルページを参照してください。

B.3 リンカーに渡されるオプション

cc-a-e-r-t-u-z を認識し、これらのオプションとその引数を ld に渡します。cc は認識できないオプションを警告付きで ld に渡します。Oracle Solaris プラットフォームでは、-i オプションとその引数もリンカーに渡されます。

B.4 ユーザー指定のデフォルトオプションファイル

これらのデフォルトコンパイラオプションファイルは、ユーザーがすべてのコンパイルに適用される (ほかの方法で上書きされる場合を除く)、一連のデフォルトオプションを指定することを許可します。たとえば、ファイルによって、すべてのコンパイルのデフォルトを —xO2 としたり、またはファイル setup.il を自動的に含めたりするように指定できます。

コンパイラは起動時に、すべてのコンパイルに含めるべきデフォルトオプションがリストされているデフォルトオプションファイルを検索します。環境変数 SPRO_DEFAULTS_PATH は、デフォルトファイルを検索するディレクトリのコロン区切りリストを指定します。

環境変数が設定されていない場合、標準のデフォルトセットが使用されます。環境変数が設定されているが空の場合、デフォルトは使用されません。

デフォルトのファイル名は compiler.defaults の形式である必要があり、ここで、コンパイラは cc、c89、c99、CC、ftn、または lint のいずれかです。たとえば、C コンパイラ用のデフォルトは cc.defaults です。

SPRO_DEFAULTS_PATH にリストされたディレクトリにコンパイラ用のデフォルトファイルが見つかった場合、コンパイラはファイルを読み取り、コマンド行でオプションを処理する前にオプションを処理します。最初に見つかったデフォルトファイルが使用され、検索は終了します。

システム管理者は、システム全体のデフォルトファイルを Studio-install-path/lib/compilers/etc/config に作成できます。環境変数が設定されている場合、インストールされたデフォルトファイルは読み取られません。

デフォルトファイルの形式はコマンド行と同様です。ファイルの各行には、1 つ以上のコンパイラオプションを空白で区切って含めてもかまいません。ワイルドカードや置換などのシェル展開は、デフォルトファイル内のオプションには適用されません。

—#、—###、および —dryrun の各オプションによって生成される詳細出力では、SPRO_DEFAULTS_PATH の値と、完全展開されたコマンド行が表示されます。

ユーザーによってコマンド行で指定されたオプションは、通常、デフォルトファイルから読み取られたオプションをオーバーライドします。たとえば、—xO4 でのコンパイルがデフォルトファイルで指定されており、ユーザーがコマンド行で —xO2 を指定した場合、—xO2 が使用されます。

デフォルトオプションファイルに記載されているオプションの一部は、コマンド行で指定されたオプションのあとに付加されます。これらは、プリプロセッサオプション —I、リンカーオプション —B、—L、—R —l、および、ソースファイル、オブジェクトファイル、アーカイブ、共有オブジェクトなどのすべてのファイル引数です。

次に示すのは、ユーザー指定のデフォルトコンパイラオプション起動ファイルがどのように使用される可能性があるかの例です。

demo% cat /project/defaults/cc.defaults
-I/project/src/hdrs —L/project/libs —llibproj —xvpara
demo% setenv SPRO_DEFAULTS_PATH  /project/defaults
demo% cc —c —I/local/hdrs —L/local/libs —lliblocal tst.c

現在、このコマンドは次と同義です。

cc -fast —xvpara —c —I/local/hdrs —L/local/libs —lliblocal tst.c \ 
     —I/project/src/hdrs —L/project/libs —llibproj

コンパイラデフォルトファイルはプロジェクト全体のデフォルトを設定するための便利な方法ですが、問題の診断を困難にする原因になる場合もあります。このような問題を回避するには、環境変数 SPRO_DEFAULTS_PATH を現在のディレクトリではなく絶対パスに設定します。

デフォルトオプションファイルのインタフェース安定性はコミットされていません。オプション処理の順序は、将来のリリースで変更される可能性があります。