| C ユーザーズガイド |
第 2 章
ccコンパイラオプションこの章では、C コンパイラのオプションについて説明します。説明項目は次のとおりです。
旧式の K&R C プログラムを ANSI/ISO C に移植する場合には、32ページ以降で説明する
-X(互換性) フラグ-X[a|c|s|t]に特に注意してください。このフラグを使用すると、ANSI/ISO C への移植が簡単になります。ANSI/ISO C への移行については、「ANSI/ISO C への移行」も参照してください。オプションの構文
%cc[<オプション>] <ファイル名> [<ライブラリ>]...
- <オプション> は、「cc オプション」で説明している各種のオプション (複数指定可) です。
- <ファイル名> は、実行可能プログラムの作成に使用するファイル名 (複数指定可) です。
ccは <ファイル名> で指定されたファイルリストに含まれている C ソースファイルとオブジェクトファイルのリストを受け取ります。生成された実行可能コードは、-oオプションを使用した場合を除いてa.outに出力されます。-oオプションを使用した場合には、コードは-oオプションで指定したファイルに出力されます。ccは次のファイルのどのような組み合わせに対しても、コンパイルとリンクを行うことができます。
- <ライブラリ> は複数の標準ライブラリやユーザー提供のライブラリです。ライブラリには関数、マクロ、そして定数の定義が含まれます。
ライブラリの検索に使用するデフォルトのディレクトリを変更する場合は、
-YP, <ディレクトリ> を参照してください。<ディレクトリ> には、複数のパスをコロンで区切って指定します。ccのデフォルトのライブラリ検索は、次の順序で行われます。
/opt/SUNWspro/WS6/lib/usr/ccs/lib/usr/lib
ccはgetoptを使用してコマンド行オプションの構文を解析します。オプションは単一文字、または後ろに引数を 1 つとる単一文字によって指定します。getopt(3c) のマニュアルページも参照してください。オプションの一覧
この節では、簡単に参照できるように、コンパイラオプションを機能ごとに分けて示します。オプションの詳細については、この後の節を参照してください。次の表は、
ccコンパイラオプションを機能ごとに要約したものです。一部のフラグは複数の目的で使用されているため、複数箇所に記載されています。
ccオプションこの項では
ccオプションをアルファベット順に説明します。これらの説明はcc(1) のマニュアルページでも見ることができます。1 行に要約した説明が必要な場合は、cc-flagsオプションを使用してください。特定のプラットフォームに固有と表記されたオプションを別のプラットフォームで使用してもエラーは起きません。単に無視されます。オプションおよび引数で使用している表記方法については、「関連マニュアル」 を参照し てください。
-#冗長モードでコンパイラを動作させます。呼び出された各構成要素が表示されます。
-###
-A<名前>[(<トークン>)]<名前> を述語として <トークン> と関連付けます。
#assert前処理指令を実行するのと同様です。
- 事前表明 (preassertion):
-Xcモードの場合、以下の事前表明は有効になりません。
-B[static|dynamic]リンク時に結合するライブラリを静的と動的のどちらにするかを指定します。
static(静的) と指定するとライブラリが非共有ライブラリであることを示し、dynamic(動的) と指定すると共有ライブラリであることを示します。
-Bdynamicを指定すると、-lIオプションが指定されていれば、リンカーはlibx.soというファイルを探し、次にlibx.aというファイルを探します。
-Bstaticを指定すると、リンカーはlibx.aというファイルだけを探します。このオプションは、コマンド行中で何度も指定して、切り替えることができます。このオプションと引数はldに渡されます。
注 - Solaris の 64 ビットコンパイル環境では、多くのシステムライブラリ (libcなど) は、動的ライブラリのみ使用することができます。このため、コマンド行の最後に-Bstaticを使用しないでください。
-CC プリプロセッサがコメントを削除しないようにします。ただし前処理指令の行にあるコメントは削除されます。
-c
ld(1) を使用するリンクを行わずに、ソースファイルごとに.oファイルを作成します。-oオプションを使用すると、1 つのオブジェクトファイルを明示的に指定することができます。各.iまたは.c入力ファイルのオブジェクトコードを作成する場合、コンパイラは常に現在の作業ディレクトリ内にオブジェクト (.o) ファイルを作成します。リンクを行わないと、オブジェクトファイルの削除も行われません。
-D<名前>[=<トークン>]
#define前処理指令が行うように、 <名前> を <トークン> に関連付けます。
「=<トークン>」を省略した場合はトークンとして 1 が使用されます。事前定義
:次の事前定義は-Xcモードの場合は無効です。
__sparcv9(-Xarch=v9,v9a)__sun__unix__SUNPRO_C=0x510__`uname -s`_`uname -r`(例: __SunOS_5_7)__sparc(SPARC)__i386(x86)__BUILTIN_VA_ARG_INCR__SVR4__RESTRICTは、-Xaおよび-Xtモードでのみ有効です。コンパイラでは、__
PRAGMA_REDEFINE_EXTNAMEのようなオブジェクト形式のマクロを定義しておくことにより、プラグマを認識させることができます。
-d[y|n]
-dyはリンクエディタに動的なリンクを指定します (デフォルト)。
注 - Solaris 7 の 64 ビットコンパイル環境では、多くのシステムライブラリは、動的ライブラリのみ使用することができます。このため、このオプションと-Xarch=v9を組み合わせると、致命的なエラーになります。
-dalign
-dalignは、-xmemalign=8sを指定することと同じです。56 ページの「-xmemalign=ab」を参照してください。
-Eソースファイルの前処理だけを行い、結果を
stdoutに出力します。プリプロセッサはコンパイラ内部に直接組み込まれます (/usr/ccs/lib/cppが直接呼び出される-Xsモードの場合を除きます)。プリプロセッサの行番号付け情報も含みます (「-P」を参照してください)。
-erroff=t
cc警告メッセージを抑制します。エラーメッセージには影響しません。t には、以下の 1 つまたは複数の項目をコンマで区切って指定します。
指定順序によって実行内容が異なります。たとえば、「
%all,no%<タグ>」と指定すると、<タグ> 以外のすべての警告メッセージを抑制します。次の表は、-erroffの値を示しています。
表 2-2 -erroffの引数<タグ> <タグ> のリストに指定されているメッセージを抑制します。-errtags=yesオプションを使用すればメッセージのタグを表示することができます。no%<タグ><タグ> 以外のすべての警告メッセージを抑制します。 %allすべての警告メッセージを抑制します。 %noneすべてのメッセージの抑制を解除します (デフォルト)。
デフォルトは
-erroff=%noneです。-erroffと指定すると、-erroff=%allを指定した場合と同じ結果が得られます。エラーメッセージの抑制は、さらに細かく制御することができます。「#pragma error_messages(on|off|default,<タグ>... <タグ>)」を参照してください。
-errtags=aa には
yesまたはnoのいずれかを指定します。デフォルトは-errtags=noです。-errtagsと指定すると、-errtags=yesを指定した場合と同じ結果が得られます。
-errwarn=t指定された警告メッセージが表示された場合に、
ccはエラーステータスを返して終了します。t には、<タグ>、no%<タグ>、%all、%noneのうちの 1 つ以上をコンマで区切って指定します。指定する順序は重要です。たとえば、「%all,no%<タグ>」と指定した場合、<タグ> 以外の警告が発行されると、ccは致命的エラーステータスを返して終了します。-errwarnの値を以下に示します。
デフォルトは
-errwarn=%noneです。-errwarnとだけ指定することは、-errwarn=%allと指定することと同じです。
-fastパフォーマンスを向上するために、各種コンパイラオプションの最適の組み合わせを選択します。これにより、大部分のアプリケーションを対象としてほぼ最大限のパフォーマンスが得られるようになります。
-fastを使用してコンパイルしたモジュールは、必ず-fastでリンクしなければなりません。
-fastオプションは、コンパイルを行なったマシンとは別のマシンでプログラムを実行する場合には適していません。このような場合は、-fastの後に該当するxtargetオプションを指定します。たとえば、次のとおりです。
cc -fast -xtarget=ultra ...SVID によって規定された例外処理に依存する C モジュールに対しては、
-fastの後に-xnolibmilを指定します。
%cc -fast -xnolibmil
-xlibmilを使用すると、例外発生時でもerrnoが設定されなかったり、あるいはmatherr(3m) が呼び出されません。
-fastオプションは、厳密な IEEE 754 規格準拠を必要とするプログラムには適して
いません。次に、
-fastにより指定されるオプションをプラットフォームごとに示します。
オプション SPARC x86 -dalign○ -- -fns○ ○ -fsimple=2○ -- -ftrap=%none○ ○ -xlibmil○ ○ -xtarget=native○ ○ -nofstore-- ○ -xO5○ ○ -fsingle○ ○
-fastはコマンド行でマクロ展開のように動作します。したがって、最適化レベルとコード生成の内容を、-fastの後に指定したオプションで指定した場合は、-fastでの指定は無視されます。「-fast-xO4」でコンパイルすることは「-xO2-xO4」の組み合わせでコンパイルすることと同じで、後ろの指定が優先されます。前回のリリースでは、
-fastのマクロオプションには-fnonstdが含まれていましたが、今回のリリースでは、-fnsに置き換えられています。このオプションを使用すれば、大部分のプログラムのパフォーマンスを向上させることができます。
このオプションは、IEEE 規格例外処理に依存するプログラムには使用しないでください。数値結果が異なったり、プログラムが途中で終了したり、予想外の SIGFPE シグナルが発生する可能性があります。
-fd
-flags
-fnonstd浮動小数点演算ハードウェアの非標準の初期化を行います。
-fnonstdオプションを使用すると、浮動小数点のオーバーフロー、ゼロによる除算、不正演算例外に対し、ハードウェアによるトラップが可能になります。これらの例外はSIGFPEシグナルに変換されます。プログラムがSIGFPEハンドラを持っていないときは、メモリーダンプを行なってプログラムを終了します。デフォルトでは、IEEE 754 の浮動小数点演算機能は無停止であり、アンダーフローは段階的です (詳細については 「非標準浮動小数点」参照)。
(SPARC)
-fnsと-ftrap=commonを指定することと同等です。
-fns[={no,yes}]デフォルトは
-fns=noで、SPARC 標準浮動小数点モードです。オプションの
=yesまたは=noを使用すると、-fastのように、-fnsを含む他のマクロフラグに続く-fnsフラグを切り替えることができます。このフラグを設定すると、プログラムが実行を開始するときに、非標準の浮動小数点モードが有効になります。デフォルトでは、非標準の浮動小数点モードは自動的に有効になりません。一部の SPARC システムでは、非標準の浮動小数点モードは「段階的アンダーフロー」を無効にします。つまり、小さな結果は、非正規数にはならず、ゼロに切り捨てられます。また、非正規オペランドはメッセージなしにゼロに変更されます。段階的アンダーフローと非正規数をハードウェアでサポートしていない SPARC システムでこのオプションを使用すると、プログラムによってはパフォーマンスが飛躍的に上がることがあります。
非標準モードを有効にすると、浮動小数点演算は IEEE 754 規格に準拠しない結果を生成する場合があります。詳細は、『数値計算ガイド』を参照してください。
このオプションは、SPARC システム上だけで有効であり、さらに、メインプログラムをコンパイルするときに使用する場合だけ有効です。x86 システムでは、このオプションは無視されます。
-fprecision=p(x86)
-fprecision={single、double、extended}
浮動小数点制御ワードの丸め精度モードのビットを、単精度 (24 ビット)、倍精度 (53 ビット) または拡張精度 (64 ビット) に設定します。デフォルトの浮動小数点丸め精度モードは拡張モードです。
注 - Intel では、浮動小数点丸め精度モードの設定は精度に対してのみ影響します。指数の有効範囲に対しては影響しません。
-fround=rプログラム初期化中の実行時に確立される IEEE 754 小数点丸めモードを設定します。
r は、
nearest、tozero、negative、positiveのうちのいずれかです。r を
tozero、negative、positiveのいずれかにすると、プログラムが実行を開始するときに、丸め方向モードがそれぞれ、ゼロの方向に丸める、負の無限の方向に丸める、 正の無限の方向に丸めるに設定されます。r がnearestのとき、あるいは-froundフラグを使用しないとき、丸め方向モードは初期値から変更されません (デフォルトはnearest)。このオプションは、メインプログラムのコンパイル時に使用する場合だけ有効です。
-fsimple[=n]オプティマイザが浮動小数点演算に関する前提事項を単純化できるようにします。
n を指定する場合は、0、1、2 のいずれかでなければなりません。デフォルトは次のとおりです。
-fsimple=0
- 前提事項の単純化を行えないようにします。厳密に IEEE 754 に準拠します。
-fsimple=1
- 適度の単純化を行えるようにします。生成されるコードは IEEE 754 に厳密には準拠しませんが、大部分のプログラムの数値結果は変化しません。
-fsimple=1を指定すると、オプティマイザは以下の事項を前提とします。
- IEEE 754 のデフォルトの丸めとトラップモードは、プロセスの初期化後は変化しない。
- 浮動小数点の数値例外以外には、目に見える結果が生じない演算は削除できる。
- オペランドに無限または NaN をもつ演算は、その結果に NaN を伝達する必要はない。たとえば、
x*0は0で置き換えられる。- 演算はゼロの符号に依存しない。
-fsimple=1を指定した場合は、オプティマイザは必ず四捨五入や数値例外に応じた処理を行います。特に浮動小数点演算は、実行時に定数化される四捨五入モードでは異なる結果を生じる演算と、置き換えることはできません。-fastマクロフラグを使用すると、-fsimple=1に設定されます。-fsimple=2
- 高度な浮動小数点最適化を行うことができ、丸めの変化によって、多くのプログラムが異なる数値結果を生じる可能性があります。たとえば、あるループ内に
x/yの演算があった場合、x/yがループ内で少なくとも 1 回は必ず評価され、z=1/yで、ループの実行中にyが一定の値をとることが明らかである場合、オプティマイザはx/yの演算をすべてx*zで置き換えます。本来浮動小数点例外を発生しないプログラムならば、
-fsimple=2を指定してもオプティマイザが浮動小数点例外を発生させることはありません。
-fsingle(
-Xtモードまたは-Xsモードの場合に限り)float式を倍精度ではなく単精度で評価します。-Xaモードまたは-Xcモードを使用している場合、float式はすでに単精度として評価されているのでこのオプションは無効です。
-fsimple=2を指定しても、本来浮動小数点例外を生成しないプログラムには、オプティマイザは浮動小数点例外を導入しません。
-fstore(x86) 浮動小数点式または関数が、ある変数に代入されるか、より小さい型の浮動小数点にキャストされる場合に、コンパイラがその値をレジスタに残さないで、代入値の左側に表記される型に変換するようにします。小数点の丸めおよび切り上げを行うため、結果はレジスタの値から生成される数値と異なる可能性があります。これはデフォルトです。
このオプションを解除するには、オプション
-nofstoreを使用してください。-
ftrap=t起動時に有効になる IEEE 754 トラップモードを設定します。
t には、以下の 1 つまたは複数の項目をコンマで区切って指定します。
%all、%none、common、[no%]invalid、[no%]overflow、 [no%]underflow、[no%]division、[no%]inexactこのオプションは、プログラム初期化時に設定される IEEE 754 トラップモードを設定します。項目は左から右への順に評価されます。
commonを指定した場合は、定義により、無効、0 除算、オーバーフローの各例外のトラップモードがオンになります。たとえば、
-ftrap=%all,no%inexactは、inexact以外のすべてのトラップを設定することを意味します。意味は、次の項目を除き、
ieee_flagsサブルーチンの場合と同じです。1 つのルーチンを
-ftrap=t オプションでコンパイルした場合は、そのプログラムの
ルーチンすべてを-ftrap=t オプションを使用してコンパイルしてください。途中から異なるオプションを使用すると、予想に反した結果が生じることがあります。
-G動的にリンクされる実行可能プログラムではなく、共有オブジェクトを作成することをリンクエディタに指令します。このオプションは
ld(1) に渡されます。このオプションは-dnオプションと併用することはできません。
-gこのオプションを指定すると、インクリメンタルリンカーを使用します。
「-xildoff」 および 「-xildon」 を参照してください。-Gまたは-xildoffオプションを使用していない場合、あるいはコマンド行にソースファイルの名前を指定していない場合は、ldの代わりにildを呼び出します。
-xO3以下の最適化レベルで-gを指定すると、ほとんど完全な最適化と可能な限りのシンボル情報が得られます。末尾呼び出しの最適化とバックエンドのインライン化は無効になります。最適化レベル
-xO4で-gを指定すると、完全な最適化と可能な限りのシンボル情報が得られます。
-H現在のコンパイルでインクルードされたファイルのパス名を 1 行に 1 つずつ標準エラーに出力します。
字下げして表示されるので、ファイルがさらにファイルをインクルードする様子を見ることができます。以下で、
sample.cはstdio.hファイルとmath.hファイルをインクルードします。math.hはfloatingpoint.hファイルをインクルードし、floatingpoint·hはさらに、sys/ieeefp.hを使用する関数をインクルードします。
$cc -H sample.c/usr/include/stdio.h/usr/include/math.h/usr/include/floatingpoint.h/usr/include/sys/ieeefp.h
-h<名前>共有動的ライブラリに <名前> をつけます。これによって異なったバージョンのライブラリを作成できます。一般に
-hの後の <名前> は、-oオプションの後に指定するファイル名と同じです。-hと名前の間の空白は任意です。リンカーは指定された <名前> をライブラリに割り当て、この名前をライブラリのイントリンシック名としてライブラリファイルに記録します。
-h<名前> オプションがない場合、イントリンシック名はライブラリファイルに記録されません。実行時リンカーはライブラリを実行可能ファイルにロードするとき、イントリンシック名をライブラリファイルから実行可能ファイル中の、必要とする共有ライブラリファイルのリストにコピーします。実行可能ファイルはこのリストを持っています。共有ライブラリのイントリンシック名がない場合、代わりにリンカーは共有ライブラリファイルのパス名をコピーします。
-I<ディレクトリ>ディレクトリのリストに <ディレクトリ> を追加します。このディレクトリは (スラッシュで始まっていない) 相対ファイル名で指定されるインクルードファイルを検索するときのディレクトリです。インクルードファイルの検索順序については、「インクルードファイル」を参照してください。
-iオプションをリンカーへ渡して、
LD_LIBRARY_PATHまたはLP_LIBRARY_PATH_64の設定を無視します。
-KPIC
-KPICは、-xcode=pic32と同義です。「-xcode=v」を参照して
ください。
-Kpic
-Kpicは、-xcode=pic13 と同義です。「-xcode=v」を参照して
ください。
-keeptmpコンパイル中に作成される一時ファイルを自動的に削除しないで保持します。
-L<ディレクトリ>
ld(1) がライブラリを検索するディレクトリのリストに <ディレクトリ> を付け加えます。このオプションとその引数はldに渡されます。
-l<名前>
ldがオブジェクトライブラリlib<名前>.so、またはlib<名前>.aをリンクの対象とします。シンボルは左から右へ解決されるため、コマンド行でのライブラリの指定順が重要になります。このオプションは <ソースファイル> 引数の後に指定してください。
-mcオブジェクトファイルの
.commentセクションから重複している文字列を削除します。-mcフラグを使用すると、mcs -cが起動されます。
-misalign(SPARC)
-misalignは、-xmemalign=1iと同義です。「-xmemalign=ab」を参照してください。
-misalign2(SPARC)
-misalign2は、-xmemalign=2iと同義です。「-xmemalign=ab」を参照してください。
-mrオブジェクトファイルの
.commentセクションからすべての文字列を削除します。このフラグを使用すると、mcs-d-aが起動されます。
-mr,<文字列>オブジェクトファイルの
.commentセクションからすべての文字列を削除して
<文字列> を挿入します。<文字列> に空白が含まれている場合は二重引用符で括ります。
<文字列> がなければ.commentセクションは空になります。このオプションは-da<文字列> としてmcsに渡されます。
-mt
-D_REENTRANT -lthreadに展開されるマクロオプションです。ユーザー固有のマルチスレッドコーディングを行なっている場合は、コンパイルとリンクのときに必ず-mtオプションを使用してください。マルチプロセッサシステム上でこのオプションを使用すると、生成された実行可能ファイルの実行速度が早くなります。シングルプロセッサシステム上では、実行速度は通常よりも遅くなります。
-nativeこのオプションは、
-xtarget=nativeと同義です。
-nofstore(x86) 浮動小数点式または関数がある変数に代入されるか、より小さい型の浮動小数点にキャストされる場合に、代入値の左側に表記される型に変換せずに、コンパイラがその値をレジスタに残すようにします。「-fstore」を参照してください。
-noqueueライセンスが得られない場合は、このコンパイル要求を待ち行列に入れないようにコンパイラに指示します。普通の状態では、コンパイラはライセンスを得られなければそれが得られるまで待機しますが、このオプションを使用するとコンパイラはただちに戻ります。
-O
-o <出力ファイル>出力ファイルに (デフォルトの
a.outの代わりに) <出力ファイル> という名前を付けます。ccはソースファイルに上書きしないので、<出力ファイル> には <ソースファイル> と同じ名前は使用できません。このオプションと引数は、ld(1) に渡されます。
-Pソースファイルのプリプロセッサ処理のみを行い、
.i接尾辞の付いたファイルに結果を出力します。-Eオプションと異なり、出力ファイルに C のプリプロセッサ行番号付け情報は含まれません (「-E」を参照してください)。
-p
prof(1) がプロファイルデータを収集するためのオブジェクトコードを作成します。プログラムを実行すると、実行時の記録機構が起動されます。プログラムが正常終了すると、この記録機構によってmon.outファイルが作成されます。
-Q[y|n]出力ファイルに識別情報を入れるかどうかを設定します。
-Qyがデフォルトです。-Qyを指定すると、起動した各コンパイラツールの識別情報が出力ファイルの·comment部分に追加され、mcsでのアクセスが可能になります。これはソフトウェア管理に役立ちます。
-qp
-R<ディレクトリ>[:<ディレクトリ>]実行時リンカーが使用するライブラリ検索ディレクトリを渡します。リストが空でなければ、出力オブジェクトファイルに記録され、実行時リンカーに渡されます。
LD_RUN_PATHと-Rオプションの両方が指定されたときは、この-Rオプションが優先されます。
-Sアセンブリ・ソースファイルを作成しますが、アセンブルは行いません。
-s出力されるオブジェクトファイルからシンボリックデバッグのための情報をすべて削除して
ld(1) に渡します。このオプションは、-gとともに指定することはできません。
-U<名前>初期定義されているプリプロセッサシンボル <名前> をすべて削除します。このオプションは
-Dオプションと逆の働きをします。複数の-Uオプションを指定することができます。
-Vコンパイラの実行時に各構成要素の名前とバージョン番号を表示します。
-vより厳しい意味検査および他の
lintに似た検査を行います。以下は支障なくコンパイルと実行ができるコードです。
#include <stdio.h>main(void){printf("Hello World.\n");}
-vを使用すると、コンパイルは行われますが以下の警告が表示されます。"
hello.c", 5 行目: 警告: 関数中にreturn文がありません:main
-vはlint(1) が発する警告をすべて表示するわけではありません。lintで上記の例を実行すると確認することができます。
-Wc,<引数>指定されたコンパイラ構成要素 c に、<引数> を渡します。各引数はコンマで区切ります。すべての
-W引数は、通常のコマンド行の引数の後に渡されます。コンマの前にバックスラッシュ (\) 文字を置いてエスケープすることにより、コンマを引数の一部にできます。c は以下のいずれかです。構成要素の一覧については 「C コンパイラシステムの構成要素」を参照してください。
表 2-4 c の値 aアセンブラ ( fbe) (gas)cC コードジェネレータ ( cg) (SPARC)d ccドライバ1h 中間コード翻訳 (ir2hf)(Intel) i 手続き間の分析 (ube_ipa)(Intel) lリンクエディタ ( ld)mmcs pプリプロセッサ ( cpp)u C コードジェネレータ ( ube)(Intel)0コンパイラ ( acomp) (ssbd, SPARC)2オプティマイザ ( iropt) (SPARC)
1 この章に示されている ccオプションは-wdを使用して C コンパイラに渡すことはできません。
c には以下のいずれかの値を指定します。
-wこのオプションは
error_messagesプラグマを無効にします。
-X[a|c|s|t]以下の各
-Xオプションは ANSI/ISO C に準拠する度合いを指定します (大文字と小文字を区別してください)。デフォルトのモードは-Xaです。ANSI/ISO C と K&R C との違いについては、300 ページの「K&R Sun C と Sun ANSI/ISO C との違い」を参照してください。(
a= ANSI) これは、コンパイラのデフォルトのモードです。ANSI C に K&R C との拡張互換性を持たせます。ANSI C に従って意味処理を変更します。同じ言語構造に対して ANSI C と K&R C の意味処理が異なる場合は ANSI C に準拠した解釈を行います。-Xa オプションを-xtransitionオプションと併せて使用すると、矛盾に関する警告が出力されます。-Xaを指定すると事前定義されたマクロ__STDC__の値は 0 になります。(
c= conformance) ANSI/ISO C にない言語構造を使用しているプログラムに対してエラーや警告を発行します。このオプションは ANSI C に最大限に準拠するもので、K&R C との拡張互換性はありません。-Xcを指定すると事前定義されたマクロ__STDC__の値は 1 になります。(
s= K&R C) ANSI/ISO C と K&R C の間で動作が異なるすべての言語構造に対して警告を発行します。K&R C と互換性のあるすべての機能がコンパイルされます。このオプションでは前処理用にcppが呼び出され、__STDC__は定義されません。-Xsオプションを指定したコンパイルの効果については、「Sun C と ANSI/ISO C における -Xs オプションの相違点」を参照してください。(
t= transition) ANSI/ISO C に K&R C との拡張互換性を持たせます。ANSI/ISO C に従った意味処理の変更は行いません。同じ言語構造に対して ANSI/ISO C と K&R C の意味処理が異なる場合、K&R C に準拠した解釈を行います。-Xtオプションを-xtransitionオプションと併せて使用すると、矛盾に関する警告が出力されます。-Xtを指定すると事前定義されたマクロ__STDC__の値は 0 になります。
-x386
-x486
-xa基本ブロックが実行される回数を数えるコードを挿入します。このオプションは古い形式の、
tcov用基本ブロックプロファイリングです。新しい形式のプロファイリングについては 「-xprofile=p」を、また詳細についてはtcov(1) マニュアルページおよび『プログラムのパフォーマンス解析』を、それぞれ参照してください。
-xaすべての.cファイルに対して、(正常終了時に).dファイルを作成する実行時の記録機構を起動します。この.dファイルには対応するソースファイルの実行データが累積されます。ソースファイルに対してtcov(1) を実行すると、プログラムに関する統計情報を生成することができます。このオプションは最適化を伴うので、-gと同時に使用することはできません。
TCOVDIR環境変数をコンパイル時に設定すると、.dファイルを格納するディレクトリを指定することができます。この変数を設定しない場合には、.dファイルは.cファイルと同じディレクトリ内に格納されたままになります。
-xprofile=tcovと-xaオプションは、同じ実行可能ファイル内で共存できます 。すなわち、-xprofile=tcovでコンパイルされたファイルと-xaでコンパイルされたファイルをリンクすることができます。1 つのファイルを両方のオプションでコンパイルすることはできません。
-xarch=isa命令セットアーキテクチャ (Instruction Set Architecture、ISA) を指定します。
-xarchのキーワード、isa に指定できるアーキテクチャを次の表 2-4 に示します。
表 2-5 -xarchISA のキーワードプラットフォーム 有効な -xarchキーワードSPARC generic、native、v7、v8a、v8、v8plus、 v8plusa、v8plusb、v9、v9a、v9bx86 generic、386、pentium_pro
-xarchは単独で使用できますが、本来は-xtargetオプションの展開の一部です。特定の-xtargetオプションで設定されている-xarchの値を上書きするために使用することもできます。次に例を示します。
% cc -xtarget=ultra2 -xarch=v8plusb ...この例では、
-xtarget=ultra2によって設定されている-xarch=v8が-xarch=v8plusbによって上書きされます。このオプションを最適化と併せて使用する場合、適切なアーキテクチャを選択すると、そのアーキテクチャ上での実行パフォーマンスを向上させることができます。不適切なアーキテクチャを選択すると、バイナリプログラムがその対象プラットフォーム上で実行できなくなることがあります。
SPARC のみ
次の表は、指定された
-xarchオプションでコンパイルされた後さまざまな SPARC プロセッサで実行される実行可能ファイルのパフォーマンスを示しています。この表は、特定の対象マシン上の実行可能ファイルに最も適した-xarchオプションを調べるために利用してください。初めにマシンの範囲を決め、続いて複数のバイナリを管理する手間と、より新しいマシンから最大限のパフォーマンスを引き出す効果を比較してみるとよいでしょう。
- N は、「仕様どおりのパフォーマンス」を意味します。プロセッサの命令セットを十分に利用してプログラムの実行が行われます。
- S は、「十分なパフォーマンス」を意味します。プログラムは実行されますが、提供されているプロセッサ命令の一部を利用できない場合があります。
- PD は、「パフォーマンスの低下」を意味します。プログラムは実行されますが、使用されている命令によってはパフォーマンスの低下が発生する場合があります (低下の程度はさまざま)。このパフォーマンス低下は、プロセッサが実装していない命令がカーネルでエミュレートされる場合に起きます。
- NE は、「実行不可能」を意味します。カーネルがプロセッサが実装していない命令をエミュレートしないため、プログラムは実行されません。
v8plusまたはv8plusa命令セットを使用して実行可能ファイルをコンパイルしようと考えている場合は、代わりにv9またはv9aによるコンパイルを考慮してください。v8plusとv8plusaオプションは、64 ビットプログラム対応の Solaris 7 がリリースされる以前に、プログラムで SPARC V9 と UltraSPARC 機能の一部が利用できるように提供されたものです。v8plus または v8plusa オプションでコンパイルされたプログラムは、SPARC V8 以前のマシンには移植できません。これらのプログラムは、v9またはv9aでそれぞれコンパイルし直すと、SPARC V9 と UltraSPARC の全機能を十分利用できるようになります。v8plusとv8plusaの制限については、ホワイトペーパー『The V8+ Technical Specification』(パーツ番号 802-7447。購入先から入手可) で説明されています。
- SPARC 命令セットアーキテクチャ V7、V8、および V8a はすべてバイナリ互換性があります。
v8plusとv8plusaでそれぞれコンパイルされたオブジェクトバイナリファイル (.o) は、一緒にリンクおよび実行できます。ただし、SPARC V8plusa 互換プラットフォーム上で実行する場合に限られます。v8plus、v8plusa、およびv8plusbでそれぞれコンパイルされたオブジェクトバイナリファイル (.o) は、一緒にリンクおよび実行できます。ただし、SPARC V8plusb 互換プラットフォーム上で実行する場合に限られます。-xarchの値、v9、v9a、およびv9bは、UltraSPARC 64 ビット対応 Solaris 環境にしか使用できません。v9とv9aでそれぞれコンパイルされたオブジェクトバイナリファイル (.o) は、一緒にリンクおよび実行できます。ただし、SPARC V9a 互換プラットフォーム上で実行する場合に限られます。v9、v9a、およびv9bでそれぞれコンパイルされたオブジェクトバイナリファイル (.o) は、一緒にリンクおよび実行できます。ただし、SPARC V9b 互換プラットフォーム上で実行する場合に限られます。どの値を使用しても、生成された実行可能ファイルはアーキテクチャが古くなるほど実行速度が遅くなります。また、これらの命令セットアークテクチャの多くで 4 倍精度 (
REAL*16とlongdouble) の浮動小数点命令を使用できますが、コンパイラは生成するコード内ではこれらの命令を使用しません。
-xarchのキーワード、isaに指定できるアーキテクチャを次の表 2-4 に示します。
x86 のみ
表 2-8 x86 の -xarch値generic命令セットを Intel x86 アーキテクチャに限定します。386 オプションと同義です。 386命令セットを Intel 386/486 アーキテクチャに限定します。 pentium命令セットを pentium アーキテクチャに限定します。 pentium_pro命令セットを pentium_pro アーキテクチャに限定します。
-xautopar(SPARC) 複数プロセッサの自動並列化を有効にします。依存性の解析 (ループの繰り返し内部でのデータ依存性の解析) およびループ再構成を実行します。最適化が
-xO3以上でない場合は-xO3に上げられ、警告が出されます。独自のスレッド管理を行なっている場合には、
-xautoparを使用しないでください。Sun WorkShop には、マルチプロセッサ用の C オプションを使用するのに必要なライセンスが含まれています。実行速度を高めたければ、マルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたバイナリの実行速度は低下します。
使用できるプロセッサの数を調べるには、
psrinfoコマンドを使用してください。
%psrinfo0 on-line since 01/12/95 10:41:541 on-line since 01/12/95 10:41:543 on-line since 01/12/95 10:41:544 on-line since 01/12/95 10:41:54複数のプロセッサを使用するには、
PARALLEL環境変数を設定してください。デフォルトは 1 です。
- 使用できる数より多くのプロセッサを指定しないでください。
- マシン上のプロセッサの数を n とした場合、単一ユーザーがマルチプロセッサシステムを使用するには
PARALLEL=n-1を指定してください。
-xautoparを使用してコンパイルとリンクを 1 度に実行する場合、リンクには自動的にマイクロタスキング・ライブラリおよびスレッドに対して安全な C 実行時ライブラリが含まれます。-xautoparを使用してコンパイルとリンクを別々に実行する場合、リンクにも-xautoparを指定しなければなりません。
-xCCC++ 形式のコメントを受け入れます。"//" がコメントの開始を示すために使えるようになります。
-xcache=cオプティマイザ用のキャッシュ特性を定義します。c には以下のいずれかを指定します。
si レベル i のデータキャッシュのサイズ (キロバイト単位) li レベル i のデータキャッシュのラインサイズ (バイト単位) ai レベル i のデータキャッシュの結合特性
このオプションは単独で指定できますが、
-xtargetオプションの展開の一部です。-xtargetオプションによって指定された値を変更することが主な目的です。このオプションは、オプティマイザが使用できるキャッシュ特性を指定します。特定のキャッシュ特性が必ず使用されるわけではありません。次に、
xcacheの値を示します。
例:
-xcache=16/32/4:1024/32/1では、以下の内容を指定します。
16K バイト 1024K バイト 32 バイトの行サイズ 32 バイトの行サイズ 4 面結合 直接マップ結合
-xcg[89|92]
-xcg89は、「-xarch=v7 -xchip=old -xcache=64/32/1」を意味する
マクロです。-xcg92は、「-xarch=v8 -xchip=super -xcache=16/32/4:1024/32/1」を意味するマクロです。
-xchar_byte_order=o複数文字からなる定数である文字を指定されたバイト順序で配置することにより、整定数を生成します。o には、次の値のいずれかを指定できます。
low:複数文字定数の文字を低いバイトから順に配置するhigh:複数文字定数の文字を高いバイトから順に配置するdefault:複数文字定数の文字を、コンパイルモード-X[a|c|s|t]で決定された順に配置する。詳細は、84 ページの「文字定数」を参照してください。
-xchip=cc には、
generic、old、super、super2、micro、micro2、hyper、hyper2、powerup、ultra、ultra2、ultra2i、386、486、pentium、pentium_pro、603、604のいずれかを指定します。このオプションは、処理対象となるプロセッサを指定することによって、タイミング特性を指定します。
このオプションは単独で指定できますが、
-xtargetオプションのマクロ展開の一部です。-xtargetオプションによって指定された値を変更するのが主な目的です。
- 命令の順序 (スケジューリング)
- コンパイラが分岐を使用する方法
- 同義の代替命令が使用できる場合に使用する命令
-xcode=v(SPARC) コードアドレス空間を指定します。v は次のいずれか 1 つでなければなりません。
SPARC V7 と V8 の場合のデフォルトは
-xcode=abs32です。SPARC V9 と UltraSPARC V9 (-xarch=v9|v9a) の場合のデフォルトは-xcode=abs64です。64 ビット Solaris 7 上で
-xarch=v9またはv9aを使用して共有動的ライブラリを構築するときは、-xcode=pic13または-xcode=pic32オプションを指定しなければなりません。
-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<ファイル名>.o | grep _GLOBAL_OFFSET_TABLE_U _GLOBAL_OFFSET_TABLE_位置独立コードを含む
.oファイルには、_GLOBAL_OFFSET_TABLE_への未解決の外部参照が含まれます。このことは、英字の U で示されます。
-xcode=pic13または-xcode=pic32を使用すべきかどうかを判断するには、nmを使用して、共有ライブラリで使用または定義されている明確な大域および静的変数の個数を確認します。_GLOBAL_OFFSET_TABLE_のサイズが 8,192 バイトより小さい場合は、-Kpicを使用できます。そうでない場合は、-xcode=pic32を使用する必要があります。
-xcrossfile[=n](SPARC) ソースファイル間の最適化とインライン化を有効にします。n を指定する場合は、0、1、2 のいずれかです。
通常、コンパイラの解析のスコープは、コマンド行上の各ファイルに制限されます。たとえば、
-xO4の自動インライン化は、同じソースファイル内で定義および参照されるサブプログラムに制限されます。
-xcrossfileを指定すると、コンパイラは、コマンド行に指定したすべてのファイルを (1 つのソースファイルに連結したように) 解析します。-xcrossfileは、-xO4または-xO5と併用したときだけ有効です。このコンパイルから生成されるファイルは、インライン化のため相互に依存しています。したがって、1 つのプログラムにリンクするときには、1 つの単位として使用しなければなりません。任意の 1 つのルーチンを変更し、そのファイルを再コンパイルした場合は、すべてのファイルを再コンパイルしなければなりません。つまり、このオプションを使用すると、メークファイルの構成にも影響があります。
デフォルトは
xcrossfile=0で、ファイル間の最適化は行われません。-xcrossfileは-xcrossfile=1と同義です。
-xdepend(SPARC) ループの繰り返し内部でのデータ依存性の解析およびループ再構成を実行します。ループの再構成には、ループの交換、ループの融合、スカラーの置換、無意味な配列への代入の除去が含まれます。最適化が
-xO3以上でない場合、-xO3に上げられ、警告が出されます。
-xautoparまたは-xparallelには依存性の解析も含まれています。依存性の解析はコンパイル時に実行されます。依存性の解析はシングルプロセッサシステムで役立つことがあります。ただし、シングルプロセッサシステムに
-xdependを試みる場合は、-xautoparまたは-xexplicitparを使用しないでください。これらのいずれかが有効になっていると、-xdependの最適化はマルチプロセッサシステムについて実行されます。
-xeソースファイル上で構文および意味検査のみを行います。オブジェクトコードや実行可能コードは生成しません。
-xexplicitpar(SPARC)
#pragma MP指令の指定にもとづいて並列化コードを生成します。ユーザー自身が、依存性の解析を行い、ループの繰り返し内部でのデータの依存性を解析および指定します。ソフトウェアは指定されたループを並列化します。最適化が-xO3以上でない場合、-xO3に上げられ、警告が出されます。独自のスレッド管理を行なっている場合には、-xexplicitparを使用しないでください。Sun WorkShop には、マルチプロセッサ用の C オプションを使用するのに必要なライセンスが含まれます。コードの実行速度を高めたければ、このオプションにはマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。
ユーザーが指定したループに依存関係が含まれていると、正しい結果が得られないことがあります。しかも、結果が実行するごとに異なることがあります。なお、警告は出力されません。縮約ループには、明示的な並列プラグマは適用しないでください。明示された並列化は行われますが、ループの縮約は適用されないため、誤った結果が生じる場合があります。
- ループを解析して、安全に並列化できるループを見つける。
#pragma MPを挿入してループを並列化する。詳細については、「明示的な並列化およびプラグマ」の項を参照してください。-xexplicitparオプションを使用する。
#pragma MP taskloopfor (j=0; j<1000; j++){...}
-xexplicitparを使用してコンパイルとリンクを一度に実行する場合、リンクには自動的にマイクロタスキング・ライブラリおよびスレッドに対して安全な C 実行時ライブラリが含まれます。-xexplicitparを使用してコンパイルとリンクを別々に実行する場合、リンクにも-xexplicitparを指定しなければなりません。
-xFアナライザを使用した実行可能ファイルのパフォーマンス解析ができるように準備します(
analyzer(1) のマニュアルページを参照)。関数レベルで順序付けし直すことができるコードを作成します。ファイル内の関数はそれぞれ別々のセクションに配置されます。たとえば関数foo()とbar()は、それぞれセクション.text%fooとセクション.text%barに配置されます。実行可能ファイル内の関数の順序付けは、-xFをldの-Mオプション (ld(1) のマニュアルページを参照) と併用することによって制御できます。またこのオプションにより、アセンブラはデータ収集に必要なデバッグ情報をオブジェクトファイルの中に作成します。
-xhelp=ff には、
flags、readme、errorsのいずれか 1 つを指定してください。
-xhelp=flagsは、コンパイラオプションの要約を表示します。
-xhelp=readmeは、READMEファイルを表示します。
-xhelp=errorsは、エラーおよび警告メッセージファイルを表示します。
-xildoffインクリメンタルリンカーを使用せず、強制的に
ldを起動します。-gオプショ ンを使用しない場合、-Gオプションを使用した場合、またはコマンド行にソースファイルが存在する場合は、このオプションがデフォルトになります。このデフォルトを使用したくない場合は、-xildonオプションを指定してください。
-xildon強制的に、インクリメンタルリンカー (
ild) をインクリメンタルモードで起動します。-gオプションを使用し、-Gオプションを使用せず、かつ、コマンド行にソースファイルを指定しない場合は、このオプションがデフォルトです。このデフォルトを使用したくない場合は、-xildoffオプションを指定してください。
-xinline=[{%auto,<関数>,no%<関数>}[,{%auto,<関数>,no%<関数>}]...]指定された関数だけをインライン化します。
-xinline=には、関数名またはno%<関数> の値をコンマで区切ったもの、または値%autoを指定できます。no%<関数> を指定すると、コンパイラは <関数> に指定されたものはインライン化しません。%autoを指定すると、ソースファイル内のすべての関数を自動的にインライン化しようとします。
-xO3を指定してコンパイルする場合は、-xinlineを使用して関数の一部またはすべてをインライン化することで最適化の度合いを高めることができます。-xO3レベルの最適化は、インライン化を含みません。
-xO4を指定してコンパイルする場合は、-xinlineを使用してインライン化対象を指定したルーチンだけに制限することで最適化の度合いを減らすことができます。-xO4が指定されると、コンパイラはソースファイル内に定義された関数に対する参照をすべてインライン化しようとします。-xinline=とだけ指定して、関数名も%autoも指定しない場合は、ソースファイル内のルーチンはインライン化されません。次のいずれかの条件に該当する場合、ルーチンはインライン化されません。警告は出力されませんので注意してください。
- 最適化のレベルが
-xO3未満である。- ルーチンが見つからない。
iroptがルーチンのインライン化を実行できない。- ルーチンのソースが、コンパイル対象のファイルにない (
「-xcrossfile」を参照) 。
-xlibmieee例外が起きた場合の数学ルーチンの戻り値を強制的に IEEE 754 形式にします。この場合、例外メッセージは表示されないので、
errnoには依存しないでください。
-xlibmil
libm用のインライン展開テンプレートをインクルードします。このオプションによって浮動小数点演算用オプションとプラットフォームに適したアセンブリ言語のインラインテンプレートが選択されます。
-xlic_lib=sunperf(SPARC) Sun 提供のパフォーマンスライブラリにリンクします。
-xlicinfoライセンスシステムについての情報を返します。特に、ライセンスサーバーの名前と、ライセンスを検査されたユーザーのユーザー ID を返します。このオプションは、コンパイルを要求したり、ライセンスを検査したりはしません。
-xloopinfo(SPARC) 並列化されているループとされていないループを示します。また、ループを並列化しない理由を簡単に説明します。
-xloopinfoオプションは、-xautopar、-xparallel、または-xexplicitparが指定されている場合にのみ有効です。指定されていない場合は、コンパイラは警告を出します。Sun WorkShop には、マルチプロセッサ 用の C オプションを使用するのに必要なライセンスが含まれます。コードの実行速度を高めたければ、このオプションにはマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。
-xM指定した C プログラムに対してプリプロセッサだけを実行します。その際、メークファイル用の依存関係を生成してその結果を標準出力に出力します (メークファイルと依存関係についての詳細は
make(1) のマニュアルページを参照してください)。
#include <unistd.h>void main (void){}
- この例で出力されるものは、次のとおりです。
-xM1
-xMと同様に依存関係を収集しますが、/usr/includeファイルは除きます。次に例を示します。
more hello.c#include<stdio.h>main(){(void)printf("hello\n");}cc -xM hello.chello.o: hello.chello.o: /usr/include/stdio.h
-xMlオプションを使用してコンパイルすると、ヘッダーファイルの依存関係の出力が抑制されます。
cc -xM1 hello.chello.o: hello.c
-xMergeデータセグメントをテキストセグメントにマージします。このコンパイルで生成するオブジェクトファイルで初期化されるデータは読み取り専用なので、
ld -Nでリンクしていない限り、プロセスどうしで共有することができます。
-xmaxopt=off, 1, 2, 3, 4, 5このコマンドは、
pragra optのレベルを指定されたレベルに限定します。デフォルト値は-xmaxopt=offであり、pragma optは無視されます。引数を指定せずに-xmaxoptを指定すると、-xmaxopt=5を指定したことになります。
-xmemalign=ab
想定するメモリー境界整列の最大値と、境界整列に失敗したデータがアクセスされた際の動作を指定します。a (境界整列) と b (動作) の両方の値が必要です。a は、想定する最大メモリー境界整列です。b は、境界整列に失敗したメモリーへのアクセスに対する動作です。次に、-memalignの境界整列と動作の値を示します。
コンパイル時に境界整列が判別できるメモリーへのアクセスの場合、コンパイラはそのデータの境界整列に適したロードおよびストア命令を生成します。
コンパイル時に境界整列が判別できないメモリーへのアクセスの場合、コンパイラは必要なロードおよびストア命令を生成するための境界整列を想定する必要があります。
-xmemalignフラグを使用すると、このような判別不可能な状況の時にコンパイラが想定するデータの最大メモリー境界整列を指定できます。-xmemalignフラグは、境界整列に失敗したメモリーへのアクセスが実行時に発生した場合に行われるエラー動作 (処理) についても指定できます。次に、
-xmemalignフラグがまったく指定されていない場合にのみ適用される-xmemalignのデフォルト値を示します。
-xmemalign=4s:-xarchの値がgeneric、v7、v8、v8a、v8plus、v8plusaのいずれかの場合に適用される-xmemalign=8s:-xarchの値がv9とv9aのどちらかの場合に適用される次に、
-xmemalignフラグが指定されているが値を持たない場合のデフォルト値を示します。
-xmemalign=1i: すべての-xarch値に適用される次の表は、
-xmemalignで処理できるさまざまな境界整列の状況とそれに適した-xmemalign指定を示しています。
-xnolibデフォルトのライブラリリンクを行いません。つまり
ldに-lオプションを渡しません。通常は、ccドライバが-lcをldに渡します。
-xnolibを使用する場合、すベての-lオプションをユーザーが渡さなければなりません。次に例を示します。
%cc test.c -xnolib -Bstatic -lm -Bdynamic -lcこのように指定すると、
libmは静的にリンクされ、その他のライブラリは動的にリンクされます。
-xnolibmil数学ライブラリのルーチンをインライン化しません。このオプションは
-fastオプションの後に指定してください。以下に例を示します。
%cc -fast -xnolibmil...
-xO[1|2|3|4|5]オブジェクトコードを最適化します。O が大文字であることに注意してください。
-xOオプションと-gオプションを組み合わせて使用すると、特定の範囲だけをデバッグすることができます。詳細は、『dbx コマンドによるデバッグ』の第 1 章の「最適化コードのデバッグ」を参照してください最適化のレベルは 1 から 5 のうちのいずれかです。使用するプラットフォームによって変わります。
- (SPARC)
-xO1
- 最小限の局所的な最適化 (ピープホール) を行います。
-xO2
- 基本的な局所的および大域的最適化を行います。ここでは帰納変数の削除、局所的および大域的な共通部分式の除去、算術の簡素化、コピー通達、定数通達、不変ループの最適化、レジスタの割り当て、基本ブロックのマージ、再帰的末尾の除去、無意味なコードの除去、末尾呼び出しの削除、複雑な式の展開を行います。
-xO2レベルでは、大域、外部、間接の参照または定義はレジスタに割り当てられません。これらの参照や定義は、あたかもvolatile型として宣言されたかのように取り扱われます。一般的にコードサイズは最も小さくなります。
-xO3
-xO2に加えて、外部変数の参照または定義も最適化します。ループの展開やソフトウェアのパイプラインなども実行されます。-xO3レベルではポインタ割り当ての結果を追跡しません。デバイスドライバをコンパイルするとき、またはシグナルハンドラの内部から外部変数を変更するプログラムをコンパイルするときは、volatile型の修飾子を使用してオブジェクトが最適化されないようにする必要があります。一般的に-xO3レベルではコードサイズが増大します。
-xO4
-xO3に加えて、同一のファイルに含まれている関数の自動的なインライン化も行います。通常はこれによって実行速度が上がります。インライン化される関数を指定したい場合は、「-xinline=[{%auto,<関数>,no%<関数>}[,{%auto,<関数>,no%<関数>}]...]」を参照してください。
- このレベルでは、ポインタ代入の結果が追跡され、通常はコードサイズが増大します。
-xO5
- 最高レベルの最適化を行おうとします。この最適化アルゴリズムは、コンパイルの所要時間がより長く、または実行時間が確実に短縮化されるわけではないという短所がありますが、プロファイルフィードバックを伴って実行するとパフォーマンスをより向上させやすくなります。「-xprofile=p」を参照してください。
- (x86)
-xO1
- デフォルトの最適化での 1 つの段階の他に、メモリーからの引数の事前ロードと、クロスジャンプ (末尾融合) を行います。
-xO2
- 高レベルと低レベルの両方の命令をスケジュールし、改良されたスピルコードの解析、ループ中のメモリー参照の除去、レジスタの寿命解析、高度なレジスタ割り当て、大域的な共通部分式の除去を行います。
-xO3
- レベル 2 で行う最適化の他に、ループの削減と帰納変数の除去を行います。
-xO4
- レベル
2と3で行う最適化の他に、ループの展開と、可能であればスタックフレーム生成の回避、および同一ファイルに含まれる関数の自動インライン化を行います。この最適化を行うと、adbとdbxのスタックトレースに誤りが発生する可能性があるので注意してください。
-x05
- 最高レベルの最適化を行います。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。たとえば、エクスポートされた関数が局所的に呼び出されるような関数の入口を設定する、スピルコードを最適化する、命令スケジュールを向上するための解析を追加するなどがあります。
オプティマイザによりメモリーが不足した場合は、最適化のレベルを下げて現在の関数を再試行することによって処理を続行しようとします。これ以後の関数に対してはコマンド行オプションで指定されている本来のレベルで再開します。
-xO3または-xO4で (1 つの関数内のコードが数千行になるような) 大きな関数を最適化する場合、膨大な量の仮想メモリーが必要になり、マシンのパフォーマンスが低下することがあります。
-xPこのモジュールで定義されたすべての K&R C 関数に対するプロトタイプを出力します。
f(){}
main (argc,argv)
int argc;
char *argv[];
{
}
int f(void);
int main(int, char **);
-xparallel(SPARC)
ループを、コンパイラで自動的に並列化するとともに、プログラマの指定によって明示的に並列化します。-xparallelオプションはマクロで、-xautopar、-xdepend、-xexplicitparの3つをすべて指定することと同じです。ループの明示的な並列化では、誤った結果が生まれる危険性があります。最適化が-xO3以上でない場合、-xO3に上げられ、警告が出されます。
独自のスレッド管理を行なっている場合には、-xparallelを使用しないでください。Sun WorkShop には、マルチプロセッサ 用の C オプションを使用するのに必要なライセンスが含まれます。
コードの実行速度を高めたければ、このオプションにはマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。コンパイルとリンクを 1 度で実行すると、
-xparallelによりマイクロタスキングライブラリとスレッドに対して安全な実行時ライブラリがリンクに含まれます。-xparallelオプションを使用してコンパイルとリンクを別々に実行する場合、リンクにも-xparallelオプションを指定しなければなりません。
-xpentium(x86) Pentium プロセッサ用に最適化を行います。
-xpg
gprof(1) によるプロファイルの準備として、データを収集するためのオブジェクトコードを生成します。-xpgはプログラム実行時に記録機構を起動します。この記録機構は実行が正常終了すると、gmon.outファイルを作成します。
-xprefetch[=<値>],<値>(SPARC) 先読みをサポートするアーキテクチャ (UltraSPARC II など) で先読み命令を有効にします (
-xarch=v8plus、v9plusa、v9、v9aのいずれか)。明示的な先読み命令の使用は、パフォーマンスが実際に向上する特別な場合に限定してください。
auto先読み命令の自動生成を有効にする no%auto先読み命令の自動生成を無効にする explicit明示的な先読みマクロを有効にする no%explicit明示的な先読みマクロを無効にする yes-xprefetch=auto,explicitと同じno-xprefetch=no%auto,no%explicitと同じ
-xprefetchが指定されない場合のデフォルトは、-xprefetch=no%auto,explicitです。値なしで-xprefetchを指定すると、-xprefetch=auto,explicitと同じ意味になります。
sun_prefetch.hヘッダーファイルには、明示的な先読み命令を指定するためのマクロが含まれています。先読み命令は、実行コード中のマクロの位置にほぼ相当するところに挿入されます。
-xprofile=pプロファイルのデータを収集、または最適化のためにプロファイルを使用します。
(SPARC) p には、collect[:<名前>]、use[:<名前>]、または tcov のいずれか 1 つを指定します。
このオプションを使用すると実行中に実行頻度データを収集して保存することができ、後 続の実行ではそのデータを使用してパフォーマンスを向上させることができます。このオプションは、最適化のレベルを指定した場合にのみ有効です。
- 実行後に
-xprofile=useを指定してオプティマイザで使用するために、実行頻度データを収集して保存します。コンパイラによって文の実行頻度を測定するためのコードが生成されます。- <名前> は、解析の対象となるプログラムの名前です。この名前はオプションです。
<名前> の指定を省略すると、a.outが実行可能ファイルの名前とみなされます。-xprofile=collect: <名前> でコンパイルしたプログラムは実行時に、
<名前>.profileというサブディレクトリを作成して、実行時のフィードバック情報を保存します。データは、このサブディレクトリのfeedbackファイルに書き込まれます。プログラムを複数回実行すると、実行頻度データはfeedbackファイルに累積され、前回の出力は消えません。
- 実行頻度データを使用して、効果的に最適化を行います。
collect:<名前> と同様に、<名前> はオプションです。これにより、プログラム名を指定できます。-xprofile=collectでコンパイルしたプログラムを前回実行したときに作成されたfeedbackファイルに保存された実行頻度のデータにもとづいて、プログラムが最適化されます。- 使用するソースファイルとコンパイラオプション (このオプションを除く) は、
feedbackファイルの作成時に実行したコンパイル済みプログラムを作成する際に使用したものと、まったく同じでなければなりません 。-xprofile=collect:<名前> を使用してコンパイルする場合は、最適化コンパイルでも同じ名前 (-xprofile=use:<名前>) が使用されていなければなりません。
- 新しい形式の
tcovを使用した基本ブロックカバレージ解析です。
-xprofile=tcovオプションは、新しい形式のtcov用基本ブロックプロファイリングです。 機能は-xaオプションと類似していますが、ヘッダーファイルにソースコードがあるプログラムまたは C++ テンプレートを使用するプログラムのデータを正確に収集します。古い形式のプロファイリングについては 「-xa」の節、tcov(1) のマニュアルページ、および『プログラムのパフォーマンス解析』を参照してください。時間計測コードの組み込みは -xa オプションの場合と同様に実行されますが、.d ファイルは生成されません。その代わりに、最終的な実行可能ファイルにもとづいた名前をもつファイルが 1 つだけ生成されます。たとえば、プログラムが
/foo/bar/myprog.profileから実行されると、データファイルは/foo/bar/myprog.profile/myprog.tcovdに格納されます。
-xprofile=tcovと-xaオプションは、同じ実行可能ファイル内に指定することができます。すなわち、-xprofile=tcovでコンパイルされたファイルと-xaでコンパイルされたファイルが両方含まれたプログラムをリンクすることができます。1 つのファイルを両方のオプションでコンパイルすることはできません。
tcovを実行する時点で、新しい形式のデータを使用させるように-xオプションを渡さなければなりません。これを渡さないと、古い.dファイルがまだ存在する場合にtcovはデフォルトで古いファイルからデータを使用するため、予想に反した出力が生成されます。
-xaオプションの場合とは異なり、TCOVDIR環境変数はコンパイル時には影響力を持ちません。ただし、その値はプログラムの実行時に使用されます。詳細についてはtcov(1)のマニュアルページおよび『プログラムのパフォーマンス解析』を参照してください。
注 --xO4または-xinlineによるルーチンのインライン化が存在する場合、tcovカバレージ解析のデータが不正確になることがあります。
-xreduction(SPARC) 自動並列化の間に縮約を認識させます。
-xreductionオプションは、-xautoparまたは-xparallelのいずれかが指定されている場合にのみ有効です。並列化オプションを使用するには、WorkShop のライセンスが必要です。
縮約の認識が有効な場合、コンパイラは内積、最大値発見、最小値発見などの縮約を並列化します。これらの縮約によって非並列化コードの場合とは、四捨五入の結果が異なります。
-xregs=rr には、以下の 1 つまたは複数の項目をコンマで区切って指定します。
[no%]appl、[no%]float例:
-xregs=appl,no%float
-xrestrict=f(SPARC) ポインタ値の関数引数を制限付き (restricted) ポインタとして扱います。f には、以下の 1 つまたは複数の項目をコンマで区切って指定します。
関数リストの指定にこのオプションを入れると、指定された関数内のポインタ引数は制限付きとして扱われます。
-xrestrict=%allを指定すると、C ファイル全体のすべてのポインタ引数が制限付きとして扱われます。詳細については「_Restrict」の項を参照してください。このコマンド行オプションは独立して使用できますが、最適化時に使用するのが最も適しています。以下に例を示します。
% cc -xO3 -xrestrict=%all prog.cこのコマンドでは、ファイル
prog.c内のすべてのポインタ引数を制限付きポインタとして扱います。
% cc -xO3 -xrestrict=agc prog.cこのコマンドでは、ファイル
prog.c内の関数agcのすべてのポインタ引数を制限付きポインタとして扱います。デフォルトは
%noneで、-xrestrictと指定すると-xrestrict=%allと指定した場合と同様の結果が得られます。
-xs
dbxのための自動読み取りを無効にします。このオプションは.oファイルを保存しておくことができない場合に使用します。-sオプションはアセンブラに渡されます。旧来の方法 (自動読み取りなし) では、シンボルテーブルのロードで次の処理が行われます。
dbx用のすべてのシンボルテーブルを実行可能ファイルに書き込むため、リンカーの結合とdbxの初期設定に時間がかかります。新しい方法では、シンボルテーブルのロードの際に自動読み取りがデフォルトで稼働します。自動読み取りによって、シンボルテーブルの情報が
.oファイルに分散され、必要なときだけdbxがシンボルテーブル情報をロードします。そのため、リンカーの結合とdbxの初期設定が速くなります。
-xsを指定すると、実行可能ファイルを他のディレクトリに移動し、dbxを使用する必要が生じたときに、オブジェクト (.o) ファイルを無視することができます。
-xsを指定しない場合は、実行可能ファイルを移動する際に、ソースファイルとオブジェクト (.o) ファイルの両方を移動するか、dbxpathmapまたはuseコマンドでパスを設定しなければなりません。
-xsafe=mem(SPARC) メモリーに関するトラップが発生しないことを前提とします。
このオプションによって、V9 マシン上で投機的ロード命令を使用することが許可されます。これは、
-xO5最適化と、-xarch=v8plus|v8plusa|v9|v9aを指定する場合だけ有効です。
-xsbソースブラウザ用のシンボルテーブル情報を生成します。このオプションは、コンパイラの
-Xsモードと併用することはできません。
-xsbfastソースブラウザ用のデータベースを作成します。ソースファイルはオブジェクトファイルにはコンパイルされません。このオプションは、コンパイラの
-Xsモードと併用することはできません。
-xsfpconst接尾辞のない浮動小数点定数を、デフォルトの倍精度モードではなく、単精度で表します 。
-Xcと併用することはできません。
-xspace例: コードサイズが増える場合は、ループの展開や並列化は行われません。
-xstrconstデフォルトのデータセグメントではなくテキストセグメントの読み出し専用データセクションに、文字列リテラルを挿入します。
-xtarget=tt の値は
native、generic、SPARCまたはx86のシステム名のいずれかでなければなりません。
-fastマクロオプションの展開には-xtarget=nativeが含まれます。
-xtargetオプションは、実際のシステムに合わせて、-xarch、-xchip、-xcacheの組み合わせを手早く簡単に指定することができます。-xtargetの意味は = の後に指定した値を展開したものにあります。
表 2-14 -xtargetの展開nativeホストシステムに対してパフォーマンスを最適化します。 コンパイラは、ホストシステムに対して最適化されたコードを生成します。コンパイラは自身が動作しているマシンで利用できるアーキテクチャ、チップ、キャッシュ特性を判定します。 generic一般的なアーキテクチャ、チップ、キャッシュに対して最高のパフォーマンスが得られるようにします。 コンパイラは -xtarget=genericを次のように展開します。-xarch=generic -xchip=generic -xcache=genericこれはデフォルトです。<システム名> 指定のシステムに対して最高のパフォーマンスが得られるようにします。 このオプションはマクロです。表 2-15 に示す、実際のシステム名と機種番号のリストから、システム名を選択してください。
対象となるハードウェア (コンピュータ) の正式な名前をコンパイラに指定した方がパフォーマンスが優れているプログラムもあります。プログラムのパフォーマンスが重要な場合は、対象となるハードウェアの名前を正式に指定してください。これは、新しい SPARC プロセッサ上でプログラムを実行する場合に当てはまります。ただし、ほとんどのプログラムと、より旧式の SPARC プロセッサ間では、パフォーマンス向上はごくわずかであり、
genericを指定することで十分です。
-xtargetに指定する値は、-xarch、-xchip、-xcacheの各オプションの値に展開されます。表 2-15 を参照してください。例:
-xtarget=sun4/15と指定することは、-xarch=V8a -xchip=micro -xcache=2/16/1と指定することと同じです。
genericまたはnative386(-386オプションと等価) または486(-486オプションと等価)pentium(-pentiumオプションと等価) またはpentium_pro-
xtemp=<ディレクトリ>
ccが使用する一時ファイルの <ディレクトリ> を設定します。このオプション文字列の中にはスペースを入れてはなりません。このオプションを指定しないと、一時ファイルは/tmpに格納されます。-xtempは、TMPDIR環境変数より優先します。
-xtimeコンパイルの各構成要素が占有した実行時間と資源を報告します。
-xtransitionK&R C と Sun ANSI/ISO Cとの間の相違に対して警告を出します。
-xtransitionオプションを、-Xaまたは-Xtオプションと共に使用すると警告を出します。異なる動作に関するすべての警告メッセージは適切なコーディングを行うことによって取り除くことができます。次の警告は、-xtransitionオプションを使用していなければ表示されません。\a は ANSI C の警告文字です
\x は ANSI C の 16 進エスケープです
無効な 8 進数
型の種類は実際には <型名> です: <名前>
コメントが "##" で置き換えられます
コメントがトークンを連結していません
ANSI C では新しい型で置き換えてしまう型の宣言です: <型名>
文字定数中のマクロ置換は行われません
文字列リテラル中のマクロ置換
文字定数中ではマクロ置換は行われません
文字列リテラル中のマクロ置換は行われません
オペランドが符号なしとして処理されました
3 文字表記シーケンスが置き換えられました
ANSI C は定数を unsigned 型として扱います: <演算子>
ANSI C では <演算子> の意味が変わります。明示的なキャストを使用してください。
-xunroll=nループを n 回展開するようオプティマイザに指示します。 n は正の整数です。 n が 1 のときはコマンドとなり、コンパイラはループを展開しません。 n が 2 以上のとき
、n は n 回ループを展開することをコンパイラに知らせます。
-xunroll=
-xvector[={yes|no}
-xvector=yesが指定されると、コンパイラは可能な場合はループ内の数学ライブラリへの呼び出しを、同等のベクトル数学ルーチンへの単一の呼び出しに変換します。大きなループカウントを持つループでは、この変換によりパフォーマンスが向上します。
-xvectorが指定されない場合のデフォルトは、-xvector=noです。値のない-xvectorが指定された場合のデフォルトは、-xvector=yesです。あらかじめ
-xdependを指定せずにコマンド行で-xvectorを指定すると、-xdependが自動的に呼び出されます。また、最適化レベルが指定されないか、-xO3以上でない場合は、最適化レベルが-xO3に上げられます。コンパイラは、リンク時に
libmvecライブラリを取り込みます。コンパイルとリンクを別々のコマンドで実行する場合は、リンク時のccコマンドに必ず-xvectorを使用してください。
-xvpara(SPARC) ループが正しく並列化指定されていない場合に、
#pragma MP指令が指定されているループについて警告を出します。たとえば、オプティマイザがループの繰り返し中にデータの依存性を検出した場合に警告を出します。Sun WorkShop には、マルチプロセッサ用の C オプションを使用するのに必要なライセンスが含まれます。
-xvparaは、-xexplicitparまたは-xparallelオプションと、#pragma MPを組み合わせて使用してください。詳細については、「明示的な並列化およびプラグマ」を参照してください。
-Yc,<ディレクトリ>c を検索するための新しいリ <ディレクトリ> を指定します。c は
、-Wオプションで示したコンパイラ構成要素を表わす文字です。構成要素の検索が指定されている場合、ツールのパス名は
<ディレクトリ>/<ツール名> になります。2 つ以上の-Yオプションが 1 つの項目に適用されている場合には、最後に現れたものが有効です。
-YA,<ディレクトリ>コンパイラの構成要素を検索するデフォルトのディレクトリを変更します。
-YI,<ディレクトリ>インクルードファイルを検索するデフォルトのディレクトリを変更します。
-YP,<ディレクトリ>ライブラリファイルを検索するデフォルトのディレクトリを変更します。
-YS,<ディレクトリ>起動用のオブジェクトファイルを検索するデフォルトのディレクトリを変更します。
-Zll(SPARC)
lock_lint用にプログラムデータベースを作成しますが、コンパイルは行いません。詳細については、lock_lint(1) のマニュアルページを参照してください。
-Zlp(SPARC) ループプロファイラであるループツール用にオブジェクトファイルを準備します。その後
looptool(1) ユーティリティを実行して、プログラムに関するループ統計を生成することができます。このオプションは-xdependとともに使用してください。-xdependが明示的または暗黙的に指定されていない場合は、-xdependを有効にして警告を出します。最適化が-xO3以上でない場合は-xO3に上げられ、警告が出されます。通常、このオプションは、ループ並列化オプション、-xexplicitpar、のうちの 1 つと組み合わせて使用します。
-xautopar、-xparallelSun WorkShop には、MPC オプションを使用するために必要なライセンスが含まれます。コードの実行速度を高めたければ、このオプションにはマルチプロセッサシステムが必要です。シングルプロセッサシステムでは、通常、生成されたコードの実行速度は低下します。
コンパイルとリンクを別々に実行し、コンパイルに
-Zlpを指定する場合は、リンクにも必ず-Zlpを指定してください。1 つのサブプログラムを
-Zlpを用いてコンパイルする場合、そのプログラムのすべてのサブプログラムを-Zlpを用いてコンパイルする必要はありません。ただしループ情報が得られるのは-Zlpを用いてコンパイルしたファイルだけで、プログラムに他のファイルが入っているかどうかの通知はありません。リンカーに渡されるオプション
ccは-a、-e、-h、-r、-u、-zを認識し、これらのオプションとその引数をldに渡します。認識できないオプションは警告付きでldに渡します。
|
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |