Provided by: manpages-ja_0.5.0.0.20161015+dfsg-1_all
名称
gcc, g++ - GNU プロジェクト C および C++ コンパイラ (gcc-2.95.3)
書式
gcc [ option | filename ]...
注意
このマニュアルに書かれた情報は GNU C コンパイラの完全な ドキュメンテーションからの抜粋であ り、オプションの意味の記述にとどめます。 このマニュアルはボランティアのメンテナンスが行なわれた時にのみ更新され るもので、常に最新 の情報を示しているわけではありません。 もしこのマニュアルと実際のソフトウェアの間に矛盾点 があれば、 正式なドキュメントである Info ファイルのほうを参照して下さい。 このマニュアル中の古い記述が重大な混乱や不具合をきたすことになれば、 このマニュアルページ の配布は中止します。 GNU CCのメンテナンス作業の都合上、 Info ファイルを更新した時にマニュ アルページも併せて更新することは できません。マニュアルページは時代遅れであり、 これに時間 をかけるべきではないと GNU プロジェクトでは考えています。 完全な最新のドキュメンテーションが必要な場合は、Info ファイルの`gcc' またはマニュアルの Using and Porting GNU CC (for version 2.0) を参照して下さい。この双方は Texinfo のソース ファイル gcc.texinfo から生成されます。
解説
C と C++ のコンパイラは統合されています。どちらの場合も、入力ファイル は、プリプロセス、コ ンパイル、アセンブル、リンクの 4 つの処理ステージの うちの 1 つ以上のステージを踏んで処理 されます。 ソースファイル名の拡張子によってソースの言語を識別しますが、 デフォルトの動作 は、どちらの名前でコンパイラを使うかに依存しています: gcc プリプロセス済みの (.i) ファイルを C のファイルと仮定し、C スタイルのリンクを行いま す。 g++ プリプロセス済みの(.i) ファイルを C++ のファイルと仮定し、C++ スタイルのリンクを行 います。 ソースファイル名の拡張子は、その言語が何であるかと、どのような処理が行われる べきかを示し ます: .c C言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .C C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .cc C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .cxx C++言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .m Objective-C 言語ソースです。プリプロセッサ、コンパイラ、アセンブラにかけられます。 .i プリプロセッサにかけられたC言語ソースです。コンパイラ、アセンブラにかけられます。 .ii プリプロセッサにかけられたC++言語ソースです。コンパイラ、アセンブラにかけられます。 .s アセンブリ言語ソースです。アセンブラにかけられます。 .S アセンブリ言語ソースです。プリプロセッサ、アセンブラにかけられます。 .h プリプロセッサファイルです。通常はコマンドラインには現れません。 その他の拡張子を持つファイルはリンカに渡されます。以下のものがあります。 .o オブジェクトファイルです。 .a アーカイブファイルです。 リンクは、オプション -c, -S, -E を指定して抑制しないかぎり(もしくはコンパイルエラーによっ てすべての処理が中断 しないかぎり)、常に最終ステージで実行されます。 リンクのステージにお いては、ソースファイルに対応した全ての .o ファイルと、 -l で指定したライブラリと、認識され なかったファイル名 (名前に .o のついたオブジェクトファイルや .a のついたアーカイブを含む) は、 コマンドラインに並べられた順番でリンカに渡されます。
オプション
オプションは分割されていなければなりません。すなわち `-dr' は `-d -r 'とは異なった扱いを受 けます。 ほとんどの `-f' と `-W' 形式のオプションには、 -fname と -fno-name (または -Wname と -Wno-name) の形式の、対照的な表現があります。ここではデフォルトでない形式の みを示します。 すべてのオプションを種類別に分けてまとめました。詳しい解説は 以下の節で行ないます。
FreeBSD 固有のオプション
-pthread スレッド化ユーザプロセスに libc の代りに libc_r をリンクします。 スレッド化ユーザプ ロセスにリンクされるオブジェクトは -D_THREAD_SAFE 付きで コンパイルする必要がありま す。 -kthread スレッド化カーネルプロセスに libc に加えて libpthread をリンクします。 スレッド化 カーネルプロセスにリンクされるオブジェクトは -D_THREAD_SAFE 付きで コンパイルする必 要があります。 全体的なオプション -c -S -E -o file -pipe -v -x language 言語オプション -ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs 警告オプション -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings デバッグオプション -a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name 最適化オプション -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3 -O0 -Os プリプロセッサオプション -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef アセンブラオプション -Wa,option リンカオプション -llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol ディレクトリオプション -Bprefix -Idir -I- -Ldir ターゲットオプション -b machine -V version コンフィギュレーション依存オプション M680x0 オプション -m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float VAX オプション -mg -mgnu -munix SPARC オプション -mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress Convex オプション -margcount -mc1 -mc2 -mnoargcount AMD29K オプション -m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers M88K オプション -m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs RS6000 オプション -mfp-in-toc -mno-fop-in-toc RT オプション -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return MIPS オプション -mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mlonglong128 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp i386 オプション -m386 -m486 -mpentium -mpentiumpro -mno-486 -mcpu=cpu type -march=cpu type -msoft-float -mrtd -mregparm -msvr3-shlib -mno-ieee-fp -mno-fp-ret-in-387 -mfancy-math-387 -mno-wide-multiply -mdebug-addr -mno-move -mprofiler-epilogue -reg-alloc=LIST HPPA オプション -mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon i960 オプション -mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha オプション -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float System V オプション -G -Qy -Qn -YP,paths -Ym,dir コード生成オプション -fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm
全体的なオプション
-x language このオプションに続く入力ファイルの言語を language であると明示的に指定します (拡張 子に基づくデフォルトの選択よりも優先されます)。このオプションは、 次の `-x' オプ ションが出てくるまで、後続する全ての入力ファイルに対して 適用されます。language と しては、 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', `assembler-with-cpp' を指定することが可能です。 -x none 言語の指定を解除します。このオプションのあとに続くファイルは、それらの拡張子に 基づ いて (あたかも何の `-x' オプションも使用されたことがないように) 処理されます。 もし、4 つのステージ (プリプロセス、コンパイル、アセンブル、リンク) の うちの一部のみが必 要な場合は、 `-x' オプション (またはファイル名の拡張子) を使用して gcc に対してどのステー ジから開始するかを伝え、さらに `-c', `-S', `-E' のオプションのうちのどれかを使用して gcc に対してどこで処理を停止させるかを指定します。ここで、 いくつかの組み合わせ (例えば `-x cpp-output -E') は gcc に対して何の動作も行なわないように指定することになることに注意して ください。 -c ソースファイルを、コンパイルまたはアセンブルまではしますが、リンクはしません。 コン パイラの出力は、それぞれのソースファイルに対応したオブジェクトファイル となります。 デフォルトでは、GCC はオブジェクトファイルのファイル名として、 ソースファイルの拡張 子 `.c', `.i', `.s' 等を `.o' で置き換えたものを使用します。 -o オプションを使用す ることによって、他の名前を指定することも可能です。 GCC は -c オプションを使用した場合は、理解できない入力ファイル (コンパイルやアセン ブル を必要としないファイル) を無視します。 -S コンパイルが終った所で処理を停止し、アセンブルは行いません。 アセンブラコードではな い入力ファイルが指 定された場合は、出力はアセンブラコードのファイルになります。 デフォルトでは、GCC はアセンブラファイルのファイル名として、 ソースファイルの拡張子 `.c', `.i' 等を `.s' で置き換えたものを使用します。 -o オプションを使用することに よって、他の名前を指定することも可能です。 GCC はコンパイルを必要としない入力ファイルを全て無視します。 -E プリプロセス処理が終了したところで停止します。コンパイルはしません。 出力はプリプロ セス済みのソースコードであり、標準出力へと送られます。 GCC はプリプロセスを必要としない入力ファイルを全て無視します。 -o file 出力先を file に指定します。このオプションは GCC が実行可能ファイル、 オブジェクト ファイル、アセンブラファイル、プリプロセス済み C コードなどの、 いかなる種類の出力 を行なう場合にも適用可能です。 出力ファイルは 1 つしか指定できないため、 `-o' を複数の入力ファイルをコンパイルする 際に使用することは、実行ファ イルを出力する時以外は無意味です。 `-o'オプションを指定しなかった場合のデフォルトは、実行ファイルを作る場 合は `a.out' という名前であり、`source.suffix' の形式のファイル名を持ったソースファイルのオブ ジェクトファイルは `source.o' であり、アセンブラのファイルは `source.s' です。 プリ プロセス済みの C 言語は、全て標準出力に送られます。 -v (標準エラー出力に対して) コンパイルの各ステージで実行されるコマンドを 表示しま す。コンパイラドライバ、プリプロセッサおよび本来のコンパイラの 各バージョン番号も表 示します。 -pipe コンパイル時のステージの間のデータの受け渡しに、テンポラリファイルではなく パイプを 使用します。いくつかのシステムではアセンブラがパイプからの入力を受け 付けることがで きないために、このオプションを指定すると失敗します。 GNU アセンブラでは問題なく使用 できます。
言語オプション
以下のオプションは、コンパイラが受け付ける C の方言に関する制御を行ないます: -ansi 全ての ANSI 標準の C プログラムをサポートします。 このオプションは、GNU C が持つ ANSI C との非互換な機能を全て排除します。 例え ば、asm, inline, typeof などのキーワードや、unix や vax などの現在使用しているシス テムを規定する定義済みマクロなどが抑制されます。 さらに、好ましくなくかつほとんど使 用されない ANSI のトライグラフの機能を使 用可能とし、さらに `$' を識別子の一部とし て使用できないようにします。 代替キーワードである__asm__, __extension__, __inline__, __typeof__ は、 `-ansi' が 指定された場合でも使用することが可能です。もちろん、 これらを ANSI C プログラムで使 用することが望ましくないのは当然ですが、`-ansi' をつけてコンパイルされる場合で も、インクルードされるヘッダファイル中に これらが記述できるということは有用です。 __unix__ や __vax__ などの代替定義済みマクロは、 `-ansi' を指定する場合でも指定しな い場合でも、利用可能となっています。 `-ansi' オプションは、ANSI 準拠でないプログラムを不必要に拒否することは ありませ ん。もしこのような動作を行なわせたい場合には`-ansi'に加えて-pedantic' オプションを 指定する必要があります。 プリプロセッサ定義済みマクロ __STRICT_ANSI__ が `-ansi' オプションを使用した際には 定義されます。いくつかのヘッダファイルは、この マクロを識別して、ANSI 標準が望まな い関数やマクロの定義を抑制します。 これは、 それらの関数やマクロと同じ名前を別の目 的で使用するプログラム を混乱させないようにするためです。 -fno-asm asm, inline, typeof をキーワードとして解釈しません。 これらの単語は識別子として解釈 されるようになります。これらの代用として __asm__, __inline__, __typeof__ が使用でき ます。 `-ansi' を指定すると、暗黙のうちに `-fno-asm' を指定したものとみなされます。 -fno-builtin ビルトイン関数のうち、2 つのアンダースコアで始まるもの以外を認識しなくなり ます。現 在、この指定は_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy, strlen の関数に影響を及ぼします。 `-ansi' オプションを指定すると、alloca と _exit はビルトイン関数として扱われなくな ります。 -fhosted ホスト実行環境 (hosted environment) 用にコンパイルを行います。 これによ り、`-fbuiltin' オプションが有効になり、また、不審な main 宣言に対して警告を発する ようになります。 -ffreestanding フリースタンディング実行環境 (freestanding environment) 用に コンパイルを行います。 これにより、`-fno-builtin' オプションが有効になり、また、 main に特別な条件は不要と みなします。 -fno-strict-prototype `int foo ();' のような、引数を指定しない関数宣言を、C 言語のように引数の数や 型につ いて何の仮定もしないという扱いにします (C++ のみ)。通常はこのよう な宣言は、C++ で は foo という関数が 1 つも引数をとらないことを意味します。 -trigraphs ANSI C のトライグラフを使用可能とします。`-ansi' オプションを指定すると、暗黙のうち に `-trigraphs' を指定したものとみなされます。 -traditional 伝統的な C コンパイラのいくつかの特徴をサポートします。詳しくは GNU C の マニュアル を参照してください。以前はここにそのリストの複製を載せていましたが、 それらが完全に 時代遅れになった時に我々に文句が来ないように削除してしまいま した。 しかし、C++ のプログラムだけについて (C ではありません) 特記しておくこと が 1 つあ ります。 `-traditional' オプションは C++ に対して 1 つだけ特別な効果を持ちます。そ れは、 this への代入を許可するというものです。これは `-fthis-is-variable'オプション の指定が及ぼす効果と同一のものです。 -traditional-cpp 伝統的な C プリプロセッサのいくつかの特徴をサポートします。これは上に挙 げた中で特 にプリプロセッサに関係したものを含みますが、 `-traditional' の指定によって引き起こ される以外の効果を及ぼすことはありません。 -fdollars-in-identifiers 識別子中の `$' の使用を許可します (C++ のみ)。 `-fno-dollars-in-identifiers' を使用 することによって、明示的に `$'の使用を禁止することも可能です。(GNU C++ では、デフォ ルトで `$' を許可しているシステムと禁止しているシステムがあります)。 -fenum-int-equiv int から列挙型への暗黙の変換を許可します (C++ のみ)。通常は GNU C++ は enum から int への変換は許可していますが、 逆は許していません。 -fexternal-templates テンプレート関数について、その関数が定義された場所にのみ単一のコピー を生成すること によって、テンプレート宣言に対してより小さなコードを生成 します (C++ のみ)。このオ プションを使用して正しいコードを得るためには、 テンプレートを使用する全てのファイル において、`#pragma implementation' (定義) または `#pragma interface' (宣言) を記述 しておく必要があります。 `-fexternal-templates' を指定してコンパイルを行なう場合には、全てのテンプレートの 実体は external となります。全ての使用される実体はインプリメンテーション ファイル中 にまとめて記述しておかなければなりません。これはその必要とされ る実体に対応した typedef 宣言を行なうことによって実現できます。 逆に、デフォルトのオプション `-fno-external-templates' でコンパイルした場合には全てのテンプレートの実体は internal と なります。 -fall-virtual 可能な限り全てのメンバ関数を暗黙のうちに仮想関数として扱います。 全てのメンバ関数 (コンストラクタと new , delete メンバ演算子を除きます) は、出現した時点でそのクラス の仮想関数とし て扱われます。 これは、これらのメンバ関数への全ての呼び出しが仮想関数のための内部 テーブルを参照し て間接的に決定されるということを意味しません。特定の状況 においては、コンパイラは与 えられた仮想関数への呼び出しを直接決定できます。 このような場合にはその関数呼び出し は常に直接呼び出しとなります。 -fcond-mismatch 条件演算子の第 2, 第 3 引数の型が異なる記述を許します。このような式の型は void とな ります。 -fthis-is-variable this への代入を許可します (C++ のみ)。ユーザ定義による記憶管理が可 能となった現在で は、 `this' への代入は時代遅れのものとなりました。従ってデフォルトでは、クラスの メ ンバ関数からの this への代入は不当なものとして扱われています。しかし、後方互換性の ために、 `-fthis-is-variable' を指定することによってこの効果を得ることができます。 -funsigned-char char 型を unsigned char のように符号無しとして扱います。 それぞれのマシンには char がどちらであるべきかというデフォルトがあります。 デフォル トで unsigned char であることもあれば、デフォルトで signed char であることもありま す。 理想的には、可搬性のあるプログラムは、オブジェクトの符号の有無に依 存する記述を行な う場合には常に signed char、もしくは unsigned char を使用すべきです。 しかし実際に は多くのプログラムが単なる char を用いて記述されており、さらにそのプログラムを記述 した 環境に依存して、符号付きである、あるいは符号無しであるという暗黙の仮定が 行な われています。このオプション、あるいはこの逆のオプションは、デフォル トと逆の動作を 行なわせることにより、これらのプログラムを正しく動作させ ることを可能にします。 char 型は常に signed char あるいは unsigned char とは区別された型として扱われま す。常にそれらの振舞いがそのどち らかと全く同じであるということに関わらず、このよう な扱いを行います。 -fsigned-char char 型を signed char 型のように符号付きとして扱います。 ただし、このオプションは `-fno-unsigned-char' と等価です。これは `-funsigned-char'の否定形です。同様に `-fno-signed-char' は `-funsigned-char' と等 価です。 -fsigned-bitfields -funsigned-bitfields -fno-signed-bitfields -fno-unsigned-bitfields これらのオプションは、明示的に `signed' または `unsigned' の指定が行なわれていない ビットフィールドに対して、符号つきであるかある いは符号なしであるかを制御します。デ フォルトではこのようなビットフィール ドは符号つきとなっています。なぜなら、 int の ような基本的な型は符号つきであるという点で、整合性がとれるからです。 ただし、`-traditional' を指定した場合は、ビットフィールドは常に全て符号無しであると されます。 -fwritable-strings 文字列定数を書き込み可能なデータセグメントに配置し、同内容の文字列を 1 つの共有オブ ジェクトにする処理を行いません。これは、文字定数に書き込む ことができることを仮定し た昔のプログラムとの互換性をとるために提供され ています。`-traditional' オプション も同様の効果を含みます。 文字定数に書き込むという考えは非常によくない考えです。“定数” はまさに定数であり、変 化すべきではありません。
プリプロセッサオプション
これらのオプションは C プリプロセッサを制御します。 各 C ソースファイルは、実際にコンパイ ルする前に、C プリプロセッサに かけられます。 `-E' オプションを使用すると、GCC はプリプロセス以外の処理を行いません。 以下に示すオプショ ンのうちのいくつかは、`-E' と同時に使用された時のみ意味をもちます。なぜならば、これらのオ プション によって、実際のコンパイルには不適当なプリプロセッサ出力が生成されるためです。 -include file file を、通常の入力ファイルが処理される前に処理します。結果的に file に含まれる内容 は、一番最初にコンパイルされることになります。コマンドラ インに指定されたすべての `-D' や `-U' オプションは、その記述された順番に関わらず常に `-include file' が処理 される前に処理されます。全ての `-include' や `-imacros' オプションは、それらが記述 された順番通りに処理されます。 -imacros file 通常の入力ファイルを処理する前にfile を入力として処理しますが、その結果の出力を捨て ます。 file によって生成された出力は捨てられるため、`-imacros file' の処理結果の影 響は、file 中に記述されたマクロがメインの入力ファイル中で使用可能になることだけで す。 プリプロセッサは、`-imacros file' が記述された順番に関わらず、これを処理する前 に、 コマンドラインから与えられた全ての `-D' や `-U' オプションを評価します。全ての `-include' および `-imacros' オプションは、それらが記述された順番通りに処理されま す。 -idirafter dir ディレクトリ dir を第 2 インクルードパスに加えます。第 2 インクルードパス中のディレ クトリは、 メインインクルードパス (オプション `-I' によって追加されます) 中にヘッダ ファイルを探した結果発見できな かった場合に検索されます。 -iprefix prefix prefix を、その後に続く `-iwithprefix' オプション用のプレフィックスとして使用しま す。 -iwithprefix dir ディレクトリを第 2 インクルードパスに追加します。ディレクトリ名は prefix と dir を 連結することによって得られます。ここで prefix は、`-iprefix' オプションによって指定 されたものです。 -nostdinc ヘッダファイルのための標準のシステムディレクトリを検索しません。`-I' オプションに よって指定したディレクトリ (またはカレントディレクト リ) のみを検索します。 `-nostdinc' と `-I-'を使用することにより、インクルードファイルの検索パスを明示的に 指 定したディレクトリのみに限定することが可能となります。 -nostdinc++ ヘッダファイルの検索に、C++-固有の標準ディレクトリを用いません。ただ しそれ以外の標 準ディレクトリは検索されます。 (このオプションは `libg++' の構築に使用されます。) -undef 標準でない定義済みマクロ(アーキテクチャフラグも含めて)を定義しません。 -E C プリプロセッサの処理のみを行います。指定された全ての C のソースファイル に対して プリプロセスを行ない、標準出力、または指定された出力ファイルに 対して出力を行いま す。 -C プリプロセッサに対してコメントの削除を行なわないように指示します。 `-E' オプション とともに使用されます。 -P プリプロセッサに対して `#line' コマンドを生成しないように指示します。 `-E' オプショ ンとともに使用されます。 -M [ -MG ] プリプロセッサに対してmake で使用可能な、オブジェクト間の依存関係を記述した出力を生 成するように指示 します。それぞれのソースファイルに対して、プリプロセッサはmake の ための規則を 1 つ出力します。この出力は、ターゲットとして そのソースファイルから生 成されるオブジェクトファイルのファイル名をとり、 依存するファイルのリストとしては `#include' によってソースファイルに 読み込まれる全てのファイルの名前が並びます。こ の 規則は 1 行、あるいは長い場合には`\' と改行を入れて複数行で出力されます。この規 則のリストは、プリプロセス済 みの C プログラムのかわりに、標準出力へと出力されま す。 `-M' は暗黙のうちに `-E' を含みます。 `-MG' を指定すると、見つからないヘッダファイルは生成されたファイルであり、 それらは ソースファイルと同じディレクトリに存在するとみなします。 これは `-M' と同時に指定し なければなりません。 -MM [ -MG ] `-M' と似ていますが、`#include "file"'によってインクルードされるユーザ定義のヘッダ ファイルのみを対象に した出力ファイルを生成します。`#include <file>' によってインク ルードされるシステムヘッダファイルは省略されます。 -MD `-M' と似ていますが、依存情報は出力ファイル名の最後の `.o' を `.d' に置き換えたファ イル名のファイルに対して出力されます。 `-MD' を指定したファイルのコンパイルもこれに 加えて行なわれ、 `-M' のように通常のコンパイルを抑制することはありません。 Mach のユーティリティである`md' は、これらの複数の `.d' ファイルを `make' コマンド によって使用できる単一の依存記述ファイルへとマージするのに使用 することができます。 -MMD `-MD' と似ていますが、ユーザヘッダファイルのみを対象とし、システムヘッダ ファイルを 無視します。 -H 通常の動作に加えて、使用されたヘッダファイルの名前を表示します。 -Aquestion(answer) questionに対するアサーション answer を定義します。これは `#if #question(answer)' のようなプリプロセッサ条件節によってテストされます。`-A-' は標準のアサーション(通常 はターゲットマシンに関 する情報を表している)を禁止します。 -Dmacro マクロ macro に対して文字列 `1' を定義として与えます。 -Dmacro=defn マクロ macro を defn として定義します。コマンドライン上の全ての `-D' オプションは `-U' オプションの処理を行なう前に処理されます。 -Umacro マクロ macro の定義を無効にします。`-U' オプションは全ての `-D' オプションの処理が 終了した後、`-include' と `-imacros' オプションの処理の前に処理されます。 -dM プリプロセッサに対して、プリプロセス終了時に有効であったマクロの定義の みを出力する ように指示します。`-E' オプションとともに使用します。 -dD プリプロセッサに対して、全てのマクロ定義を適切な順番で出力中にそのまま 出力するよう に指示します。 -dN `-dD' と似ていますが、マクロの引数と内容を削除します。 出力には`#define name' のみ が含まれます。
アセンブラオプション
-Wa,option option をアセンブラに対するオプションとして渡します。option がコンマを含む場合 は、そのコンマで区切られた複数のオプションとして与え られます。
リンカオプション
これらのオプションは、コンパイラがオブジェクトファイル群をリンクして 1 つ の実行可能ファイ ルを出力する際に使用されるものです。これらはコンパイラが リンクステップを行なわない場合に は意味を持ちません。 object-file-name 特別に認識される拡張子で終っていないファイル名は、オブジェクトファイル、 またはライ ブラリであると認識されます。(オブジェクトファイルとライブラリ はリンカがその内容を 参照することで区別されます。) GCC がリンクステップを 行なう場合は、これらのファイル はリンカへの入力として使用されます。 -llibrary 名前が library であるライブラリをリンク時に使用します。 リンカは、標準のライブラリ用ディレクトリのリスト中から、 実際のファイル名が `liblibrary.a' であるファイルを検索します。リンカはこのファイルを、ファイル 名で直 接指定した場合と同様に使用します。 検索するディレクトリには、いくつかの標準システムディレクトリと、`-L' によって指定し たディレクトリが含まれます。 通常、この方法で発見されるファイルはライブラリファイル、つまりいくつかの オブジェク トファイルをメンバとして含むアーカイブファイルです。 リンカは、アーカイブファイルの 中を検索して、 参照されているが定義されていないシンボルを定義しているメンバを 探し 出します。 しかし、もしリンカがライブラリでなく通常のオブジェクトファイルを発見した 場合は、そのオブジェクトファイルを通常の方法でリンクします。`-l' オプションを使用す る場合とファイル名を直接指定する場合の違いは、`-l' の場合が library を `lib' と `.a' で囲み、いくつものディレクトリを検索することだけです。 -lobjc Objective C のプログラムをリンクする場合は、この特別な -l オプションを指定する必要 があります。 -nostartfiles リンク時に、標準のシステムスタートアップファイルを使用しません。 標準ライブラリは通 常通りに使用されます。 -nostdlib リンク時に、標準のシステムライブラリとスタートアップファイルを使用しません。 指定し たファイルのみがリンカに渡されます。 -static ダイナミックリンクをサポートするシステムにおいて、このオプションは共有 ライブラリと のリンクを抑制します。それ以外のシステムではこのオプションは 意味を持ちません。 -shared 他のオブジェクトとリンクして実行可能プログラムを形成し得る共有オブジェクトを 生成し ます。ごく少数のシステムでのみ、このオプションはサポートされ ています。 -symbolic 共有オブジェクトを構築する際に、グローバルなシンボルへの参照をバインド します。全て の解決できなかった参照に対して警告を与えます (ただしリンクエディタオプション `-Xlinker -z -Xlinker defs' によってこれを無効化した場合を除きます)。ごく少数のシス テムでのみ、 このオプションはサポートされています。 -Xlinker option オプション option をリンカに対して渡します。リンカに渡すシステム固有のオプション が、 GNU CC が理解できないものである場合に利用できます。 引数を持ったオプションを渡したい場合は、 `-Xlinker' を 2 度使用すれば可能です。1 度 目でオプションを渡し、2 度目で引数を 渡します。例えば `-assert definitions' を渡す には、 `-Xlinker -assert -Xlinker definitions' のように記述すれば可能です。 `-Xlinker "-assert definitions"' のように指定した場合は正常に動作しません。なぜなら これは、文字列全 体を 1 つの引数として渡してしまい、リンカの期待する形式と異なって しま うからです。 -Wl,option オプション option をリンカに渡します。option がコンマを含む場合は、それらのコンマで 複数のオプションとして分割されます。 -u symbol シンボル symbol が未定義であるかのように振舞います。これは強制的にこのシンボルを定 義してい るライブラリモジュールをリンクするために使用します。`-u' は異なったシンボ ルに対して複数回使用することができます。これによっ て、さらに多くのライブラリモ ジュールを読み込ませることができます。
ディレクトリオプション
これらのオプションは、ヘッダファイル、ライブラリ、コンパイラの一部を検 索するディレクトリ を指定するために使用されます。 -Idir ディレクトリ dir を、インクルードファイルの検索するディレクトリのリスト中に追加しま す。 -I- `-I-' オプション指定前に `-I' オプションによって指定された全てのディレクトリ は、`#include "file"' の形式によってのみ検索されます。 これらのディレクトリは `#include <file>' によっては検索されません。 ` -I-' オプション指定後に `-I' で指定したディレクトリは、全ての `#include' 命令に よって検索されます。(通常は 全ての `-I' で指定されたディレクトリは この方法で検索さ れます。) これに加えて `-I-' オプションは、カレントディレクトリ (現在の入力ファイルが存在する ディレクトリ) が `#include "file"' に対する最初の検索対象となることを抑制しま す。`-I-' によるこの効果を上書きする方法はありません。`-I.' を指定することによっ て、コンパイラが起動されたディレクトリが検索 されることを指定することは可能です。こ れはプリプロセッサが行なう デフォルトの動作とは異なりますが、たいていはこれで十分で す。 `-I-' は、ヘッダファイルの検索に標準のシステムディレクトリを使うことを抑制 するわけ ではありません。 従って、`-I-' と `-nostdinc' は 独立です。 -Ldir ディレクトリdir を `-l' による検索が行なわれるディレクトリのリストに加えます。 -Bprefix このオプションはコンパイラ自身の実行形式、ライブラリ、データファイルの 検索場所を指 定します。 コンパイラドライバはサブプログラム `cpp', `cc1' (または C++ においては `cc1plus'), `as', そして `ld' を 1 つ、あるいはそれ以上起動します。コンパイラドライバは、 起動 するプログラムのプレフィックスとして prefix に `machine/version/' をつけたものとつ けないものの双方を 使用します。 コンパイラドライバは各サブプログラムの起動時に、 `-B' プレフィックスの指定がある場 合は、それを最初に利用します。もしその 名前が見つからなければ、または `-B' が指定さ れていなければ、ドライバは 2 つの標準プレフィックス `/usr/lib/gcc/' と `/usr/local/lib/gcc-lib/' を試します。このどちらにも見つからなければ、コンパイラド ライバは、 環境変数 `PATH' のディレクトリリストを利用して、そのプログラム名を検索し ます。 ランタイムサポートファイル `libgcc.a' も、必要ならば `-B' プレフィックスを用いて検 索されます。もしそこに見つからなければ、 前記 2 つの標準プレフィックスが試みられま すが、それで終りです。この場合は リンクの対象から外されます。ほとんどの場合、またほ とんどのマシンでは、`libgcc.a' は実際には必要ではありません。 これと同じ効果を、環境変数 GCC_EXEC_PREFIX によっても得ることができます。もしこの環 境変数が定義されていれば、こ の値がプレフィックスとして同様に使用されます。もし `-B' オプションと GCC_EXEC_PREFIX 環境変数の双方が存在した場合は、`-B' オプションが 最初に使用され、環境変数は次に使用されます。
警告オプション
警告は、本質的に間違いであるわけではありませんが、危険な構造を報告したり、 エラーがあるか もしれないような部分を示唆する診断メッセージです。 以下のオプションは、GNU CC が生成する警告の量と種類を制御します。 -fsyntax-only コードの文法エラーをチェックしますが、一切出力は行いません。 -w 全ての警告メッセージを抑制します。 -Wno-import #import の利用による警告メッセージを抑制します。 -pedantic 厳密な ANSI 標準 C 言語で規定している全ての警告を表示し、許されていない拡張を 使用 したプログラムを全て拒否します。 正当な ANSI 標準 C プログラムは、このオプションの有無に関わらず コンパイルできるべ きです (もっとも、ほんのわずかではありますが `-ansi' を必要とするものはありま す)。しかし、このオプションを使用しない場合、 GNU 拡張や伝統的な C の特徴も、これに 加えてサポートされます。このオプション を使用すれば、それらは拒絶されます。このオプ ションを使う理由はありませんが、こだわりのある人々を満足させるためにのみ 存在してい ます。 `-pedantic' は、始まりと終りとが `__' である代替キーワードの使用については、警告し ません。 同様に __extension__ に続く表現についても警告しません。しかし、システム ヘッダファイルのみ がこの抜け道を使用すべきであり、アプリケーションプログラムはこれ を避け るべきです。 -pedantic-errors `-pedantic' と似ていますが、警告のかわりにエラーを出します。 -W 以下のイベントに対して、特別な警告メッセージを表示します。 • volatile でない自動変数が longjmp の呼び出しによって変更され得る場合です。これらの 警告は、最適化コンパイル の時のみ問題になり得ます。 コンパイラは setjmp の呼び出しのみを見ています。コンパイラは、どこで longjmp が呼び 出されるかを知ることはできません。実際には、シグナルハンドラは コード中の任意の場所 で longjmp を呼び出すことができます。従って、実際には longjmp への呼び出しが危険な 部分からはおこなわれていないために問題のないプ ログラムであっても、警告が発せられる ことになります。 • 関数が、値を伴ってリターンする場合と、値を伴わずにリターンする場合の両方 が起こりう る場合です。 (関数の最後を抜けていくことは、値を伴わずに関数をリターンするとみなさ れます。) 例えば、次の関数がこの種類の警告を引き起こします。 foo (a) { if (a > 0) return a; } ある関数 (abort やlongjmp を含む) が決してリターンしないということを GNU CC が理解 できないために、にせの警告 が発生するかもしれません。 • 式文 (expression-statement) またはコンマ式の左部分が 一切の副作用を含まない場合で す。 警告を抑制するには、使用しない式を void にキャストして下さい。 例えば `x[i,j]' といった式は警告されますが、`x[(void)i,j]' は警告されません。 • 符号無しの値が 0 と `>' または `<=' で比較される場合です。 -Wimplicit-int 型を指定していない宣言に対して警告します。 -Wimplicit-function-declaration 宣言に先立って用いられた関数に対して警告します。 -Wimplicit -Wimplicit-int および -Wimplicit-function-declaration と同じです。 -Wmain main 関数が不審な型で宣言あるいは定義されている場合に警告します。 通常、main は外部 リンケージを持ち、 int を返し、0 個または 2 個の引数をとる関数です。 -Wreturn-type 関数の戻り値の型が、デフォルトである int に定義された時に常に警告します。また、戻り 値の型が voidでない関数内に、戻り値のない return 文がある場合にも常に警告します。 -Wunused ローカル変数が宣言されたにも関わらず使用されていない場合、静的に宣言さ れた関数の実 体が定義されていない場合、計算結果が明らかに 利用されていない場合に常に警告します。 -Wswitch switch 文がインデックスとして列挙型をとっている時、その列挙型中のいくつ かの値に対 する case が欠けている場合に常に警告します。(default ラベルが存在する場合、この警告 は出ません。) このオプションを使用した場合 には、列挙型の範囲を越えた case ラベル も、常に警告されます。 -Wcomment コメントの開始文字列 `/∗' がコメント中に現れた時に常に警告します。 -Wtrigraphs トライグラフの出現を常に警告します (トライグラフが使用可能であると仮定します)。 -Wformat printf, scanf などへの呼び出しに対して、与えられた引数が、フォーマット文字列の指 定 を満足する型を持っているかを検査します。 -Wchar-subscripts 配列の添字の型が char であった場合に警告します。これはよくある間違いのもとです。 い くつかのマシンにおいてはこの型が符号付きであることを、 プログラマはしばしば忘れてし まいます。 -Wuninitialized 初期化されていない自動変数が使用されています。 これらの警告は、最適化コンパイルを行なう時のみ発生します。なぜなら、 コンパイラは最 適化を行なう時にのみデータフロー情報を必要とするからです。 もし `-O' を指定しなかっ た場合は、この警告を得ることはできません。 これらの警告は、レジスタ割り当ての対象となった変数についてのみ発生します。 従っ て、volatile であると宣言された変数や、アドレス上に割り当てられた変数、サイズが 1, 2, 4, 8 バイト以外の変数に関してはこれらの警告は発生しません。 さらに、構造体、共用 体、配列については、たとえそれらがレジスタに 割り当てられたとしても、これらの警告は 発生しません。 ある変数によって計算された値が結局使用されないような変数については、一切の 警告が生 じないことに注意して下さい。このような計算は、警告が表示される前に データフロー解析 によって削除されます。 これらの警告をオプションにした理由の一つは、GNU CC がまだあまり賢くなくて、 ある コードが一見間違いを含むかのように見えても それは実は正しいものかもしれない、 とい うことを GNU CC が理解できない、というものです。 ここにその 1 つの例を挙げます。 { int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); } もし y の値が常に 1, 2 あるいは 3 である限りは x は常に 初期化されます。しかし GNU CC はこれを知ることはできません。もう 1 つの一般 的な例を挙げます。 { int save_y; if (change_y) save_y = y, y = new_y; ... if (change_y) y = save_y; } これはバグを含みません。なぜなら save_y は、その値が設定された時のみ使用されるから です。 いくつかのにせの警告は、使用している決してリターンしない関数全てに対して volatile と宣言することによって防ぐことが可能です。 -Wparentheses ある特定の文脈中で括弧が省略されていた場合に警告します。 -Wtemplate-debugging C++ プログラムにおいてテンプレートを使用している際に、デバッグが完全に 可能でない場 合を警告します (C++ のみ)。 -Wall 全ての上に挙げた `-W' オプションを結合したものです。これらのオプションは全て、 たと えマクロとの組み合わせ であっても、避けたほうがいいと我々が推奨する用法や、 簡単に 避けることができると我々が信じている用法に関するものです。 残りの `-W...' オプションは `-Wall' によっては暗黙のうちに指定されません。なぜならこれら は、クリーンなプ ログラムにおいても、ある状況においては使用することが妥当であると我々が 考 える構造についての警告を行なうオプションだからです。 -Wtraditional 伝統的な C と ANSI C において異なった振舞いをする特定の構造について警 告します。 • マクロ引数がマクロ本体内の文字列定数に現れるものです。これは、伝統的な C に おいて はその引数で置換しましたが、ANSI C においては定数の一部として扱わ れます。 • ブロック内で外部宣言であると宣言され、かつそのブロックの終端の後で 使用されている関 数です。 • オペランドとして long 型をとる switch 文です。 -Wshadow ローカル変数が他のローカル変数を隠している時に常に警告します。 -Wid-clash-len 2 つの全く別の識別子の最初の len 文字が一致した時に警告します。これはある種の旧式な おばかさんコンパイラでコンパイルされ得るプログラムを作る場合に役に立ちます。 -Wpointer-arith 関数型や void の “サイズ” に依存するものを全て警告します。GNU C はこれらに対して、 サイズ 1 を割り当てています。これは void ∗ ポインタと関数へのポインタにおける計算を 簡便にするためです。 -Wcast-qual ポインタが、型修飾子が削除されるようにキャストされる全ての場合に警告します。 例えば const char ∗ を 普通の char ∗ にキャストした場合に警告がなされます。 -Wcast-align ポインタのキャストにおいて、そのターゲットに要求される境界条件が 大きくなるような キャストを全て警告します。例えば char ∗ が int ∗ へとキャストされると、整数が 2、あ るいは 4 バイト境界でしかアクセスで きないマシンにおいては警告が発せられます。 -Wwrite-strings 文字定数に対して、型 const char[length] を与え、非-const の char ∗ ポインタへのアド レスのコピーに対して警告するようにします。この警告は、 宣言とプロトタイプにおいて const の使用を非常に注意深くおこなっていさえすれば、 文字列定数に書き込みをしそうな コードをコンパイル時に発見することを助けますが、 そうでない場合は有害無益な指定で す。これが、我々がこの警告を `-Wall' のリクエストに含めなかった理由です。 -Wconversion 同じ引数が与えられた時に、プロトタイプが存在する場合とプロトタイプが 存在しない場合 とで、異なった型変換を引き起こす場合について警告します。 これは固定小数点から浮動小 数点への変換やその逆、デフォルトの動作と異なる固定 小数点引数の幅や符号の有無の変換 が含まれます。 -Waggregate-return 構造体や共用体を返す関数を定義した場合や、 それらを呼び出す全ての場合に警告します。 (配列を返すことができる言語においても、これは警告を引き起こします。) -Wstrict-prototypes 引数の型を指定せずに関数を宣言、あるいは定義した場合に警告します。 (以前に引数の型 を指定した宣言が存在する場合には、旧式の関数宣言に対しては 警告をしません。) -Wmissing-declarations グローバルな関数を、その前にプロトタイプ宣言をせずに定義した場合に 警告します。 こ の警告は、たとえその定義自身がプロトタイプを含んでいたとしても発生します。 この警告 の目的は、ヘッダファイル中にグローバル関数の定義を忘れるこ とを防ぐことにあります。 -Wredundant-decls 同一スコープ中で複数回、同一対象を宣言した場合に、たとえそれが正当で何も 変化させな い場合であっても警告します。 -Wnested-externs 関数内で extern 宣言を行なった場合に警告します。 -Wenum-clash 異なる列挙型の間で変換を行なった際に警告します (C++ のみ)。 -Wlong-long long long 型が使用されている場合に警告します。これはデフォルトです。 この警告メッ セージを抑止するには `-Wno-long-long' フラグを用いて下さい。フラグ `-Wlong-long' お よび `-Wno-long-long' は、フラグ `-pedantic' 使用時のみ考慮されます。 -Woverloaded-virtual (C++ のみ。) 導出クラスにおいて、仮想関数の定義は基底クラスで定義された仮想関数の型 の記述と一致していなければなりません。このオプションを使用することによっ て、基底ク ラスにおける仮想関数と同一の名前を持ち、基底クラスのいかなる 仮想関数とも異なった型 の記述を持つ関数に対して警告が行われます。これに よって、導出クラスが仮想関数を定義 しようとして失敗する場合を警告するこ とができます。 -Winline 関数がインライン宣言されている、あるいは -finline-functions オプションが与えられて いる場合に、関数をインライン展開できなかった場合 に警告します。 -Werror 警告をエラーとして扱います。警告の後にコンパイルを中断します。
デバッグオプション
GNU CC は、ユーザのプログラムや GCC の双方をデバッグするために、 多くのオプションを備えて います。 -g オペレーティングシステムのネイティブのフォーマット (stabs, COFF, XCOFF, DWARF) でデ バッグ情報を生成します。GDB はこのデバッグ情報に基づい て動作することができます。 stabs フォーマットを使用するほとんどのシステムにおいては、`-g' を指定すると、GDB だ けが使用できる余分なデバッグ情報が使用可能に なります。 この特別の情報は GDB に対し てはよりよいデバッグを行なうことを可能 としますが、おそらく他のデバッガに対してはク ラッシュ、あるいはそのプログラムを 読めなくしてしまいます。この特別な情報の生成を制 御するためには `-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+', `-gdwarf' を使用してください (下記参照)。 他の多くの C コンパイラと異なり、GNU CC は `-g' を `-O' とともに使用することを許し ています。最適化されたコードが通る近道は、 時には驚くべき結果を生み出すかもしれませ ん。 定義したはずの変数が存在しなかったり、 制御の流れが予想もしなかった場所に移動 したり、結果が定数とわかる計算や、 結果がすでに手元にある文は実行されなくなり、ある 文がループの外に追い出されて 別の場所で実行されたりします。 それにも関わらず、このオプションは最適化された出力のデバッグを可能とし ています。こ れによって、バグを含むかもしれないプログラムに対して オプティマイザを使用することが できるようになります。 以下のオプションは、GNU CC を 1 つ以上のデバッグフォーマットを扱 えるように作成してある場 合に有益です。 -ggdb (もしサポートされていれば)ネイティブのフォーマットでデバッグ情報を生成 します。これ は可能な限りの全ての GDB 拡張を含みます。 -gstabs (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GDB 拡張は含みません。このフォーマットはほとんどの BSD システム上 の DBX で利用でき るフォーマットです。 -gstabs+ (もしサポートされていれば) stabs フォーマットでデバッグ情報を生成します。 ただし GNU デバッガ (GDB) でしか理解できない GNU 拡張を使用します。 この拡張を使用する と、他のデバッガでは、クラッシュや プログラムが読めなくなるなどの影響がおそらく出ま す。 -gcoff (サポートされていれば) COFF フォーマットでデバッグ情報を生成します。 これは、System V Release 4 より前の ほとんどの System V 上の SDB で利用できるフォーマットです。 -gxcoff (サポートされていれば) XCOFF フォーマットでデバッグ情報を生成します。こ れは IBM RS/6000 システムにおいて DBX デバッガによって使用される フォーマットです。 -gxcoff+ (もしサポートされていれば) XCOFF フォーマットでデバッグ情報の生成を行 います。ただ し、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張 を使用すると、他のデバッガに対してはクラッシュやプ ログラムを読みとり不能にするなど の影響を及ぼし得ます。 -gdwarf (もしサポートされていれば) DWARF フォーマットでデバッグ情報の生成を行 います。これ はほとんどの System V Release 4 システムにおいて SDB によっ て使用される形式です。 -gdwarf+ (もしサポートされていれば) DAWRF フォーマットでデバッグ情報の生成を行 います。ただ し、GNU デバッガ (GDB) によってのみ理解され得る GNU 拡張を使 用します。これらの拡張 を使用すると、他のデバッガに対してはクラッシュや プログラムを読みとり不能にするなど の影響を及ぼし得ます。 -glevel -ggdblevel -gstabslevel -gcofflevel -gxcofflevel -gdwarflevel デバッグ情報を要求しますが、同時に level によってどの程度の情報が必要かを指定しま す。デフォルトのレベルは 2 です。 レベル 1 は、デバッグを予定しないプログラムの部分に対してバックトレース を生成する に十分な最低限の情報を生成します。これは関数と外部変数の記述 を含みますが、ローカル 変数や行番号に関する情報は含みません。 レベル 3 はプログラムに含まれる全てのマクロ定義などの特別な情報を含みます。 いくつ かのデバッガは `-g3' の使用によってマクロの展開をサポートします。 -p プログラム prof によって使用されるプロファイル情報を書き込む特別なコードを生成しま す。 -pg プログラム gprof によって使用されるプロファイル情報を書き込む特別なコードを生成しま す。 -a 基本ブロックのプロファイル情報を書き込む特別なコードを生成します。これは それぞれの ブロックが何回実行されたかを記録します。このデータは tcov のようなプログラムによっ て解析されます。ただし、このデータフォーマットは tcov が期待するものとは異なってい ます。最終的には、GNU gprof が処理できるように拡張されるべきです。 -ax ファイル `bb.in' から基本ブロックプロファイルパラメータを読み出し、 ファイル `bb.out' にプロファイル結果を書き出すための、 特別なコードを生成します。 `bb.in' は 関数のリストを保持しています。 このリストに含まれる関数に入ると、プロファイリングが オンになります。 最外側関数を抜けると、プロファイリングはオフになります。 関数名が `-' で始まっている場合、その関数はプロファイル対象外に なります。もし関数名が唯一に 定まらない場合は、 `/path/filename.d:functionname' と記述することでこれらを区別でき ます。 `bb.out' には、いくつかの利用可能な関数がリストされます。 特別な意味をもつ関 数が 4 つあります: `__bb_jumps__' はジャンプ頻度を `bb.out' に書き出します。 `__bb_trace__' は基本ブロック列を `gzip' にパイプし、 ファイル `bbtrace.gz' に書き 出します。 `__bb_hidecall__' は call 命令をトレースから除外します。 `__bb_showret__' は return 命令をトレースに含めるようにします。 -dletters コンパイル中の letters で指定されるタイミングに、デバッグ用のダンプを生成するように 指示します。 これはコンパイラをデバッグするために使用されます。ほとんどのダンプの ファイル 名はソースファイル名に 1 単語をつなげたものになります。(例え ば、`foo.c.rtl' や `foo.c.jump' などです)。 -dM 全てのマクロ定義をダンプし、プリプロセス終了時に出力に書き出します。 その他には何も 書き出しません。 -dN 全てのマクロ名をダンプし、プリプロセス終了時に出力に書き出します。 -dD 全てのマクロ定義をプリプロセス終了時に通常の出力に加えてダンプします。 -dy パース中にデバッグ情報を標準エラー出力にダンプします。 -dr RTL 生成後に `file.rtl' に対してダンプします。 -dx 関数をコンパイルするかわりに、RTL を生成するのみの処理を行います。通常は `r' ととも に使用されます。 -dj 最初のジャンプ最適化の後に、`file.jump' に対してダンプします。 -ds 共通部分式削除 (しばしば共通部分式削除に続くジャンプ最適化も含みます) の終了 時に `file.cse' に対してダンプします。 -dL ループ最適化終了時に `file.loop' に対してダンプします。 -dt 第 2 共通部分式削除段階 (しばしば共通部分式削除に続くジャンプ最適化も 含みます) の 終了時に、`file.cse2' に対してダンプします。 -df フロー解析終了後に、`file.flow' に対してダンプします。 -dc 命令コンビネーション終了時に `file.combine' に対してダンプします。 -dS 第 1 命令スケジューリング段階終了時に `file.sched' に対してダンプします。 -dl ローカルレジスタ割り当て終了時に `file.lreg' に対してダンプします。 -dg グローバルレジスタ割り当て終了時に `file.greg' に対してダンプします。 -dR 第 2 命令スケジューリング段階終了時に `file.sched2' に対してダンプします。 -dJ 最終ジャンプ最適化終了時に `file.jump2' に対してダンプします。 -dd 遅延分岐スケジューリング終了時に `file.dbr' に対してダンプします。 -dk レジスタからスタックへの転換終了時に `file.stack' に対してダンプします。 -da 以上の全てのダンプを生成します。 -dm 処理の終了時に、メモリ使用に関する統計情報を標準エラー出力に出力します。 -dp どのようなパターンや選択肢が使用されたかを示すコメントをアセンブラ出力 中のコメント で解説します。 -fpretend-float クロスコンパイラで処理を行なう際に、ホストマシンと同じ浮動小数点フォーマット をター ゲットマシンが持つかのように振舞わせます。これは浮動小数点定 数の誤った出力を引き起 こしますが、実際の命令列はおそらく GNU CC を ターゲットマシンで起動した場合と同じも のとなるでしょう。 -save-temps 通常の “一時” 中間ファイルを消去せずに保存します。これらは カレントディレクトリに置 かれ、ソースファイルに基づいた名前が付けられます。 従って、`foo.c' を `-c -save-temps' を使用してコンパイルした場合は、 `foo.cpp', `foo.s' が、`foo.o' と同様 に生成されます。 -print-libgcc-file-name=library ライブラリファイル `library ' の完全な絶対名を表示します。このファイルはリンクの際 のみに使用され、 それ以外の働きはありません。このオプションが指定された場合は、GNU CC は コンパイルやリンクを何も行なわず、ただファイル名を表示するのみです。 -print-libgcc-file-name `-print-file-name=libgcc.a' と同じです。 -print-prog-name=program `-print-file-name' と似ていますが、`cpp' のような program を検索します。
最適化オプション
これらのオプションは様々な種類の最適化処理を制御します。 -O -O1 最適化を行います。最適化コンパイルは幾分長めの処理時間と、大きな関数に対 する非常に 多くのメモリを必要とします。 `-O' が指定されなかった場合は、コンパイラの目標はコンパイルのコストを 低減すること や、目的の結果を得るためのデバッグを可能とすることに置かれ ます。それぞれの文は独立 しています。つまり、ブレークポイントでプログラムを 停止させることによって、任意の変 数に新し い値を代入したり、プログラムカウンタを他の文へと変更することを可能とし、 そのソースコードにプログラマが望む正しい結果を得ることを可能にします。 `-O' を指定しなかった場合は、register と宣言した変数のみがレジスタへと割り当てられ ます。コンパイルの結果と して得られるコードは、PCC を `-O' なしで使用した場合と比較 して若干良くないものとなります。 `-O' が指定されると、コンパイラはコードのサイズと実行時間を減少させる ことを試みま す。 `-O' を指定することによって、 `-fthread-jumps' と `-fdefer-pop' のフラグが指定され ます。遅延スロットをもつマシンでは `-fdelayed-branch' が指定されます。フレームポイ ンタを使わないデバッグをサポートしている マシンでは、`-fomit-frame-pointer' も指定 されます。マシンによってはさらにその他のフラグが 指定されることもあります。 -O2 さらに最適化を行います。サポートされている最適化手段のうち、 空間と速度のトレードオ フを含まないものはほとんどの全て使用されます。 例えばループのアンローリングや関数の インライン化は行われません。 -O と比較して、このオプションはコンパイル時間と生成 コードの性能の双方を増加 させます。 -O3 さらなる最適化を行います。これは -O2 が行う全ての最適化手段に加えて -finline-functions も有効にします。 -Os サイズ優先で最適化します。 普通、コードを増大させることのない全ての -O2 最適化が有 効になります。 更に、コードサイズを減らすように設計された最適化も行います。 -O0 最適化を行いません。 複数の -O オプションを指定した場合は、レベル番号の有無に関わらず、最後に指定した も のが有効になります。 `-fflag' の形式を持ったオプションは、マシン独立のフラグです。ほとんどの フラグは有効形式と 無効形式の双方を持っています。`-ffoo' の無効形式は `-fno-foo' です。以下のリストでは、デ フォルトではない方の形式のみを示します。 これに対して `no-' を削除する、あるいは追加するこ とによって双方の形式を生成すること が可能です。 -ffloat-store 浮動小数点変数をレジスタに格納しません。このオプションは 68000 のように (68881 の) 浮動小数点レジスタが double よりも高い精度を持っていると思われるマシンにおいて、望 まない超過精度を 抑制することを可能にします。 ほとんどのプログラムにおいては、超過精度は単に良い結果を生むだけですが、 いくつかの プログラムは正確な IEEE の浮動小数点フォーマット定義に依 存しています。 このような プログラムに対して `-ffloat-store' を使用します。 -fmemoize-lookups -fsave-memoized コンパイルを高速に行なうために、ヒューリスティックスを使用します (C++ のみ)。これら のヒューリスティックスはデフォルトでは有効になってい ません。なぜなら、これはある種 の入力ファイルにしか効果がなく、その他の ファイルではかえってコンパイルが低速になる からです。 最初に、コンパイラはメンバ関数への呼び出し (あるいはデータメンバへの参 照) を構築し ます。これは (1) どのクラスでその名前のメンバ関数が実装さ れているかを決定し、(2) どのメンバ関数への呼び出しであるかという問題 (これはどの種類の型変換が必要となるか という決定も含みます) を解決し、(3) 呼び出し側に対するその関数の可視性を検査すると いう作業を行なう必要があります。 これらは全て、コンパイルをより低速にしてしまいま す。通常は、そのメンバ 関数への 2 度目の呼び出しが起こった場合も、この長い処理がま た行なわれ ることになります。これは次のようなコード cout << "This " << p << " has " << n << " legs.\n"; は、これらの 3 つの手順を 6 回繰り返すということを意味します。これに対し て、ソフト ウェアキャッシュを使用すると、そのキャッシュへの“ヒット ”は、コストを劇的に低減する ことが期待できます。不幸なことに、キャッシュ の導入によって異なったレイヤの機構を実 装することが必要となり、それ 自身のオーバヘッドが生じてしまいま す。`-fmemoize-lookups' はこのソフトウェアキャッシュを有効にします。 メンバとメンバ関数へのアクセス特権 (可視性) はある関数におけるコンテキスト と別の関 数におけるものとでは異なるので、 g++ はキャッシュをフラッシュしなければなりませ ん。`-fmemoize-lookups' フラグを使用すると、全ての関数をコンパイルするたびに毎回 キャッシュを フラッシュします。`-fsave-memoized' フラグは同一のソフトウェアキャッ シュについて、コンパイラが前回 コンパイルした関数のコンテキストが、次にコンパイルす るコンテキストと同 一のアクセス特権を有しているとみなせる時には、キャッシュを保持し ます。 これは同一クラス中に多くのメンバ関数を定義している時に特に有効です。 他のク ラスのフレンドになっているメンバ関数を除き、同一のクラスに属して いる全てのメンバ関 数のアクセス特権は、全て同一です。このような場合は キャッシュをフラッシュする必要は ありません。 -fno-default-inline クラススコープ中に定義されたメンバ関数をデフォルトでインライン関数とす る処理を行な いません (C++ のみ)。 -fno-defer-pop それぞれの関数呼び出しに対して、関数のリターン直後に常に引数をポップします。 関数呼 出後に引数をポップしなければならないマシンにおいては、 コンパイラは通常、いくつかの 関数の引数をスタックに積んで、 それらを同時にポップします。 -fforce-mem メモリオペランドに対して、それらに対する演算が行なわれる前に、 レジスタにコピーしま す。これは全てのメモリ参照を、潜在的な共通部分式であると 定めることによって、より良 いコードを生成します。もしそれが共通部分式でな かった場合は、命令コンビネーションに よってレジスタへの読み込みは削 除されます。私はこれがどのような違いを生み出すかとい うことに興味があります。 -fforce-addr メモリアドレス定数について、それらに対する演算が行なわれる前にレジスタ にコピーしま す。これは `-fforce-mem' と同じ手法でより良いコードを生成します。私はこれがどのよう な違いを 生み出すかということに興味があります。 -fomit-frame-pointer フレームポインタをレジスタに格納する必要のない関数において、この処理を 行いませ ん。これはフレームポインタの保存、設定、復帰にかかる命令を省略 し、さらに、多くの関 数でレジスタ変数として使用できる余分なレジスタを 得ることを可能にします。ただし、こ のオプションはほとんどのマシンにおいてデバッグを不可能にします。 Vax などのいくつかのマシンでは、このフラグは効果を持ちません。なぜならこ れらのマシ ンでは標準の呼び出し手順が自動的にフレームポインタの設定を 行なってしまい、これが存 在しないとしたところで何も節約ができないからです。 マシン記述マクロ FRAME_POINTER_REQUIRED が、ターゲットマシンがこのフラグをサポートするかどうかを制御 しています。 -finline-functions 全ての単純な関数を呼び出し側に組み込んでしまいます。コンパイラは ヒューリスティック スを用いて、 どの関数がこの方法で組み込むに足りるほど単純かを決定します。 もし、ある関数に対する全ての呼び出しを組み込むことができ、かつその関数が static と 宣言されていた場合は、GCC はその関数を独立したアセンブラコードと しては出力をしませ ん。 -fcaller-saves 関数呼び出しにおいて破壊されるであろう値を、レジスタに保持することを可 能としま す。これはこのような呼び出しの周囲にレジスタに対する保存、復帰の 特別なコードを出力 することによって実現されます。このような割り当ては、そ れが通常よりも良いコードを出 力するとみなされる場合にのみ行われます。 このオプションは特定のマシンではデフォルトで有効となっています。これらは 通常、この オプションの処理の代わりに使うことができる呼び出し時保存 レジスタが存在しないマシン です。 -fkeep-inline-functions ある関数への呼び出しが全て呼び出し側に組み込むことができて、かつその関数が static と宣言されていたとしても、実行時に呼び出し可能な関数も生成します。 -fno-function-cse 関数のアドレスをレジスタに置きません。つまり、定まった関数を呼び出すコードは、 それ ぞれ明示的な関数のアドレスを含むコードとなります。 このオプションは効率の低いコードを生成しますが、アセンブラ出力を書き換え るような ハックを行なう場合には、このオプションを使用しなければ 混乱させられることでしょう。 -fno-peephole マシン固有のピープホール最適化を禁止します。 -ffast-math このオプションは生成コードのスピードのために、GCC に対して、いくつかの ANSI または IEEE の規則/規格を侵させます。例えば、このオプションは sqrt 関数の引数は非負の数で あることを仮定します。 このオプションはどの `-O' オプションによっても有効とされません。なぜなら、このオプ ションは数 学関数に関する IEEE または ANSI の規則/規格の厳密な実装に依存して書かれ た プログラムに対して誤った出力を与えるからです。 以下のオプションは特殊な最適化に関する制御を行います。`-O2' オプションは`-funroll-loops' と `-funroll-all-loops' を除くこれらの全てのオプションを有効にします。 `-O' オプションは通常 `-fthread-jumps' と `-fdelayed-branch' を有効とします。ただし、特殊 なマシンではデフォルトの最適化に対して 変更が加えられているかもしれません。 最適化に関する “きめ細かいチューニング” が必要な場合に、以下の フラグを使用することが可能 です。 -fstrength-reduce ループのストレングスリダクションと繰り返し変数の除去を行います。 -fthread-jumps 分岐ジャンプによってある場所にジャンプした時に、最初の分岐に包括される 比較が存在し た時に、最初の分岐のジャンプ先を後者の分岐先に変更します。 この変更先は、2 番目の分 岐条件の真偽によって、2 番目の分岐のジャンプ先か、 あるいは2 番目の分岐の直後に定め られます。 -funroll-loops ループ展開の最適化を行います。これはループの繰り返し数がコンパイル時、 あるいはラン タイムに決定できる時においてのみ、実行されます。 -funroll-all-loops ループ展開の最適化を行います。これは全てのループに対して行われます。この オプション は大抵、より遅く動作するプログラムを生成します。 -fcse-follow-jumps 共通部分式削除の処理において、ジャンプ命令の行先が 他の経路から到達できない場合 は、そのジャンプ命令を越えてスキャンを行 ないます。例えば、共通部分式削除処理中に else 節を伴った if 文に出会った場合、条件が偽ならば分岐先に対しても共通部分式削除 を続けます。 -fcse-skip-blocks これは `-fcse-follow-jumps' に似ていますが、ブロックを跨ぐジャンプに対しても共通部 分式削除を継 続します。共通部分式削除処理中に、else 節を持たない単純な if 文にで あった時、 `-fcse-skip-blocks' は if のボディを跨いだジャンプに対する共通部分式削除 処理を継続します。 -frerun-cse-after-loop ループ最適化が行なわれた後に、再度共通部分式削除の処理を行います。 -felide-constructors コンストラクタへの呼び出しが省略できるように思われる場合に、その呼び出 しを省略しま す (C++ のみ)。このフラグを指 定した場合は、GNU C++ は以下のコードに対して、一時オ ブジェクトを経由せずに y を foo への呼び出しの結果から直接初期化します。 A foo (); A y = foo (); このオプションを使用しない場合は、GNU C++ は最初に y をA 型の適切なコンストラクタを 呼び出すことによって初期化します。そして、 foo の結果を一時オブジェクトに格納し、最 終的には `y' の値を一時オブジェクトの値に入れ換えます。 デフォルトの振舞い (`-fno-elide-constructors') が、ANSI C++ 標準のドラフトには規定 されています。コンストラクタ が副作用を含むプログラムに対して、`-felide- constructors' を指定すると、そのプログラムは異なった動作をする可能性があります。な ぜなら、いくつかのコンストラクタの呼び出しが省略されるからです。 -fexpensive-optimizations 比較的コストの高いいくつかの些細な最適化を行います。 -fdelayed-branch ターゲットマシンにおいてこのフラグがサポートされている場合は、遅延分岐 命令後の命令 スロットを命令の順番変更によって利用するように設定します。 -fschedule-insns ターゲットマシンにおいてこのフラグがサポートされている場合は、必要な データを利用可 能になるまで待つことによる実行の遅滞を防ぐために、命令 の順番の変更を行います。これ は遅い浮動小数点命令やメモリ読み込み命令の実 行において、それらの結果を必要とする命 令の前に他の命令を詰め込みます。 -fschedule-insns2 `-fschedule-insns' と似ていますが、レジスタ割当て処理の後にもう一度命令スケジューリ ングの 段階を置きます。これは、比較的レジスタ数が少なく、メモリロード命令 が 1 サイ クルよりも多くを要するマシンにおいて、特に効果的です。
ターゲットオプション
デフォルトでは、GNU CC コンパイラは、現在使用しているマシンと同じタイプの コードをコンパイ ルします。しかし、GNU CC はクロスコンパイラ としてもインストールすることが可能です。実際に は、異なったターゲット マシンのための様々なコンフィギュレーションの GNU CC は、同時にいく つ もインストールすることが可能です。そこで、どの GNU CC を使用するかを 指定するため に、`-b' オプションを使用することができます。 これに加えて、古い、あるいはより新しいバージョンの GNU CC も同時にいく つもインストールし ていくことができます。これらのうち 1 つ (おそらくもっ とも新しいもの) がデフォルトとなりま す。しかし、ひょっとしたら別のものを使 いたくなるかもしれません。 -b machine 引数 machine は、コンパイルのターゲットマシンを規定します。これは GNU CC をクロス コンパイラとしてインストールした時に有用です。 machine に指定する値は、GNU CC をクロスコンパイラとしてコンフィギュレーション した 時に与えたマシンタイプと同じです。例えば、80386 上の System V で実行されるプログラ ムのために `configure i386v' というコンフィギュレーションを行なったクロスコンパイラ を起動した い場合は、`-b i386v' と指定します。 `-b' の設定を省略した場合は、通常は使用しているマシンと同タイプのマシン のためのコ ンパイルが行われます。 -V version 引数 version は、起動される GNU CC のバージョンを規定します。これは複数のバージョン が インストールされている場合に有用です。例えば、 version が `2.0' ならば、GNU CC バージョン 2.0 を起動することを意味します。 `-V' を指定しなかった場合のデフォルトのバージョンは、GNU CC をインストール する時に 調整可能です。通常は、もっとも一般的な使用に勧めることができる バージョンがここに指 定されます。
マシン依存オプション
それぞれのターゲットマシンタイプは、それぞれの特別なオプションを持つ ことが可能です。`-m' で始まるオプション群は、様々なハードウェアモデルや コンフィギュレーション—例えば 68010 と 68020、 浮動小数点コプロセッサの有無— などを選択できます。このオプションを指定することに よって、コンパイラは どれか 1 つのモデル、 あるいはコンフィギュレーションに対するコンパイ ルが可能です。 いくつかのコンフィギュレーションは、通常はそのプラットフォーム上の 他のコンパイラとのコマ ンドラインに関するの互換性をとるため の特別なオプションを用意しています。 以下は 68000 シリーズのために定義された `-m' オプションです。 -m68000 -mc68000 68000 のためのコードを生成します。これは 68000 ベースのシステムに対して コンフィ ギュレーションを行なったコンパイラのデフォルトです。 -m68020 -mc68020 (68000 ではなく) 68020 のためのコードを生成します。これは 68020 ベースの システムに 対してコンフィギュレーションを行なったコンパイラのデフォルト です。 -m68881 浮動小数点演算のために 68881 命令を含んだ出力を行います。これはほとんどの 68020 ベースのシステムにおいて、コンパイラのコンフィギュレーション時に -nfp を指定されな かった場合のデフォルトです。 -m68030 68030 のためのコードを生成します。これは 68030 ベースのシステムに対して コンフィ ギュレーションを行なったコンパイラのデフォルトです。 -m68040 68040 のためのコードを生成します。これは 68040 ベースのシステムに対して コンフィ ギュレーションを行なったコンパイラのデフォルトです。 -m68020-40 68040 のためのコードを生成しますが、新しい命令を使用しません。この結果とし て得られ るコードは、68020/68881, 68030, 68040 のいずれのシステムにおいても、 比較的高い性能 を持ちます。 -mfpa 浮動小数点演算のために Sun FPA 命令を含んだ出力を行います。 -msoft-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラ リは GNU CC の一部としては含まれません。通常はそのマシン の一般的な C コンパイラの 提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用すること はできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を 用意する必要があります。 -mshort int 型を short int 型のように 16 ビット幅とみなします。 -mnobitfield ビットフィールド命令を使用しません。`-m68000' は暗黙のうちに `-mnobitfield' を含み ます。 -mbitfield ビットフィールド命令を使用します。`-m68020' は暗黙のうちに `-mbitfield' を含みま す。これは変更されていないソースの場合のデフォルトです。 -mrtd 固定個数の引数をとる関数に対して、異なった関数呼び出し規約を使用します。 これは、リ ターン時に引数をポップする rtd 命令を利用するものです。これは呼び出し側で引数をポッ プさせる必要がな いために、1 命令を省略することが可能となります。 この呼び出し規約は通常の Unix で使用されている方式とは互換性がありません。そ のた め、Unix コンパイラでコンパイルされたライブラリを呼び出す必要があ る限りは、使用す ることはできません。 さらに、全ての可変引数をとり得る関数 ( printfを含みます) に対して、関数プロトタイプ を用意する必要があります。さもないと、 これらの関数に対して誤ったコードが生成されま す。 さらに、関数に対して多過ぎる引数をつけて呼び出すコードを書いた場合、こ れは深刻な 誤ったコードを生成します。(通常は多過ぎる変数は害を及ぼすこと なく無視されます。) rtd 命令は 68010 と 68020 によってサポートされますが、 68000 では使用でき ません。 以下は Vax のために定義された `-m' オプションです。 -munix 特定のいくつかのジャンプ命令 (aobleq 等) を出力しません。これらの命令で長いレンジを 使用した場合、 Vax 用の Unix アセンブラはこれを処理できません。 -mgnu これらのジャンプ命令を出力します。アセンブルには GNU アセンブラの使用 を仮定しま す。 -mg 浮動小数点数について、d-フォーマットではなく、g-フォーマットのための コードを出力し ます。 以下は SPARC でサポートされている `-m' スイッチです。 -mfpu -mhard-float 浮動小数点命令を含む出力を行います。これはデフォルトです。 -mno-fpu -msoft-float 浮動小数点の処理のためにライブラリを呼び出す出力を行います。 警告: SPARC 用の GNU 浮動小数点ライブラリは存在しません。 通常はそのマシンの一般的な C コンパイラの提供 するものを使用しますが、 これは通常の方法ではクロスコンパイルで直接使用することはで きません。 クロスコンパイルを行ないたい場合は、 自分自身で必要なライブラリ関数を用 意する必要があります。 -msoft-float は呼び出し規約を変更します。したがって、 全て のプログラムをこのオプ ションでコンパイルしない限り、 このオプションは意味をなしません。 -mno-epilogue -mepilogue -mepilogue を指定することによって (デフォルト)、コンパイラは関数を抜けるため のコー ドを常に関数の最後に出力します。関数の途中で関数を抜けるコードは全て、 関数の最後の 終了コードへのジャンプとして生成されます。 -mno-epilogue を設定することによって、コンパイラは関数から抜けるコードをインライン 化 することを試みます。 -mno-v8 -mv8 -msparclite これらの 3 つのオプションは SPARC アーキテクチャのバリエーションを選択 するために使 用されます。 デフォルトでは、(Fujitsu SPARClite 用にコンフィギュレーションしない限 りは) GCC は SPARC アーキテクチャ v7 用のコードを生成します。 -mv8 は、SPARC v8 用コードを生成します。v7 コードとの違いは、整数の乗算と整数 の除 算が v7 では存在しないが v8 には存在するという点のみです。 -msparclite は、SPARClite 用のコードを生成します。これは v7 には存在せず SPARClite に存在する、整数乗算、整数除算とスキャン (ffs) 命令を追加します。 -mcypress -msupersparc これら 2 つのオプションはコード最適化対象のプロセッサを選択するための ものです。 -mcypress を用いると(これがデフォルト)、 コンパイラは Cypress CY7C602 チップ用に コードを最適化します。 このチップは SparcStation/SparcServer 3xx シリーズに用いられ ています。 このオプションは古い SparcStation 1, 2, IPX などにも適用できます。 -msupersparc を用いると、コンパイラは SuperSparc CPU 用にコードを最適化します。 こ のチップは SparcStation 10, 1000, 2000 シリーズに用いられています。 このオプション を用いると、SPARC v8 の全命令セットを用いるようになります。 以下は Convex のために定義された `-m' オプションです。 -mc1 C1 用の出力を行います。これはコンパイラが C1 用にコンフィギュレーション を行なわれ た時のデフォルトです。 -mc2 C2 用の出力を行います。これはコンパイラが C2 用にコンフィギュレーション を行なわれ た時のデフォルトです。 -margcount 引数列の前に、引数の数をワードに置くコードを生成します。いくつかの可搬性 のない Convex や Vax のプログラムはこのワードを必要とします。(デバッガは 不定長引数リスト を持つ関数を除いて、このワードを必要としません。これらの 情報はシンボルテーブルに書 かれます。) -mnoargcount 引数の数を示すワードを省略します。これは変更されていないソースを使用した 場合のデ フォルトです。 以下は、AMD Am29000 のために定義された `-m' オプションです。 -mdw DW ビットが立っていることを仮定したコードを出力します。これは、ハードウェア によっ てバイト操作やハーフワード操作がサポートされているということを 意味します。これはデ フォルトです。 -mnodw DW ビットが立っていないことを仮定したコードを出力します。 -mbw システムがバイト操作やハーフワード書き込み操作をサポートしていることを仮定した コー ドを生成します。これはデフォルトです。 -mnbw システムがバイト操作やハーフワード書き込み操作をサポートしていないことを仮定し た コードを生成します。これは暗黙のうちに `-mnodw' を含みます。 -msmall スモールメモリモデルを使用します。これは全ての関数のアドレスが単一の 256KB のセグメ ント内に入ることと、関数の絶対アドレスが 256K 以下にある ことを仮定します。このオプ ションは call 命令を const, consth, calli シーケンスの代わりに使用することを可能に します。 -mlarge call 命令が使用できることを仮定しません。これはデフォルトです。 -m29050 Am29050 用のコードを生成します。 -m29000 Am29000 用のコードを生成します。これはデフォルトです。 -mkernel-registers gr96-gr127 レジスタへの参照の代わりに gr64-gr95 を参照するコードを生成します。この オプションは、ユーザのコードか ら使用できるグローバルレジスタから区別されたグローバ ルレジスタの集合 を利用するカーネルのコードをコンパイルする時に使用できます。 ただし、このオプションが使用されている時にも `-f' フラグ中のレジスタ名は通常のユー ザモードでの名前を使用します。 -muser-registers 通常のグローバルレジスタの集合 gr96-gr127 を使用します。これはデフォルトです。 -mstack-check __msp_check への呼び出しをそれぞれのスタック調整の後に挿入します。これはしばしば カーネルのコードにおいて用いられます。 以下は、Motorola 88K アーキテクチャのために定義された `-m' オプションです。 -m88000 m88100 と m88110 の双方で比較的高性能で動作するコードを生成します。 -m88100 m88100 に最適なコードを生成します。ただし m88110 においても動作します。 -m88110 m88110 に最適なコードを生成します。 ただし m88100 においては動作しないかも知れませ ん -midentify-revision アセンブラ出力中に、ソースファイル名、コンパイラ名とバージョン、 タイムスタンプ、使 用されたコンパイルフラグを記した ident ディレクティブを挿入します。 -mno-underscores シンボル名の最初にアンダースコアキャラクタをつけないアセンブラ出力を生 成します。デ フォルトでは個々の名前に対して、アンダースコアをプレフィック スとして使用します。 -mno-check-zero-division -mcheck-zero-division 初期の 88K のモデルはゼロによる除算の処理に問題を持っていました。特に、そ れらの多 くにおいてトラップが生じなかったことは問題でした。これ らのオプションを使用すること によって、ゼロ除算を発見し、例外を知らせる コードを埋め込むことを禁止 (あるいは明示 的に許可) することができます。全 ての 88K 用の GCC のコンフィギュレーションは `-mcheck-zero-division' をデフォルトとして使用しています。 -mocs-debug-info -mno-ocs-debug-info 88Open Object Compatibility Standard “OCS” で定義された (それぞれのスタックフレーム 中で使用されるレジスタに関する) 付加的なデバッグ 情報を取り込みます (または省略しま す)。これらの付加的な情報は GDB によっ ては必要とされません。DG/UX, SVr4, Delta 88 SVr3.2 ではデフォルトでこの情 報を含めます。その他の 88K コンフィギュレーションでは デフォルトで省略します。 -mocs-frame-position -mno-ocs-frame-position OCS で規定されているように、レジスタの値に対して、スタックフレーム中の 特定の場所に 保存されるという動作を強制します (あるいは要求しません)。 DG/UX, Delta88 SVr3.2, BCS のコンフィギュレーションでは `-mocs-frame-position' をデフォルトとして、それ以 外の 88k コンフィギュレーションでは `-mno-ocs-frame-position' をデフォルトとして使 用しています。 -moptimize-arg-area -mno-optimize-arg-area 関数の引数がどのような方法でスタックフレームに格納されるかを指定します。 `-moptimize-arg-area' はスペースを節約しますが、いくつかのデバッガ (GDB は含まれな い) を クラッシュさせます。`-mno-optimize-arg-area' はより標準に従っています。デ フォルトでは GCC は引数エリアの最適化 を行いません。 -mshort-data-num データ参照時に、それらの処理を r0 からの相対参照で行なうことによって小さなコードに することを可能とします。 これは値のロードを (その他の場合は 2 命令かかるところを) 1 命令で行な うことを可能にします。num をこのオプションとともに指定することによっ て、どのデータ参照が影響 を受けるかを指定することができます。例えば `-mshort-data-512' を指定すると、512 バイト以内のディスプレースメントのデータ参照が 影響を受けることになります。 `-mshort-data-num' は num が 64K よりも大きな時は効果 を持ちません。 -mserialize-volatile -mno-serialize-volatile volatile なメモリへの参照について、シーケンシャルな整合性を持った コードを生成す る、あるいは生成しません。 GNU CC はデフォルトではどのプロセッササブモデルを選んだ場合においても、 整合性を常 に保証します。これがどのように実現されているかは、サブモデルに 依存しています。 m88100 プロセッサはメモリ参照の順番を入れ換えないので、常にシーケンシャルな 整合性 は保たれます。もし `-m88100' を使用した場合は、GNU CC はシーケンシャルな整合性を保 つための特 別な命令を生成しません。 m88110 プロセッサにおけるメモリ参照の順番は、必ずしもそれらの要求を行 なった命令の 順番とは一致しません。特に、読み込み命令は、先行する書き込み 命令よりも先に実行され 得ます。このような順番の入れ換えは、マルチプロセッサ時に volatile なメモリの参照に おけるシーケンシャルな整合性を崩してしまいます。 `-m88000' または `-m88110' を指定 した場合には、GNU CC は、必要な場合は特別な命令を生成し、 命令の実行が正しい順番で 行なわれることを強制します。 ここで生成される整合性を保証するための特別な命令はアプリケーションの性 能に対して影 響を及ぼします。もしこの保証無しで問題がないということがわかっ ている場合は、`-mno- serialize-volatile' を使用することができます。 `-m88100' オプションを使用しているが、m88110 における実行時にシーケンシャルな 整合 性が必要とされる場合は、`-mserialize-volatile' を使用するべきです。 -msvr4 -msvr3 System V release 4 (SVr4) に関連したコンパイラの拡張を有効 (`-msvr4') あるいは無効 (`-msvr3') にします。これは以下の内容を制御します。 • 生成するアセンブラの文法の種類 (これは `-mversion-03.00' を使用することによって独立 に制御できます)。 • `-msvr4' は C プリプロセッサに対して `#pragma weak' を理解させます。 • `-msvr4' は、GCC に SVr4 によって使用されている付加的な宣言ディレクティブ を生成さ せます。 `-msvr3' は、SVr4 を除く全ての m88K コンフィギュレーションにおけるデフォ ルトです。 -mtrap-large-shift -mhandle-large-shift 31 ビットより大きいビットシフトを検出するコードを埋め込みます。これらの オプション を指定することによって、それぞれトラップ、あるいは適切に処理す るコードが埋め込まれ ます。デフォルトでは GCC は大きなビットシフトには 特別な対策を行いません。 -muse-div-instruction 非常に初期の 88K アーキテクチャのモデルは除算命令を持っていません。従っ て、GCC は デフォルトでは除算命令を生成しません。このオプションは除算命令 が安全に使用できると いうことを指定します。 -mversion-03.00 DG/UX コンフィギュレーションには、2 つの SVr4 の種類があります。このオプション は -msvr4 オプションによって hybrid-COFF と real-ELF のどちらが使用されるかを選択しま す。 他のコンフィギュレーションはこのオプションを無視します。 -mwarn-passed-structs 関数に対して構造体を渡した場合と、関数が構造体を返した場合に警告します。 構造体を渡 す規約は C 言語の発展の中で変化しており、移植性の問題をしば しば生じることになりま す。デフォルトでは GCC はこの警告を行いません。 以下のオプションは IBM RS6000 のために定義されたものです。 -mfp-in-toc -mno-fp-in-toc 浮動小数点定数を Table of Contents (TOC) に入れるかどうかを指定します。 このテーブ ルは全てのグローバル変数と関数のアドレスを格納します。デフォルト では GCC は浮動小 数点定数をここに格納します。もし TOC が算術あふれをおこす 場合は、`-mno-fp-in-toc' を使用することによって TOC のサイズを小さくすることが可能であり、 算術あふれを防ぐ ことができるでしょう。 以下は IBM RT PC 用に定義された `-m' オプションです。 -min-line-mul 整数の乗算に対してインラインのコード列を生成します。これはデフォルトです。 -mcall-lib-mul 整数の乗算に対して lmul$$ を呼び出します。 -mfull-fp-blocks フルサイズの浮動小数点データブロックを生成します。これは IBM によって推 奨されてい る最低限のスクラッチスペースの量を包含します。これはデフォルトです。 -mminimum-fp-blocks 浮動小数点データブロック内に特別なスクラッチスペースを含めません。これに よって、よ り小さなコードが生成されますが、実行は遅くなります。 なぜならスクラッチスペースが動 的に確保されるからです。 -mfp-arg-in-fpregs IBM の関数呼び出し規約とは互換性のない呼び出し手順を使用します。 この規約では浮動小 数点引数を浮動小数点レジスタに入れて渡します。 このオプションを指定する と、varargs.h や stdarg.h で浮動小数点オペランドが使用できなくなることに注意して下 さい。 -mfp-arg-in-gregs 浮動小数点に対して通常の関数呼び出し規約を使用します。これはデフォルトです。 -mhc-struct-return 1 ワードより大きな構造体を返す時に、レジスタではなくメモリを使用して返します。 これ は MetaWare HighC (hc) コンパイラとの互換性を提供します。`-fpcc-struct-return' を使 用することによって Portable C Compiler (pcc) との互換性を得 ることができます。 -mnohc-struct-return 1 ワードより大きな構造体を返す時に、レジスタによって返される場合があります。 これは その方が便利であると考えられる時に使用されます。これはデフォルトです。 IBM が提供す るコンパイラとの互換性を得るためには、`-fpcc-struct-return' と `-mhc-struct-return' の双方を使用します。 以下は MIPS ファミリのために定義された `-m' オプションです。 -mcpu=cpu-type 命令スケジューリング時に、デフォルトのマシンタイプを cpu-type に仮定します。デフォ ルトの cpu-type は default です。この選択はすべてのマシンに対する最長のサイクル数を 元にコードを 生成します。これは、生成されるコードがどの MIPS cpu においても適当な速 度 で処理されるようにするためです。これ以外の cpu-type の選択としては、 r2000, r3000, r4000, r6000 があります。特定の cpu-type を選択した場合は、その特定のチップ に適したスケジュールが行われます。 コンパイラは、 -mips2 または -mips3 スイッチが使 用されていない場合は、MIPS ISA (instruction set architecture) のレベル 1 に合致しな いコードを生成することはありません。 -mips2 MIPS ISA のレベル 2 (branch likely 命令, 平方根命令) による命令群 を出力します。 -mcpu=r4000 と -mcpu=r6000 スイッチは、 -mips2 と共に使用される必要があります。 -mips3 MIPS ISA のレベル 3 (64 ビット命令) を含む命令群を出力します。 -mcpu=r4000 スイッチ は、 -mips2 と同時に使用する必要があります。 -mint64 -mlong64 -mlonglong128 これらのオプションは現在動作しません。 -mmips-as MIPS アセンブラのためのコードを生成し、 mips-tfile を起動して通常のデバッグ情報を追 加します。 これは OSF/1 リファレンスプラットフォーム 以外の全てのプラットフォームに おけるデフォルトです。 OSF/1 リファレンスプラットフォームは OSF/rose オブジェクト フォーマットを 使用します。スイッチ -ggdb, -gstabs, -gstabs+ のうちのどれかが使用さ れている場合は、 mips-tfile プログラムは、stabs を MIPS ECOFF 中にカプセル化しま す。 -mgas GNU アセンブラ用のコードを生成します。これは OSF/1 リファレンスプラットフォーム に おけるデフォルトです。OSF/1 リファレンスプラットフォームは OSF/rose オブジェクト フォーマットを使用します。 -mrnames -mno-rnames -mrnames スイッチは出力コードにおいて、レジスタの名前として、ハードウェア名の代 わ りに MIPS ソフトウェア名を使用することを指定します。(つまり、 a0 を $4 の代わりに使 用します)。 GNU アセンブラは -mrnames スイッチをサポートしません。MIPS アセンブラは ソースファイルに対して MIPS C プリプロセッサを起動するでしょう。 -mno-rnames スイッ チがデフォルトです。 -mgpopt -mno-gpopt -mgpopt スイッチは、全てのデータ宣言をテキストセクション中の全命令の前に書き出 すこ とを指定します。これによって、全ての MIPS アセンブラは、 ショートグローバル、あるい は静的なデータアイテムに対して、2 ワードではなく、1 ワードのメモリ参照命令を生成し ます。 これは最適化が指定された場合のデフォルトです。 -mstats -mno-stats -mstats が指定された場合は、コンパイラによってインラインでない関数が処理される ごと に、標準エラー出力ファイルに対して、そのプログラムに対する統計情報 を示す 1 行の メッセージを出力します。このメッセージは、保存したレジスタ の数、スタックのサイズな どを示します。 -mmemcpy -mno-memcpy -mmemcpy スイッチは、全てのブロック転送に対して、インラインコードを生成する代わ り に、適切なストリング関数 (memcpy または bcopy) を呼び出すコードを生成します。 -mmips-tfile -mno-mips-tfile -mno-mips-tfile スイッチを指定すると、 MIPS アセンブラがデバッグサポートのために生 成したオブジェクトファイルに対し、 mips-tfile を使用した後処理を行いません。 mips-tfile が実行されないと、デバッガからはローカル変数を扱うことができません。 さ らに、 stage2 と stage3 のオブジェクトはアセンブラに渡される一時的なファイル名をオ ブジェクトファイル 中に埋め込まれて持っており、このためそれらを比較した場合に同一の も のとはみなされません。 -msoft-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラ リは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの 提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用すること はできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を 用意する必要があります。 -mhard-float 浮動小数点命令を含んだ出力を生成します。これは変更されないソースを使用し た場合のデ フォルトです。 -mfp64 ステータスワード中の FR ビットが立っていることを仮定します。これは 32 個の 32 ビッ ト浮動小数点 レジスタの代わりに、32 個の 64 ビットの浮動小数点レジスタが存在すると い うことを示します。この場合は、同時に -mcpu=r4000 と -mips3 スイッチを指定する必 要があります。 -mfp32 32 個の 32 ビット浮動小数点レジスタが存在するということを仮定します。こ れはデフォ ルトです。 -mabicalls -mno-abicalls いくつかの System V.4 の移植が位置独立コードのために使用する疑似命令 .abicalls, .cpload, .cprestore を出力する、あるいは出力しません。 -mhalf-pic -mno-half-pic -mhalf-pic スイッチは、テキストセクション中に参照を配置する代わりに、外部参照を行 なうポインタをデータセクションに配置し、それをロードする動作を指定します。 このオプ ションは現在まだ動作しません。 -Gnum は num バイト以下のグローバル、あるいは静的な アイテムを、通常のデータや bss セクションではなく、小さなデータ、または bss セク ションに配置することを 指定します。 これによりアセンブラは、通常では 2 ワードの参照 を行うところを、 グローバルポインタ (gp または $28) を基準とした 1 ワードのメモリ参 照命令を生成可能となります。 デフォルトでは MIPS アセンブラが使用される場合、 num は 8 です。また、GNU アセンブラが使用される場合のデフォルトは 0 です。 -Gnum スイッ チはアセンブラ、リンカにも同様に渡されます。全てのモジュールは同一の -Gnum の値でコ ンパイルされなければなりません。 -nocpp MIPS アセンブラに、ユーザアセンブラファイル (`.s' 拡張子を持ちます) に対するアセン ブル時のプリプロセッサの起動を抑制さ せます。 以下は、Intel 80386 ファミリ用に定義された `-m' オプションです。 -m486 -mno-486 386 ではなく 486 に最適化されたコードを出力する、あるいはその逆を行な う指定を行い ます。486 用に生成されたコードは 386 で実行可能であり、逆も また可能です。 -mpentium -mcpu=pentium と同義です。 -mpentiumpro -mcpu=pentiumpro と同義です。 -mcpu=cpu type 命令をスケジューリングする際のマシンタイプのデフォルトを設定します。 CPU TYPE の選 択肢は i386, i486, i586 (pentium), pentium, i686 (pentiumpro), および pentiumpro で す。 ある CPU TYPE を選ぶと、その特定チップに適するようにスケジューリングを 行いま すが、 -march=cpu type オプションを指定しない限り、コンパイラは i386 で実行できない ような コードは生成しません。 -march=cpu type マシンタイプ CPU TYPE 用に命令を生成します。 CPU TYPE の選択肢は i386, i486, pentium, および pentiumpro です。 -march=cpu type を指定すると -mcpu=cpu type も指 定されたものとみなします。 -msoft-float 浮動小数点演算のためにライブラリを呼び出す出力を行います。 警告: この必須のライブラ リは GNU CC の一部としては含まれません。通常はそのマシンの 一般的な C コンパイラの 提供するものを使用しますが、これは通常の方法 ではクロスコンパイルで直接使用すること はできません。クロスコンパイルを行 ないたい場合は、自分自身で必要なライブラリ関数を 用意する必要があります。 関数が浮動小数点数を返す時に 80387 レジスタスタックを使用するマシンに おいて は、`-msoft-float' を使用した場合でも、いくつかの浮動小数点命令が生成されます。 -mno-fp-ret-in-387 関数からの返り値に FPU のレジスタを使用しません。 通常の関数呼び出し規約は、たとえ FPU が存在しなくても float と double の結果を FPU レジスタに入れて返します。したがってこの場合、 オペレーティングシステムは FPU をエ ミュレートしなければなりません。 `-mno-fp-ret-in-387' オプションを指定すると、浮動小数点数も通常の CPU レジスタに入 れ て返されます。 -mprofiler-epilogue -mno-profiler-epilogue 関数から抜けるコードにてプロファイル情報を書き出す追加コードを生成します。 以下は HPPA ファミリ用に定義された `-m' オプションです。 -mpa-risc-1-0 PA 1.0 プロセッサ用のコードを出力します。 -mpa-risc-1-1 PA 1.1 プロセッサ用のコードを出力します。 -mkernel カーネルに適したコードを生成します。特に、引数の 1 つとして DP レジスタを とる add 命令の使用を抑制し、その代わりに、addil 命令を生成します。これは HP-UX リンカの深刻 なバグを避けるための措置です。 -mshared-libs HP-UX 共有ライブラリとリンクさせるコードを生成します。このオプションはま だ完全に動 作しているわけではなく、どの PA ターゲットにおいてもデフォルト になっていません。こ のオプションを指定すると、コンパイラは誤ったコード を出力し得ます。 -mno-shared-libs 共有ライブラリとリンクしないコードを生成します。これは全ての PA ターゲット において デフォルトのオプションです。 -mlong-calls 関数の呼び出し先と呼び出し元が同一ファイルに含まれた場合、呼び出し時の 距離が 256K を越える場合でも動作するようなコードを出力します。 このオプションは、リンカから “branch out of range errors” で リンクを拒否された時以外には使用しないようにしてく ださい。 -mdisable-fpregs いかなる形においても、浮動小数点レジスタの使用を禁止します。 これは浮動小数点レジス タに配慮しないコンテキストスイッチを行なう カーネルに対して有効です。 このオプショ ンを使用して、浮動小数点処理を行なおうとすると、 コンパイラはアボートします。 -mdisable-indexing コンパイラに対して、indexing addressing mode を使用しないように指定します。 これに よって MACH において MIG によって生成されたコードをコンパイルす る際の、あまり重要 でないいくつかの問題を防ぐことができます。 -mtrailing-colon ラベル定義の後にコロンを加えます (ELF アセンブラ用)。 以下は、Intel 80960 ファミリ用に定義された `-m' オプションです。 -mcpu-type デフォルトのマシンタイプを cpu-type に仮定します。これは生成する命令とアドレッシン グモード、そして境界条件に 関係します。 デフォルトの cpu-type は kb です。その他の 選択としては ka, mc, ca, cf, sa, sb があります。 -mnumerics -msoft-float -mnumerics オプションはプロセッサが浮動小数点命令をサポートすることを示します。 -msoft-float オプションは浮動小数点サポートを仮定しないことを示します。 -mleaf-procedures -mno-leaf-procedures 葉に位置する手続きについて、 call 命令と同様に bal 命令でも呼び出すことを可能としま す (あるいは、しません)。これは bal 命令がアセンブラ、またはリンカによって置き換え られ得る場合には、直接呼 び出しに対して効率の良いコードを得ることができます。ただ し、それ以外の場 合は効率の良くないコードを生成します。例えば、関数へのポインタ経由 の呼び 出しや、この最適化をサポートしないリンカを使用した場合などがこれ に該当しま す。 -mtail-call -mno-tail-call (マシン非依存の部分を越えて) 末尾再帰を分岐に変換する処理に関するさ らなる最適化を 行います(または行いません)。 この手法の適用が正当でないということに関する判断 が完 全ではないので、まだこのオプションを使用することは適当でないかも しれません。デフォ ルトは -mno-tail-call です。 -mcomplex-addr -mno-complex-addr この i960 の実装では複雑なアドレッシングモードの使用が優位であると仮定 します (ある いは仮定しません)。複雑なアドレッシングモードは K-シリーズでは 使用する価値は無いか も知れませんが、 C-シリーズでは確かに使用する価値があります。 現在は -mcomplex-addr が、CB と CC を除く全てのプロセッサにおけるデフォルトです。 -mcode-align -mno-code-align より高速なフェッチのためにコードを 8 バイトにアラインします (または何も しませ ん)。現在では C シリーズの実装においてのみデフォルトで有効にしています。 -mic-compat -mic2.0-compat -mic3.0-compat iC960 v2.0 または v3.0 との互換性を持たせます。 -masm-compat -mintel-asm iC960 アセンブラとの互換性を持たせます。 -mstrict-align -mno-strict-align アラインされないアクセスを許可しません (あるいは許可します)。 -mold-align Intel による gcc リリースバージョン 1.3 (gcc 1.37 ベース) との構造体の 境界条件に関 する互換性を持たせます。現在は、 #pragma align 1 が同時に仮定されてしまい、無効化で きないというバグを持っています。 以下は、DEC Alpha 用に定義された `-m' オプションです。 -mno-soft-float -msoft-float 浮動小数点操作に対して、ハードウェアによる浮動小数点命令を使用します (し ませ ん)。もし、-msoft-float が指定された場合は、`libgcc1.c' 内の関数が浮動小数点演算に 使用されます。ただし、これらのルーチンが 浮動小数点演算をエミュレートするルーチンに よって置き換えられているか、 そのようなエミュレーションルーチンを呼び出すようにコン パイルされている のでない限り、これらのルーチンは浮動小数点演算を行なってしまいま す。浮動小 数点演算のない Alpha のためのコンパイルを行なうためには、ライブラリも こ れらを呼び出さないようにコンパイルされていなければなりません。 浮動小数点演算のない Alpha の実装は、浮動小数点レジスタを必要とすると いうことに注 意して下さい。 -mfp-reg -mno-fp-regs 浮動小数点レジスタセットを使用する (使用しない)コードを生成します。 -mno-fp-regs は 暗黙のうちに -msoft-float を含みます。浮動小数点レジスタセットが使用されない場合 は、浮動小数点 オペランドは整数レジスタに入れられて渡され、浮動小数点数の結果は $f0 では なく $0 に入れて返されます。これは非標準の関数呼び出し手順であり、 浮動小数点 数の引数や返り値を持つ関数で、-mno-fp-regs をつけてコンパイルされたコードから呼び出 される関数はすべてこのオプションを つけてコンパイルされている必要があります。 このオプションの典型的な用法は、浮動小数点レジスタを使用せず、したがっ て浮動小数点 レジスタへのセーブもリストアも必要のないカーネルを構築する 時などがあるでしょう。 ここに追加するオプションは System V Release 4 において、これらのシステム上の 他のコンパイ ラとの互換性のために提供されるものです。 -G SVr4 システムにおいて、gcc は `-G' オプションを受け付けます (そして これをシステム リンカに渡します)。これは他のコンパイラとの互換性のためです。 しかし、リンカオプ ションを gcc のコマンドラインから渡すよりも、我々は `-symbolic' または `-shared' の 使用が適当であると考えています。 -Qy コンパイラが使用したそれぞれのツールのバージョンを .ident アセンブラディレクティブ を使用して、出力で明示します。 -Qn .ident ディレクティブを出力に加えることを抑制します (これは デフォルトです)。 -YP,dirs `-l' で指定されたライブラリに対して、 dirsで規定されたディレクトリのみを検索し、他 は検索しません。 dirs 中は、1 つのコロンで区切ることにより、 複数のディレクトリエン トリを記述します。 -Ym,dir M4 プリプロセッサを dir に検索します。アセンブラがこのオプションを使用します。
コード生成オプション
これらのマシン独立オプションは、 コード生成にて使用されるインタフェース規約を制御します。 これらのほとんどは `-f' で始まります。これらのオプションは有効形式と無効形式の 2 つの形式 を持っ ています。`-ffoo' の無効形式は `-fno-foo' です。以下に挙げる表においては、このう ち、デフォルトではない片 方のみが挙げられています。`no-' を追加するか、削除するかによって 双方の形式を得ることができます。 -fnonnull-objects 参照型によって参照されるオブジェクトはヌルでないと仮定します (C++ のみ)。 通常は GNU C++ は参照型によって参照されるオブジェクトに関しては保守的 な仮定を行い ます。例えば、コンパイラは a が以下のコードにおいてヌルでないことをチェックする必要 があります。 obj &a = g (); a.f (2); この種の参照がヌルでないことのチェックは、特別なコードを必要とします。 しかし、これ は多くのプログラムにとって無用なものです。 このヌルに対するチェックを必要のない場合 `-fnonnull-objects' を使用することにより、省略することができます。 -fpcc-struct-return struct と union の値を返す場合に、普通の C コンパイラが行なうのと同じ規約を使用しま す。 この規約は小規模な構造体に対して非効率なものとなり、また多くのマシンでその 関 数を再入不可能としてしまいます。しかしこれは、GCC でコンパイルされたコード と PCC でコンパイルされたコードを相互に呼び出すことを可能とするとい う利点を持ちます。 -freg-struct-return struct と union の値を返す場合に、可能な場合はレジスタを使用する規約を使用しま す。これは -fpcc-struct-return を使用した場合と比較して、小さな構造体を返す場合に高 い性能を発揮します。 -fpcc-struct-return と -freg-struct-return のどちらも使用しなかった場合には、GNU CC は各ターゲットに対して標準で あると考えられる規約をデフォルトとして使用します。 も し標準規約がなかった場合は、 -fpcc-struct-return をデフォルトとして使用します。 -fshort-enums enum 型に対して、ちょうど取り得る値の範囲に応じたバイト数の型を与えます。 具体的に は、enum 型は、その値域を格納するに十分な最小の整数型と等価になります。 -fshort-double double を float と同サイズにします。 -fshared-data データと非 const 変数を、プライベートなデータではなく、共有データとしてコンパイルし ます。 このオプションは、走行中の同じプログラム間は共有データが共有され、 プライ ベートデータがそれぞれのプロセスに 1 つずつ与えられるような一部 のオペレーティング システムで意味を持ちます。 -fno-common bss セクション中の初期化されていないグローバル変数に対してでも、共通ブロック に生成 するのではなく、領域を割り当てます。このオプションは、(extern をつけずに) 同一の変 数を宣言した 2 つのコンパイルに対して、リンク時 にエラーを発生するという効果があり ます。このオプションは、常にこのような動 作を行なうシステムにおいても、プログラムが 正常に動作するかどうかを検査 する場合にのみ有用です。 -fno-ident `#ident' ディレクティブを無視します。 -fno-gnu-linker (C++ のコンストラクタとデストラクタのような) グローバルな初期化のコードを (GNU リン カがこれらを扱う標準のシステムであるようなシステムにおいて) GNU リンカで使用される 形式で出力しません。これは GNU リンカではない リンカを使用する場合に指定します。こ の場合、 collect2 を使用して、確実にシステムリンカにコンストラクタとデストラクタを 含 んだコードを出力させる必要があります。(collect2 は GNU CC のディストリビューショ ンに含まれます。) collect2 を必ず使用しなければならない システムにおいては、 コンパ イラドライバ gcc は自動的にそのようにコンフィギュレーションされます。 -finhibit-size-directive .sizeアセンブラディレクティブなど、関数が途中で分割され、メモリ上の異なった 位置に それぞれの部分が配置されるような場合に不都合が生じるような要素を 出力しません。この オプションは `crtstuff.c' をコンパイルする時に使用されます。それ以外の場所ではこれ を使用する 必要はありません。 -fverbose-asm 出力のアセンブラ中に特別なコメント情報を追加し、可読性を高めます。この オプションは 一般的には、出力のアセンブラコードを本当に読みたい場合 (例え ばコンパイラ自身をデ バッグしているような場合) にのみ効果があります。 -fvolatile ポインタによるメモリの参照を全て volatile として扱います。 -fvolatile-global 外部変数やグローバルデータアイテムへのメモリ参照を全て volatile として 扱います。 -fpic このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力しま す。このオプションは共有ライブラリでの使用に適します。 -fPIC このオプションがターゲットマシンでサポートされていれば、位置独立なコードを 出力しま す。このオプションはダイナミックリンクに適しており、分岐にお いて大きなディスプレー スメントを要求する場合にも適応します。 -ffixed-reg 名前が reg のレジスタを固定レジスタとして扱います。生成されたコードはこのレジスタ を参照しません (ただし、スタックポインタ、フレームポインタ、その他固定用 途の場合を 除きます)。 reg はレジスタ名でなければなりません。受け付けられるレジスタ名はマシン固 有であ り、マシン記述マクロファイル内の REGISTER_NAMES マクロに記述されたものです。 このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからで す。 -fcall-used-reg 名前が reg のレジスタを、関数呼び出しによって破壊される割り当て可能のレジスタ とし て取り扱います。これは、関数呼び出しを跨いで存在しない一時領域や変数 として割り当る ことができます。この指定でコンパイルされた関数は、レジスタ reg の保存や復帰を行いま せん。 このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジス タ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を 生みます。 このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからで す。 -fcall-saved-reg 名前が reg のレジスタを、関数によって保存される割り当て可能なレジスタとして取 り扱 います。これは、関数呼び出しを跨いで存在する一時領域や変数としても割り 当てることが できます。この指定でコンパイルされた関数は、レジスタ reg を使用する場合、その保存と 復帰を行います。 このフラグをマシンの実行モデルにおいて、ある固定的で特殊な役割を持って いるレジス タ、例えばスタックポインタやフレームポインタに対して適用する ことは、破滅的な結果を 生みます。 また、このフラグを関数の返り値が格納されるレジスタに使用すると、これも 破滅的な結果 を生みます。 このフラグは無効形式を持ちません。なぜなら、これは 3 通りの指定が可能で あるからで す。
プラグマ
2 つの `#pragma' ディレクティブ(指令)が GNU C++ によってサポートされています。これは、1 つ のヘッダファイルを 2 つの目的、つまりあるオブジェクトクラスのための インタフェースの定義と しての目的と、オブジェクトクラスに含まれる内容 の完全な定義としての目的の、両方の目的で使 用するためのものです。 #pragma interface (C++ のみ) このディレクティブを、オブジェクトクラスを定義しているヘッダファイル中 に使用することによって、それらのクラスを使用するほとんどのオブジェクト ファイルの大 きさを減少させることができます。通常は、 特定の情報 (インラインメンバ関数のバック アップコピー、デバッグ情報、 仮想関数実現のための内部テーブル) の複製がそのクラス定 義をインクルードした それぞれのオブジェクトファイル中に置かれます。 このプラグマを 使用することによって、このような複製を防ぐことが 可能となります。`#pragma interface' を含んだヘッダファイルをインクルードした場合は、これらの追加情報 は生成 されません (ただし、メインの入力ソースファイル自身が `#pragma implementation' を含 んでいる場合を除きます)。そのかわり、オブジェクトファイルは リンク時に解決される参 照を含むことになります。 #pragma implementation #pragma implementation "objects.h" (C++ のみ) インクルードされたヘッダファイルによる完全な出力を生成させたい (またそ れをグローバルに可視化したい) 場合には、メインの入力ファイル中でこの プラグマを使用 します。この場合、インクルードされるヘッダファイルは、`#pragma interface' を使用し ていなければなりません。インライン関数のバックアップ情報、 デバッグ情報、仮想関数実 現用の内部テーブルは、全てインプリメンテーション ファイル中に生成されます。 `#pragma implementation' を、引数をつけずに使用した場合は、これはそのソースファイル と同じ ベースネーム(basename)を持つファイルに対して適用されます。例え ば、`allclass.cc' 中の `#pragma implementation' は、`#pragma implementation “allclass.h” ' と等価です。もし複数のヘッダファイルに対して、 1 つのインプリメン テーションファイルを対応させたい場合は、 文字列の引数を使用する必要があります。 1 つのヘッダファイルに対して、複数のインプリメンテーションファイルを対 応させる方法 はありません。
関連ファイル
file.c C 言語ソースファイル file.h C 言語ヘッダ (プリプロセッサ) ファイル file.i プリプロセス済みの C 言語ソースファイル file.C C++ ソースファイル file.cc C++ ソースファイル file.cxx C++ ソースファイル file.m Objective-C ソースファイル file.s アセンブリ言語ファイル file.o オブジェクトファイル a.out リンクエディット済みの出力 TMPDIR/cc∗ 一時ファイル群 LIBDIR/cpp プリプロセッサ LIBDIR/cc1 C 言語コンパイラ LIBDIR/cc1plus C++ コンパイラ LIBDIR/collect いくつかのマシンで必要となるリンカのフロントエンド LIBDIR/libgcc.a GCC サブルーチンライブラリ /lib/crt[01n].o スタートアップルーチン LIBDIR/ccrt0 C++ 用の付加的なスタートアップルーチン /lib/libc.a 標準ライブラリ、intro(3)を参照 /usr/include #include ファイルのための標準ディレクトリ LIBDIR/include #include ファイルのための GCC 標準ディレクトリ LIBDIR/g++-include #include ファイルのための付加的な g++ ディレクトリ LIBDIR は通常 /usr/local/lib/machine/version の形式を持ちます TMPDIR は環境変数 TMPDIR (もし使用可能ならば /usr/tmp を、そうでなければ /tmp を使用しま す) からとられます。
関連項目
as(1), cpp(1), gdb(1), ld(1) info 中の `gcc', `cpp', `as', `ld', `gdb' エントリ Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman and Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain and Roland Pesch.
バグ
バグを報告する方法については、GCC マニュアルを参照してください。
COPYING
Copyright 1991, 1992, 1993 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.
作者
GNU CC に対して貢献した人々に関しては、GNU CC マニュアルを参照してください。
日本語訳
細川 達己(hosokawa@mt.cs.keio.ac.jp): NetBSD 用に翻訳 sakai@csl.cl.nec.co.jp, h-nokubi@nmit.mt.nec.co.jp, kumano@strl.nhk.or.jp, horikawa@isrd.hitachi.co.jp: FreeBSD 向けに修正, 査閲