GCC と Clang のオプション概要

ここでは SOLID 環境で指定可能なコンパイラドライバ(GCC か Clang)のオプションを解説します。このドキュメントに記載されていないオプションは未サポートとなります。

注釈

ABI が変わり SOLID 環境が提供するライブラリとリンクできなくなる、IDE との連携に問題が生じる、SOLID 環境がより良い手段を提供している、等の理由により、SOLID 環境では使用できないオプションを除外しています。(一部、一般的によく使われるものの、SOLID 環境で使用してはいけないオプションを「禁止」と明記して記載しています。)また、「非推奨」や「obsolete」(過去には有用だったが現在では無意味)、「deprecated」(将来的に削除予定)と書かれているオプションは、特別な理由が無い限り使用しないでください。

重要

必要なオプションはあらかじめ IDE のプロジェクトファイルにて指定済みなので、通常はここに書かれているオプションを指定する必要はありません。また、例えば最適化オプションは、プロジェクトファイルの構成(Debug/Release 等)によって決定されるべきものであり、ユーザが指定するべきものでは無いため、非常に重要なオプションではあるものの、このドキュメントには記載されておりません。SOLID 環境が使用しているオプションは SOLID が使用しているオプション を参照してください。(既にそこで指定済みで、複数回指定に意味が無い、あるいは設定を変更してはいけないオプションは、このドキュメントには記載されておりません。)

GCC と Clang の共通オプション

同名のオプションが存在し、似たような動作を行うという所まで確認済みです。細部の動作まで一致することを保証するものではありません。

基本的には(--help オプション指定時の出力と同様に)アルファベット順に記載していますが、一つのグループを成しているオプションや、-fXXX-mXXX と対になる -fno-XXX-mno-XXX オプションは近くに固める等の並べ替えを行っています。

-B <directory>, --prefix <directory>, --prefix=<directory>

プログラム(.exe)とオブジェクトファイル(.o)の検索パスに <directory> を追加します。

-C, --comments

プリプロセッサ出力にソースコード中のコメントを残します。

-CC, --comments-in-macros

-C に近い動作をしますが、プリプロセッサマクロを展開する際、その内部のコメントも含めます。

-dD

