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
プリプロセッサ出力にソースコード中のコメントを残します。
- -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
asm
、inline
、typeof
をキーワードとして認識しないようにします。(通常の識別子として扱われます。)このオプションを指定した場合でも、__asm__
、__inline__
、__typeof__
は使用可能です。C++ モードでは、asm
とinline
は標準仕様に含まれていてtypeof
のみが対象となるため、-fno-gnu-keywords
を指定する方が意味的に適切です。C99 モードではinline
が標準仕様に含まれているのでasm
とtypeof
のみが対象となります。-std
オプションでgnu*
以外を指定した場合、このオプションは暗黙的に指定されます。
- -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++ のアクセス制御(
class
のprivate
等)を無効にします。クラスの単体テスト等、特別な目的以外では使用しないでください。
- -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/y
はx * (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
(公開)です。
インライン関数やクラスのインラインメンバの可視属性を
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>
は3
か4
)オプションと必ずセットで指定してください。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 規格に準拠したデバッグ情報を生成する組み合わせを指定してください。
- -g1
最小限のデバッグ情報(バックトレースに使用する関数と大域変数の行番号情報のみ)を出力します。ローカル変数のデバッグはできません。
- -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 環境では通常は不要です。
- -MG, --print-missing-file-dependencies
-MM
、-M
でヘッダファイルの依存関係のみを調べる際、デフォルトではファイルが見つからなければエラーになりますが、このオプションを指定するとエラーにはせず、依存関係に追加します。(make の途中でヘッダファイルが生成される場合等で使用されます。)
- -MP
メインファイル以外の依存するファイルを Makefile の phony ターゲットとして出力します。(不要になったヘッダファイルを削除した際のビルドエラーを防ぐことができます。)
- -MT <target>
通常、
foo.c
ファイルに対して M 系オプションで依存関係を出力した場合、ターゲット名はfoo.o
のようになりますが、それを<target>
に変更できます。
- -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;
というプログラム片は、規格により予約されていて、ユーザコードが使用することはできない、アンダースコアから始まり、その直後に大文字またはアンダースコアがある名前を使用しているので規格違反ですが、このオプションでは検出できません。
- -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 の時は無視されます。)
- -fno-debug-macro
マクロ展開に関するデバッグ情報を出力しません。(デフォルト)
- -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
等を参照してください。
- -fshow-overloads=[ best | all ]
関数オーバーロードの解決が失敗した時の候補の表示を指定します。デフォルトは
all
です。
- -fvectorize
ループベクトル化最適化を行います。
-O2
以上の最適化時にはデフォルトで有効になります。
- -fwritable-strings (禁止)(obsolete)
文字列定数を
.data
等の書き込み可能なセクションに配置します。GCC は 4.0 でこのオプションを廃止しました。
- -iwithsysroot <directory>
システムインクルード検索パスのリストの先頭に
<directory>
を追加します。/AAA/BBB
のような UNIX パス形式の絶対パスが指定された場合、-isysroot
で指定されたディレクトリからの相対パスと解釈されます。
- --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, 0xffffff01
はadd 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>
にスペースを含めることはできないので、その場合は複数回このオプションを指定してください。