スポンサーリンク

GCC

名称
書式
注意
解説
オプション
FreeBSD 固有のオプション
全体的なオプション
言語オプション
プリプロセッサオプション
アセンブラオプション
リンカオプション
ディレクトリオプション
警告オプション
デバッグオプション
最適化オプション
ターゲットオプション
マシン依存オプション
コード生成オプション
プラグマ
関連ファイル
関連項目
バグ
COPYING
作者
日本語訳

名称

gcc, g++ − GNU プロジェクト C および C++ コンパイラ (gcc-3.2.1)

書式

gcc [ option | filename ]...
g++
[ 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) の形式の、対照的な表現があります。ここではデ フォルトでない形式のみを示します。

すべてのオプションを種類別に分けてまとめました。詳しい解説は以下の節 で 行ないます。

全体的なオプション

−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 −print−prog−name=program

最適化オプション

−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

FreeBSD 固有のオプション

−pthread

スレッド化ユーザプロセスに libc の代りに libc_r をリン ク し ま す。

全体的なオプション

−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 などのキーワードや、unixvax などの現在使用しているシステムを規定する定義済みマクロな ど が抑制されます。さらに、好ましくなくかつほとんど使用されない 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

可 能 な 限り全てのメンバ関数を暗黙のうちに仮想関数として扱いま す。全てのメンバ関数 (コンストラクタと newdelete メンバ演算 子 を除きます) は、出現した時点でそのクラスの仮想関数として扱わ れます。

これは、これらのメンバ関数への全ての呼び出しが仮想関数のため の 内 部テーブルを参照して間接的に決定されるということを意味しませ ん。特定の状況においては、コンパイラは与えられた仮想関数への 呼 び 出しを直接決定できます。このような場合にはその関数呼び出しは 常に直接呼び出しとなります。

−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 インクルードパスに追加します。ディレクトリ名 は prefixdir を連結することによって得ら れ ま す。 こ こ で 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

マクロ macrodefn として定義します。コマンドライン上の全ての ‘−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;
}

あ る関数 (abortlongjmp を含む) が決してリターンしないという ことを 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] を与え、非-constchar ∗ ポインタへのアドレスのコピーに対して警告するように し ま す。この警告は、宣言とプロトタイプにおいて const の使用を非常に 注意深くおこなっていさえすれば、文字列定数に書き込みをしそう な コー ドをコンパイル時に発見することを助けますが、そうでない場合 は有害無益な指定です。これが、我々がこの警告を ‘−Wall’ のリクエ ストに含めなかった理由です。

−Wconversion

同 じ引数が与えられた時に、プロトタイプが存在する場合とプロトタ イプが存在しない場合とで、異なった型変換を引き起こす場合につ い て 警告します。これは固定小数点から浮動小数点への変換やその逆、 デフォルトの動作と異なる固定小数点引数の幅や符号の有無の変換 が 含まれます。

−Waggregate−return

構 造体や共用体を返す関数を定義した場合や、それらを呼び出す全て の場合に警告します。 (配列を返すことができる言語においても、 こ れは警告を引き起こします。)

−Wstrict−prototypes

引 数の型を指定せずに関数を宣言、あるいは定義した場合に警告しま す。 (以前に引数の型を指定した宣言が存在する場合には、旧式の 関 数宣言に対しては警告をしません。)

−Wmissing−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
−ggdb
level
−gstabs
level
−gcoff
level −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−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++ は以下のコードに対して、一時オブジェクトを経由せず に yfoo への呼び出しの結果から直接初期化します。

A foo (); A y = foo ();

このオプションを使用しない場合は、GNU C++ は最初に yA 型の適 切 なコンストラクタを呼び出すことによって初期化します。そして、 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 のモデルは 0 による除算の処理に問題を持っていまし た。特に、それらの多くにおいてトラップが生じなかったことは問 題 で した。これらのオプションを使用することによって、0 除算を発見 し、例外を知らせるコードを埋め込むことを禁止 (あるいは明示的 に 許 可) することができます。全ての 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.hstdarg.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-typedefault です。この選択は す べ て のマシンに対する最長のサイクル数を元にコードを生成しま す。これは、生成されるコードがどの 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 が実行され な いと、デバッガからはローカル変数を扱うことができません。さら に、 stage2stage3 のオブジェクトはアセンブラに渡される一 時 的 な ファ イル名をオブジェクトファイル中に埋め込まれて持ってお り、このためそれらを比較した場合に同一のものとはみなさ れ ま せ ん。

−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 スイッチは、テキストセクション中に参照を配置する代わ り に、外部参照を行なうポインタをデータセクションに配置し、それ をロードする動作を指定します。このオプションは現在まだ動作し ま せ ん。 −Gnumnum バイト以下のグローバル、あるいは静的なアイ テムを、通常のデータや 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 が存在しなくても floatdouble の結果を 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-typekb です。その他の選択としては 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

structunion の値を返す場合に、普通の C コンパイラが行なうの と 同じ規約を使用します。この規約は小規模な構造体に対して非効率 なものとなり、また多くのマシンでその関数を再入不可能としてし ま います。しかしこれは、GCC でコンパイルされたコードと PCC でコン パイルされたコードを相互に呼び出すことを可能とするという利点 を 持ちます。

−freg−struct−return

structunion の値を返す場合に、可能な場合はレジスタを使用す る規約を使用します。これは −fpcc−struct−return を使用した場合と 比較して、小さな構造体を返す場合に高い性能を発揮します。

−fpcc−struct−return−freg−struct−return のどちらも使用しな かった場合には、GNU CC は各ターゲットに対して標準であると考えら れ る規約をデフォルトとして使用します。もし標準規約がなかった場 合は、 −fpcc−struct−return をデフォルトとして使用します。

−fshort−enums

enum 型に対して、ちょうど取り得る値の範囲に応じたバイト数の型を 与えます。具体的には、enum 型は、その値域を格納するに十分な最小 の整数型と等価になります。

−fshort−double

doublefloat と同サイズにします。

−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 向けに修正, 査閲

スポンサーリンク