-E オプション指定時の出力にマクロ定義(#define)を含めます。

-dI

-E オプション指定時の出力に #include 指示文を含めます。

-dM

-E オプション指定時、マクロ定義の出力のみを行います。

-P, --no-line-commands

-E オプション指定時、行番号情報を出力しません。(非 C/C++ のファイルに C プリプロセッサを使用したい場合に指定します。)

-E

プリプロセスのみを行います。

-fsyntax-only

プリプロセス、構文チェック、型チェックのみを行います。(コンパイルが通ることのみ確認。)

-S

プリプロセスとコンパイルのみを行います。(アセンブルは行いません。)

-c

プリプロセス、コンパイル、アセンブルのみを行います。(リンクは行いません。)

-D<macro>=<value>, --define-macro <macro>=<value>, --define-macro=<macro>=<value>

マクロ <macro> を値 <value>=<value> 省略時には 1)で事前定義(ソースコード中の全ての #define に優先)します。

-undef

ターゲットやコンパイラ固有の事前定義マクロを #undef します。__STD_* 等、言語仕様で定義されるマクロは残ります。

-U<macro>, --undefine-macro <macro>, --undefined-macro=<macro>

<macro>#undef します。

-fdata-sections

変数ごとに .data.変数名 のような独自の ELF セクションを生成します。GNU ld 等のガベージコレクション機能を持つリンカを使用すると、セクション単位で使われていないコードやデータを削除できるので、細かくセクションを分けておけば有利になります。(-ffunction-sections も同様です。)

-ffunction-sections

関数ごとに .text.関数名 のような独自の ELF セクションを生成します。

-ffreestanding (禁止)

組み込みではよく使われるオプションですが、SOLID は OS があるホスト環境であり、フリースタンディング環境ではないので、使用しないでください。

-fdebug-prefix-map=<old>=<new>

デバッグ情報内のソースパス <old><new> に変換します。

-fexceptions

例外処理機能を有効にします。C++ ではデフォルト有効です。C でも指定は可能ですが、libgcc 等の特別なランタイムライブラリが使用することを想定している機能なので、サポート外となります。

-fno-asm

asminlinetypeof をキーワードとして認識しないようにします。(通常の識別子として扱われます。)このオプションを指定した場合でも、__asm____inline____typeof__ は使用可能です。C++ モードでは、asminline は標準仕様に含まれていて typeof のみが対象となるため、-fno-gnu-keywords を指定する方が意味的に適切です。C99 モードでは inline が標準仕様に含まれているので asmtypeof のみが対象となります。-std オプションで gnu* 以外を指定した場合、このオプションは暗黙的に指定されます。

-fno-gnu-keywords

C++ モードでのみ有効で typeof のみが対象になる -fno-asm です。

-fno-math-errno (非推奨)

プログラムで errno を使用しないとコンパイラに伝え、エラーチェックと errno のセットの省略を許可します。これにより例えば sqrt() を FPU の sqrt 命令に展開するような最適化が可能になります。デフォルトは -fmath-errno で省略しません。この最適化はいかなる最適化レベルでも有効になりません。プログラムが errno を使用していないことが確実な場合以外は指定しないでください。

注釈

数学関数の最適化や自動ベクトル化がますます重要になってきているため、将来的に C99 math_errhandling をサポートし、この値を常に MATH_ERREXCEPT に規定することで数学関数が errno を変更しないように規定して、このオプションを常に有効することも検討しています。

-ffast-math (非推奨)

誤差よりも速度を優先し、生成されるコードが C/C++ の仕様(IEEE 仕様)に準拠しない動作となりますが、強力な浮動小数点数の最適化を行います。誤差対策が成されたコードでのみ、自己責任で使用してください。このオプションが必要となる代表的な状況は(IEEE 754 仕様に完全には準拠していない) ARM の NEON 命令をコンパイラに生成させたい場合となります。ただし一般的には NEON 命令等の特殊な高速化命令はプログラマが手書きしなければ十分な効果が得られないため、このオプションを使用する機会は限られたものとなるでしょう。この最適化はいかなる最適化レベルでも有効になりません。

-ffixed-<reg>, -ffixed-r9 (ARM)(非推奨)

<reg> レジスタを予約し、使用しません。GCC は <reg> に任意のレジスタを指定可能ですが、Clang は r9 のみ可能(-ffixed-r9 オプションのみ指定可能)です。使用するレジスタによっては ABI を破壊する可能性があるので、呼び出し規約で引数や戻り値等に使用するレジスタ、スタックポインタ等固定用途レジスタは指定しないでください。

-fgnu89-inline

c99 以降でのみ有効。gnu89 のインラインセマンティクスを使用します。以下のような動作となります。

static inline

共通。通常の static 関数と同じ。(全てインライン展開された場合、関数の実体が消滅。)

inline 修飾プロトタイプあり

共通。関数の実体は必ず残る。

inline

関数の実体は必ず残る。(c99 セマンティクスでは必ず消滅。)

extern inline

関数の実体は必ず消滅。(c99 セマンティクスでは必ず残る。)

-finline-functions

全ての関数をインライン展開の対象とします。(必ず展開されるわけではありません。)

-finstrument-functions

関数の入り口と出口に instrument 関数呼び出しを生成します。SOLID IDE のプロジェクト設定によっては、このオプションを使用する場合があり、その場合は SOLID が提供する instrument 関数の定義を修正してください。ユーザが定義する instrument 関数のプロトタイプは以下のようになります。第一引数には現在の関数へのポインタ、第二引数には呼び出し元の関数へのポインタが渡されます。

void __cyg_profile_func_enter (void *this_fn, void *call_site);
void __cyg_profile_func_exit  (void *this_fn, void *call_site);
-fdollars-in-identifiers (非推奨)

ソースコード中の識別子に $ を使用可能にします。

-fno-dollars-in-identifiers

ソースコード中の識別子に $ を使用できなくします。(デフォルト)

-fno-access-control (非推奨)

C++ のアクセス制御(classprivate 等)を無効にします。クラスの単体テスト等、特別な目的以外では使用しないでください。

-fno-builtin-<name>

ビルトイン関数 <name> の最適化を抑制し、 <name> 関数が確実に呼び出されるようにします。例えば -fno-builtin-printf を指定すると printf("XXX\n")puts("XXX") に変換するような最適化を行いません。

-fno-builtin

全てのビルトイン関数最適化を抑制します。

-fcommon

変数を ELF ファイル中のどのセクションに配置するかは、C の規格には含まれていません。多くのコンパイラでは、初期値のある大域変数は .data セクション、0 初期化された大域変数は .bss セクションに配置されます。GCC と Clang は、未初期化の大域変数をとりあえず common(.comm)セクションに配置し、GNU ld リンカ(およびその互換リンカ)が最後にまとめる(多重定義エラーにならない)という処理を行います。(デフォルト)

-fno-common

このオプションを指定した場合、未初期化の大域変数は .bss セクションに配置されます。(-fcommon の解説を参照。)必ず 1 つの大域変数だけが非 extern 宣言で、他は全て extern 宣言である必要があります。(GCC や Clang コンパイラ、GNU ld リンカのデフォルト動作に依存しない、できる限り移植性のあるコードを書く必要がある場合に指定します。)

-fno-elide-constructors (非推奨)

C++11 で許可された特定条件化でのオブジェクトのコピーの省略(最適化)を禁止し、必ずコピーコンストラクタが呼ばれるようにします。

-fno-jump-tables (非推奨)

switch 文をコンパイルする際にジャンプテーブルを生成しません。

-fmerge-all-constants

同一の値を持つ文字列や const 配列等の定数への参照を、コンパイル単位を超えて全てマージ(単一の実体を参照するように最適化)します。最適化有効時にはデフォルトで有効になります。

-fno-merge-all-constants

C 規格では、異なる変数は異なるアドレスを参照しなければいけないため、定数のマージ(-fmerge-all-constants の解説を参照)を認めていません。規格に厳格なコードを書く必要がある場合に指定してください。

-fno-operator-names

C++ のオペレータの同義語として and/bitand/bitor/compl/not/or/xor を使うことを禁止します。

-fno-rtti

C++ の RTTI 情報の生成を禁止します。

-fsigned-zeros

IEEE 仕様に従い +0.0 と -0.0 を区別した浮動小数点数演算を行います。(デフォルト)

-fno-signed-zeros

浮動小数点数 0.0 の符号を無視した最適化を行います。

-funroll-loops

コンパイル時に繰り返し回数が決定しているループ処理を展開します。

-fno-unroll-loops

ループ展開をしません。(デフォルト)

-fno-use-cxa-atexit

プログラム終了時、デストラクタを呼ぶための __cxa_atexit() の呼び出し(とリンク)を禁止します。組み込み環境では Linux や Windows のようなリッチ OS 環境のように明確なプログラムの終了という概念が無いため、そもそもデストラクタの実行に常に頼れるとは限りません。そのような場合に不要なデストラクタコード等のリンクを防ぐために使用します。(その際にはスタートアップルーチンを自前で用意し、main() の後に exit() を呼ばないことが条件となります。SOLID ツールチェーンの libc の exit() は常に __cxa_atexit() を呼び出します。)

-freciprocal-math (非推奨)

除算の特殊な最適化を有効にします。例えば x/yx * (1/y) に置き換えられ、この部分式 1/y に対して共通部分式除去等の最適化が可能になる場合があります。ただし、この最適化を行うと精度が低下してしまう恐れがあるので、デフォルトでは行いません。(-fno-reciprocal-math

-fsized-deallocation

C++14 で導入されたサイズ付きデアロケーションを有効にします。GCC では C++14 以降でデフォルト有効ですが、Clang はこのオプションを付けない限り有効になりません。

-ftrapv (非推奨)

符号付き整数の加減乗算でオーバーフロー、アンダーフローの検出を行います。GCC は命令を生成する代わりに libgcc の関数を呼び出してチェックを行うので、動作は libgcc の実装に依存します。(SOLID 環境では検出時に abort() を呼び出します。)Clang ではチェックコードを生成し、デフォルトでは検出時に未定義命令を実行して例外を発生させます。Clang でのみ、-ftrapv-handler=関数名 で任意の関数を呼び出すように指定可能です。非常にパフォーマンスが低下するのでデバッグ時以外には指定しないでください。

-fvisibility=[default | internal | hidden | protected] (非推奨)

ELF のグローバルシンボルのデフォルトの可視属性を設定します。ほぼ Linux 環境等での C++ の shared object (.so ファイル)のロードを高速化(シンボルテーブルのサイズが減るのでバイナリサイズも削減)するためだけに使用される機能です。具体的には、非公開の関数全てに attribute で hidden を指定するのは煩雑すぎるので、-fvisibility=hidden でライブラリをコンパイルし、公開したい関数にのみ attribute で default を指定するという流れになります。SOLID 環境では通常は不要です。デフォルトは default(公開)です。

-fvisibility-inlines-hidden (非推奨)

インライン関数やクラスのインラインメンバの可視属性を hidden に設定します。可視属性を設定する意義は -fvisibility オプションを参照してください。

-fwrapv

例えば if (i+1 > i) という比較は数学的には常に成り立つので、デフォルト(-fno-wrapv)では削除(最適化)されます。しかしコンピュータ上では 2 の補数表現を使用するため、i の型が int で値が INT_MAX の場合 wrap around して 0 となり、この比較は偽になる可能性があります。このオプションは整数がオーバーフローしないということを前提にした最適化を抑制します。(デフォルトは -fno-wrapv で、常に整数がオーバーフローしないことを前提とした最適化を行います。)

-gdwarf-2 (非推奨)(obsolete)

DWARF Version 2 規格のデバッグ情報を生成します。SOLID 環境のデバッガは DWARF 3 以降をサポートしているので指定する意味はありません。現在の GCC や Clang の高度な最適化を表現するには力不足な古い規格で、満足なデバッグができません。

-gdwarf-3

DWARF Version 3 規格のデバッグ情報を生成します。SOLID 環境のデフォルトです。

-gdwarf-4

DWARF Version 4 規格のデバッグ情報を生成します。基本的に SOLID 環境のデバッガは DWARF 4 をサポートし、最適化により消滅した変数をできる限り再現する等、高度なデバッグを提供可能です。しかし本質的に、既に無い物をあるように見せかける高度な技術なので、コンパイラが(間違っているとまでは言えないものの)紛らわしい情報を出してしまう場合等があり、場合によってはかえってデバッグがしにくくなる場合もあります。また、非常に複雑なデバッグ情報が場合によっては生成され、デバッガが完全には対応できない(最悪、デバッグ情報を読み込めない)場合もあるかもしれません。その場合は DWARF 3 を指定してください。(安全側に振り、SOLID 環境のデフォルトは 3 になっております。)

-gdwarf-5 (非推奨)

DWARF Version 5 規格のデバッグ情報を生成します。実験的サポート段階なので使用しないでください。

-gstrict-dwarf

-gdwarf-<version><version>34)オプションと必ずセットで指定してください。DWARF <version> 規格に準拠したデバッグ情報を生成します。(GNU 拡張や、後継規格のデバッグ情報の生成を禁止します。)ただし Clang には、このオプションを指定しても DWARF 5 のデバッグ情報が一部出てしまうバグがあるので、SOLID 環境では修正しています。

-g, -gdwarf (非推奨)

DWARF 4 までの仕様 + GNU 拡張のデバッグ情報(+ DWARF 5 の一部)が出力されます。GNU 拡張のデバッグ情報は標準化や(完全な)ドキュメント化がされていないため、GDB 7.0 以降(Clang も GDB を参考に実装していると思われます。)以外での完全なサポートは困難になります。(SOLID 環境のデバッガもできる限り努力はしておりますが、完全ではありません。)特別な理由が無ければ -gdwarf-3, -gstrict-dwarf のように、DWARF 規格に準拠したデバッグ情報を生成する組み合わせを指定してください。

-g0

デバッグ情報を出力しません。-g 系のオプションを上書きして打ち消すために存在します。

-g1

最小限のデバッグ情報(バックトレースに使用する関数と大域変数の行番号情報のみ)を出力します。ローカル変数のデバッグはできません。

-g2

-g 指定と同じです。(デフォルト)

-g3

マクロ展開に関する情報等を出力します。非常に大量のデバッグ情報が出力され、ELF のサイズが巨大化します。

--help

指定可能なオプションのリストを出力します。Clang は -help も指定可能です。

-H, --trace-includes

ヘッダファイルの include 依存関係を出力します。

-I-, --include-barrier (禁止)(deprecated)

このオプションよりも前に -I で追加されたディレクトリ群は #include "file" (二重引用符)の形式で include された場合のみ検索対象となり、#include <file> (鍵括弧)の場合は検索されません。また、本来は最優先となる、ソースファイルが存在するディレクトリを #include "file" の検索対象から外します。このオプション以後に指定された -I は通常通りの動作となります。将来的に廃止予定なので、新規のプロジェクトでは -iquote を使用してください。(Clang では廃止されました。エラーになります。)

-isystem <directory>

システムインクルード検索パスのリストの先頭に <directory> を追加します。-I とほとんど同じですが、システムインクルード検索パスは -I で追加されたリストの次に検索される点と、見つかったヘッダファイルがシステムヘッダ扱いとなる点が異なります。コンパイラや多くのツールはシステムヘッダを信頼できるものとし(例えば多くの警告を抑制する等)特別扱いします。

-idirafter <directory>
--include-directory-after <directory>,
--include-directory-after=<directory>

システムインクルード検索パスのリストの最後に <directory> を追加します。システムインクルード検索パスの意義については -isystem を参照してください。

-include <file>, --include <file>, --include=<file>

ファイルの先頭に #include "file" を追加した場合と基本的には同じ動作となります。ただし #include "file" の場合はソースファイルが存在するディレクトリが最優先となりますが、この場合はプリプロセッサのカレントワーキングディレクトリが最優先となります。

-imacros <file>, --imacros <file>, --imacros=<file>

基本的には -include と同じ動作になりますが、<file> 内のマクロ定義のみをプリプロセス処理に追加します。(ファイルの内容は一切追加されません。)この追加は -include を含む、全ての #include に優先します。

-iprefix <directory>, --include-prefix <directory>, --include-prefix=<directory>

-iwithprefix/-iwithprefixbefore のためのプレフィックス <directory> を指定します。<directory> の最後はパスの区切り文字(/\)で終了してください。

-iwithprefixbefore <directory>
--include-with-prefix-before <directory>
--include-with-prefix-before=<directory>

<directory>-iwithprefix で指定されたプリフィックスを連結したディレクトリをインクルード検索パスに追加します。(-I と同様。)

-iwithprefix <directory>
--include-with-prefix <directory>
--include-with-prefix-after <directory>
--include-with-prefix-after=<directory>
--include-with-prefix=<directory>

<directory>-iwithprefix で指定されたプリフィックスを連結したディレクトリをシステムインクルード検索パスの最後に追加します。(-idirafter と同様。)

-iquote <directory>

#include "file" (二重引用符 = quote)の検索パスに <directory> を追加します。(#include <file> の場合は対象になりません。)もし <directory>= で開始する場合は、= を sysroot (--sysroot-isysroot を参照)で置き換えます。

-isysroot <directory>, --sysroot=<directory>

ヘッダファイルやライブラリファイルを検索する際のルートディレクトリに <directory> を指定します。

-I <directory>, --include-directory <directory>, --include-directory=<directory>

インクルード検索パスの先頭に <directory> を追加します。

-L <directory>

ライブラリ検索パスの先頭に <directory> を追加します。

-MD, --write-dependencies

Makefile の書式で、ヘッダファイルの依存関係を出力します。(デフォルトの出力先は標準出力で、-MF で変更可能です。)以下の -M で始まるオプション(M 系オプション)は Makefile を使う場合にのみ有用で、IDE が自動的に依存関係を解析する SOLID 環境では通常は不要です。

-MF <file>

-MMD-MD-MM-M 指定時の出力先に <file> を指定します。

-M, --dependencies

-MD と同じ出力をしますが、コンパイルは行いません。

-MMD, --write-user-dependencies

-MD に近い動作をしますが、システムヘッダは出力しません。システムヘッダについては -isystem を参照してください。

-MM, --user-dependencies

-MMD と同じ出力をしますが、コンパイルは行いません。

-MG, --print-missing-file-dependencies

-MM-M でヘッダファイルの依存関係のみを調べる際、デフォルトではファイルが見つからなければエラーになりますが、このオプションを指定するとエラーにはせず、依存関係に追加します。(make の途中でヘッダファイルが生成される場合等で使用されます。)

-MP

メインファイル以外の依存するファイルを Makefile の phony ターゲットとして出力します。(不要になったヘッダファイルを削除した際のビルドエラーを防ぐことができます。)

-MT <target>

通常、foo.c ファイルに対して M 系オプションで依存関係を出力した場合、ターゲット名は foo.o のようになりますが、それを <target> に変更できます。

-MQ <target>

-MT と基本的には同じですが、<target> に Makefile で特別な意味を持つ文字($ 等)が含まれていた場合、適切にエスケープします。

-mlong-calls (ARM)

関数呼び出しを、レジスタに 32bit 絶対アドレスをロードした後にブランチするコードにコンパイルします。ブランチ先が± 64 MB を超える場合、オフセットアドレスベースのブランチはリンクに失敗する場合があり、その際に指定します。デフォルトは -mno-long-calls (通常のコンパイル)です。

-momit-leaf-frame-pointer

leaf 関数(他の関数を呼び出さない関数)のためのフレームポインタの保存を省略します。デフォルトは -mno-omit-leaf-frame-pointer で常に保存します。

-mrestrict-it (ARM)

Thumb コード生成時、ARMv8-A で deprecate された形式の IT ブロックを生成しません。ARMv8 Thumb モードではデフォルトです。(何らかの理由で生成する場合は -mno-restrict-it を指定。)

-o <file>

出力先を <file> に設定します。

-Wpedantic, -pedantic

C/C++ 標準に含まれない、コンパイラの拡張機能を無効にし、使用した場合は警告を出します。ただしこのオプションは、標準に準拠したプログラムであることを保証するものではありません。例えば int _Foo = 0;int __foo = 0; というプログラム片は、規格により予約されていて、ユーザコードが使用することはできない、アンダースコアから始まり、その直後に大文字またはアンダースコアがある名前を使用しているので規格違反ですが、このオプションでは検出できません。

-pedantic-errors

-pedantic と似ていますが、コンパイラの拡張機能を使用した場合はエラーにする点が異なります。

-pipe (禁止)

中間結果をファイルではなくパイプで次のツールに渡します。UNIX 環境では処理の高速化のためによく使われるオプションですが、SOLID 環境では使用してはいけません。(Windows 環境ではもともと正しく動作しませんし、SOLID は様々な理由により IDE 内部で中間ファイルを使用する場合があります。)

-print-file-name=<file>

<file> のフルパスを出力します。見つからない場合は <file> をそのまま出力します。(以下の -print-* も同様。)

-print-libgcc-file-name

コンパイラランタイムライブラリのフルパスを出力します。共通のライブラリを使用する SOLID 環境ではどちらも libgcc.a になります。

-print-prog-name=<name>

コンパイラドライバが使用するプログラム <name> のフルパスを出力します。

-print-search-dirs

プログラム(.exe)とライブラリ(-lXXX で指定した場合の libXXX.a ファイル)の検索パスを出力します。

-save-temps=[ cwd | obj ]

コンパイルの中間結果をファイルとして残します。cwd の場合はカレントワーキングディレクトリ(Current Working Directory)にファイルを生成し、obj の場合は -o で指定されたファイルと同じ場所に生成します。= 指定を省略時は cwd となります。

-std=<value>

コンパイルの際に使用する言語標準を指定します。 参照: C/C++ の言語規格について

-time (未サポート)

コンパイル、アセンブル、リンクにかかった時間を出力します。Windows 環境では無視されます。

-traditional-cpp (obsolete)

標準化される前の C コンパイラのプリプロセッサの動作をエミュレートします。

-fno-trigraphs

ISO C 仕様の ?? で開始するトライグラフシーケンスを解釈しません。(デフォルト)

-fverbose-asm

-S 指定時や -save-temps 時に出力されるアセンブラソースにコメントを出力します。

-trigraphs (禁止)(obsolete)

トライグラフシーケンスを有効にします。-std オプションで gnuXXX 以外を指定するか、このオプションを指定時以外は、トライグラフシーケンスは解釈されません。トライグラフは SOLID がサポートする英語と日本語環境では無意味な上、C++17 では仕様から削除されます。IDE の解析を妨げるので、以下のような表記は、使用しないでください。

トライグラフの一覧(使用禁止)

トライグラフの表記

表される文字

??=

#

??(

[

??/

\

??)

]

??'

^

??<

{

??!

|

??>

}

??-

~

-T <script>

<script> をリンカスクリプトとして使用します。

-version

バージョン情報を出力します。

-v

実行するコマンドの詳細情報を出力します。(コマンドを実行します。)メインファイルが指定されなかった場合は、コンパイラドライバに関する情報を出力して終了します。

-###

実行するコマンドの詳細情報を出力します。(コマンドを実行しません。)

-Wa,<arg>

アセンブラにカンマ区切りの引数 <arg> を渡します。

-Wl,<arg>

リンカにカンマ区切りの引数 <arg> を渡します。

-Wp,<arg>

プリプロセッサにカンマ区切りの引数 <arg> を渡します。

-W<warning>

警告 <warning> を有効にします。基本的には -Wall -Wextra のみで十分です。非常に膨大なオプションが存在するので詳細は各コンパイラのマニュアルを参照してください。

-Werror

警告をエラーとして扱います。

-Xassembler <option>

アセンブラに <option> を渡します。<option> にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。

-Xlinker <option>

リンカに <option> を渡します。<option> にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。

-Xpreprocessor <option>

プリプロセッサに <option> を渡します。<option> にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。

-x [ c | c++ | assembler-with-cpp ]

入力(ファイル)を <language> 言語として解釈します。

-z <keyword>

リンカに <keyword> を渡します。SOLID 環境で指定可能な値は GNU ld の -z オプションと同じです。

GCC のみ指定可能なオプション

注釈

長い歴史を持つ GCC は互換性を保つために膨大なオプションを指定可能になっており、このドキュメントで全てをカバーすることはできません。また、SOLID 環境の、2 種類のコンパイラをサポートするという優れた特徴を崩さないためにも、基本的に Clang でのみ使用可能なオプションの代替と成るオプションのみをここでは載せています。

-finput-charset=<charset>

ソースコードの文字コードを <charset> として読み込みます。デフォルトは UTF-8 です。Clang はこのオプションをサポートせず、UTF-8 以外のソースコードは未サポートとなるため、SOLID プロジェクトのソースコードは全て UTF-8 となっており、それ以外の文字コードは未サポートとなります。

-fexec-charset=<charset>

コンパイラが出力するアセンブラソース中の文字コードを指定します。Clang はこのオプションをサポートせず、常に UTF-8 で出力します。どうしても UTF-8 以外で出力する必要がある場合は、メッセージテキストを C ファイルに分割し、そのファイルのみ gcc で、このオプションを付けてコンパイルしてください。

-gstabs, -gstabs+ (非推奨)(obsolete)

stabs 形式のデバッグ情報を出力します。SOLID のデバッガはサポートしていますが、現在の GCC や Clang の高度な最適化を表現するには力不足な古い規格で、満足なデバッグができません。

-fmerge-constants (非推奨)(obsolete)

コンパイル単位内の同一の値を持つ文字列や const 配列等の定数への参照を全てマージ(単一の実体を参照するように最適化)します。最適化有効時にはデフォルトで有効になります。コンパイル単位を超える最適化を -fmerge-all-constants で行うことができ、これは GCC/Clang 両方で使用できるので、通常このオプションを指定する機会は無いはずです。(そのため Clang ではサポートされていないものと考えられます。おそらく昔の環境ではリンカのサポートが無い等の理由により、コンパイル単位を超える最適化ができない環境がそこそこあったのだろうと思われます。)

-fno-merge-constants (非推奨)(obsolete)

C 規格では、異なる変数は異なるアドレスを参照しなければいけないため、定数のマージ(-fmerge-constants の解説を参照)を認めていません。規格に厳格なコードを書く必要がある場合に指定してください。

Clang のみ指定可能なオプション

注釈

Clang は GCC とは異なる設計思想を持ち、コンパイラ・アセンブラとしてだけではなく、IDE の入力補完やソースコード解析ツールへの応用が可能な作りとなっていて、実際に SOLID の IDE でも使用しています。そのため警告やエラーメッセージ等の様々な設定(diagnostics)や、ソースコードの様々な解釈を可能とする豊富なオプションを指定可能ですが、SOLID 環境では、あらかじめ IDE との連携を考えて、最適と思われるそれらのオプション指定を自動的に行うようになっています。ユーザがそれらのオプションを任意に追加した場合、IDE での対応が難しいため、本ドキュメントでは問題が起こる可能性があるオプションは載せておりません。

注釈

SOLID は Clang/LLVM をコンパイラ・アセンブラとしてのみ使用し、ターゲット用の機械語生成までを一気に行います。そのため、ターゲット非依存のバイトコード(Java のようなもの)を使用する様々な LLVM の機能(特に LTO 最適化や JIT コンパイル)については未サポートとなり、本ドキュメントでは扱いません。

注釈

SOLID 環境の Clang はリンカとして GCC を使用します。IDE でビルドする場合はコンパイルとリンクのフェイズが分かれているので通常は問題ありませんが、Clang で一気に ELF ファイルまで作成する場合、GCC がサポートしない以下のオプションを渡すと、そのオプションが GCC にもそのまま渡り、エラーになる場合があります。

-emit-llvm

-S と同時に指定された場合は LLVM アセンブラコード、-c と同時に指定された場合は LLVM バイトコードを出力します。LLVM アセンブラコードには関数の属性等の情報がわかりやすく含まれているので、LLVM バイトコードを使用しない SOLID 環境でも有用です。

-stdlib=[libstdc++ | libc++ ] (禁止)

C++ 標準ライブラリを選択します。SOLID は libc++ ライブラリをサポートしていないので使用しないでください。

-stdlib=[libgcc | compiler-rt ] (禁止)

コンパイラランタイムライブラリを選択します。SOLID は libcompiler_rt 単体での使用をサポートしていないので使用しないでください。(SOLID ツールチェーンの libcompiler_rt は libgcc に含まれていない関数のみを抽出した特別版です。必ず libgcc と一緒にリンクしなければいけません。)

-cxx-isystem <directory>

C++ モードのシステムインクルード検索パスに <directory> を追加します。 -isystem との違いは C++ モードでのみ有効な点です。

-faligned-allocation (禁止)

C++17 の aligned allocation 関数を有効にします。C++17 は未サポートなので使用しないでください。 :c++:func:std::aligned_alloc を使用するとコンパイルエラーが発生します。

-fborland-extensions (禁止)

__pascal 等の Borland 拡張を有効にします。Pascal (Delphi) をサポートしない SOLID 環境では無意味なので使用しないでください。

-fcxx-exceptions

C++ の例外機能を有効にします。(デフォルト) -fexceptions との違いは C++ モードでのみ有効な点です。(C の時は無視されます。)

-fdebug-macro

マクロ展開に関するデバッグ情報を出力します。GCC では、他の情報も出てしまいますが、-g3 で代替できます。

-fno-debug-macro

マクロ展開に関するデバッグ情報を出力しません。(デフォルト)

-fdouble-square-bracket-attributes

C/C++ の全てのモード(-std)で [[]] 形式の attribute 指定を有効にします。

-fno-double-square-bracket-attributes

C/C++ の全てのモード(-std)で [[]] 形式の attribute 指定を無効にします。

-fgnu-keywords

GNU 拡張キーワードを有効にします。(デフォルト)

-finline-hint-functions

inline 指定(キーワードや属性等)されている関数のみをインライン展開の対象とします。(必ず展開されるわけではありません。)

-finstrument-functions-after-inlining

-finstrument-functions と基本的に同じですが、インライン展開が終わった後に関数を挿入します。(インライン展開された関数の enter/exit は呼ばれません。)

-finstrument-function-entry-bare

-finstrument-functions-after-inlining と似ていますが、enter だけが呼ばれるのと、引数を取らない以下のプロトタイプになります。

void __cyg_profile_func_enter_bare (void);
-fmax-type-align=<align> (非推奨)

アライメントが決まっていないポインタが指すオブジェクトの最大アライメント <align> を指定します。

-fnew-alignment=<align> (非推奨)

::operator new(size_t) が保証する最大のアライメント <align> を指定します。

-fno-assume-sane-operator-new

C++ のグローバルな new は一切ポインタをエイリアスしない、という仮定をしません。

-nobuiltininc

全ての標準インクルードパスを検索しないようにします。(-nostdinc-nostdinc++ を両方指定した場合と等価です。)

-fno-gnu-inline-asm

GNU 拡張のインラインアセンブラを禁止します。

-fno-preserve-as-comments

インラインアセンブラ内のコメントを取り除きます。

-freroll-loops

ループリロールを行います。リロールとは、ループアンロール(展開)の逆変換で、主にコードサイズの削減のために行われます。-Os 等の最適化で有効になります。

-fno-reroll-loops

ループリロールを行いません。

-fstandalone-debug

コンパイル単位内で使用されていない型も含む、完全なデバッグ情報を出力します。(ヘッダファイルには大量の型情報が含まれますが、通常はその極一部しか使用されません。)

-fno-standalone-debug

バイナリサイズ削減のため、コンパイル単位内で使用されている型のみデバッグ情報を出力する等、様々なデバッグ情報のサイズ最適化を行います。(デフォルト)

-fpascal-strings (非推奨)

先頭 1 バイトに文字数が入った Pascal 文字列を "\pテキスト" のような書式でサポートします。Pascal (Delphi) をサポートしない SOLID 環境では無意味なので使用しないでください。

-frelaxed-template-template-args (禁止)

C++17 のクラステンプレートのテンプレート引数推論を有効にします。C++17 は未サポートなので使用しないでください。

-fstrict-return

C++ モードで、非 void 関数の最後に return が無い場合 unreachable として扱い trap 命令を生成します。(デフォルト)

-fno-strict-return

C++ モードで、非 void 関数の最後に return が無い場合でも、C と同様のコード(戻り値は未定義)を生成し、trap しません。

-fstrict-vtable-pointers

C++ オブジェクトの仮想関数テーブルについて厳格なルールを適用(例えば vptr はオブジェクトの生存期間中は不変)し、脱仮想関数化等の最適化を行います。

-ftrap-function=<funcname>

trap 命令を生成する代わりに <funcname> を呼び出します。trap 命令が生成される例は -fstrict-return 等を参照してください。

-ftrapv-handler=<funcname>

-ftrapv で検出時に呼ばれる関数 <funcname> を指定します。

-fshow-overloads=[ best | all ]

関数オーバーロードの解決が失敗した時の候補の表示を指定します。デフォルトは all です。

-fvectorize

ループベクトル化最適化を行います。-O2 以上の最適化時にはデフォルトで有効になります。

-fwritable-strings (禁止)(obsolete)

文字列定数を .data 等の書き込み可能なセクションに配置します。GCC は 4.0 でこのオプションを廃止しました。

-iwithsysroot <directory>

システムインクルード検索パスのリストの先頭に <directory> を追加します。/AAA/BBB のような UNIX パス形式の絶対パスが指定された場合、-isysroot で指定されたディレクトリからの相対パスと解釈されます。

-gline-tables-only

デバッグ情報として、行番号情報のみを出力します。GCC では、他の情報も出てしまいますが、-g1 で代替できます。

--system-header-prefix=<prefix>, --system-header-prefix <prefix>

<prefix> から開始するファイルを #include した場合、システムヘッダとして扱います。システムヘッダについては -isystem を参照してください。

--no-system-header-prefix=<prefix>

<prefix> から開始するファイルを #include した場合、システムヘッダとして扱いません。システムヘッダについては -isystem を参照してください。

-mexecute-only(ARM)(禁止)

コード(.text)セクション内でのリード・ライトアクセス(コンスタントプール)を禁止します。これは ARMv7-M や Cortex-M3 等のセキュリティ強化機能 eXecute-Only Memory(XOM)をサポートしたターゲットでのみ有効で、現在の SOLID では使用できません。また、仮に条件を満たすターゲットであっても、ライブラリは .text セクションでコンスタントプールを使用するので、XOM 以外に配置しなければいけない等、様々な条件があります。

-mno-execute-only(ARM)

コード(.text)セクション内でのリード・ライトアクセスを許可します。(デフォルト。)

-mglobal-merge

ファイルローカル(internal linkage)の大域変数を一つにまとめる global merge 最適化を行います。これにより、レジスタの使用が最適化される可能性がありますが、デバッグ情報の混乱やリンカによる最適化の阻害等の副作用もあります。

-mno-global-merge

global merge 最適化(-mglobal-merge を参照)を行いません。

-mno-implicit-float

浮動小数点型や SIMD データ型以外に対する、暗黙的な VFP 命令や NEON 命令の生成を禁止します。(例えば NEON 命令を使って 32 バイト単位のコピーを行うことなどが該当します。)

-mno-movt (ARM)

movt/movw ペアの命令を生成しません。

-mno-neg-immediates

Clang のアセンブラが、負の即値を、その否定やビット反転に変換する最適化を抑制します。例えば sub r0, r0, 0xffffff01add r0, r0, 0xff と等価です。通常は問題無いのですが、-S で生成したアセンブラコードと、実際のオブジェクトファイルの逆アセンブル結果が異なってしまい、デバッグ中に混乱する場合があるので、そのような時に指定します。

-mno-thumb

GCC の -marm と等価ですが、GCC は -mno-thumb をサポートしないため、Clang が -marm-mno-thumb と解釈して GCC に渡すとエラーになってしまうので、SOLID の Clang は -marm オプションを無視するという仕様になってます。-mthumb の打ち消しとして -marm を使用する場合は、このオプションを指定してください。

-mprefer-vector-width=<value> (非推奨)

自動ベクトル化(最適化)のための適切なベクトル長を指定します。デフォルトは none でターゲット固有の設定が適用されます。

-mrelax-all

Clang のアセンブラが、常に汎用的(relaxed)な機械語命令を生成します。例えばジャンプ先アドレス等の即値が 8 bit の範囲に収まり、より短い機械語命令列にアセンブル可能(fixed 命令)な場合でも、そのような最適化をせずに、32 bit 即値を扱う機械語にアセンブルします。非最適化(-O0)時のデフォルトです。

-mstack-alignment=<align>

スタックの最小アライメント <align> を指定します。

-MV

NMake/Jom 形式で M 系オプションの依存関係を出力します。

-save-stats, -save-stats=[cwd | obj] (非推奨)

LLVM の各フェイズの統計情報をファイルに保存します。書式は -save-temps と同じです。SOLID 環境では LLVM の最適化を使用していないので無意味です。

-Qunused-arguments

コンパイラドライバが使用しないオプションが渡された場合の警告を抑制します。

-working-directory <directory>

ワーキングディレクトリを <directory> に変更します。ワーキングディレクトリを変更すると、例えばコマンドラインで指定されたファイル foo.c<directory>/foo.c と解決されます。

-mllvm <option>

LLVM(Clang のバックエンド)に <option> を渡します。<option> にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。

-Xclang <option>

Clang コンパイラに <option> を渡します。<option> にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。