高度なオプション¶
ここでは SOLID が使用しているオプション のそれぞれの項目について、より発展的なオプションを紹介します。このドキュメントに記載されていないオプションは未サポートとなります。
注釈
ABI が変わり SOLID 環境が提供するライブラリとリンクできなくなる、SOLID-IDE との連携に問題が生じる、SOLID 環境がより良い手段を提供している等の理由により、SOLID 環境では使用できないオプションを除外しています。(一部、一般的によく使われるものの、SOLID 環境で使用してはいけないオプションを「禁止」と明記して記載しています。)また、「非推奨」や「obsolete」(過去には有用だったが現在では無意味)、「deprecated」(将来的に削除予定)と書かれているオプションは、特別な理由が無い限り使用しないでください。
重要
必要なオプションは基本的に SOLID-IDE のプロジェクトファイルにて指定済みなので、通常はここに書かれているオプションを指定する必要はありません。また、オプションを追加する際には、ビルド構成に適しているかどうかを考慮してください。例えば Debug_clang などのデバッグビルド構成に誤って -O2 などの最適化オプションを追加してしまうと、ビルド構成が正しく機能しなくなってしまいます。
GCC と Clang の共通オプション¶
同名のオプションが存在し、似たような動作を行うという所まで確認済みです。細部の動作まで一致することを保証するものではありません。
全体オプション¶
- -E¶
プリプロセスのみを行います。
- -S¶
プリプロセスとコンパイルのみを行います。(アセンブルは行いません。)
- -v¶
実行するコマンドの詳細情報を出力します。(コマンドを実行します。)メインファイルが指定されなかった場合は、コンパイラドライバに関する情報を出力して終了します。ライセンスが正しく設定されているかなど、コンパイラの動作チェックにも使用されます。
- -###¶
実行するコマンドの詳細情報を出力します。(コマンドを実行しません。)
- --help¶
指定可能なオプションのリストを出力します。Clang は
-helpも指定可能です。
- --version¶
バージョン情報を出力します。
- -pipe (禁止)¶
中間結果をファイルではなくパイプで次のツールに渡します。UNIX 環境では処理の高速化のためによく使われるオプションですが、SOLID 環境では使用してはいけません。(Windows 環境ではもともと正しく動作しませんし、SOLID は様々な理由により IDE 内部で中間ファイルを使用する場合があります。)
ディレクトリオプション¶
- -B <DIRECTORY>, --prefix=<DIRECTORY>, --prefix <DIRECTORY> (禁止)¶
コンパイラドライバがリンカーなどのサブプログラムやスタートアップ・ファイル、コンパイラランタイムライブラリを検索する際のディレクトリリストに
<DIRECTORY>を追加します。GCC の場合は、本オプション、GCC_EXEC_PREFIX環境変数の順に検索し、そこで見つからなかった場合はCOMPILER_PATH環境変数で指定されたディレクトリリストを検索します。exeGCC はCOMPILER_PATH環境変数を使用しています。(Clang にはこれらの環境変数は存在しません。)SOLID ツールチェーンは独自のディレクトリ構造になっているため、これらのオプションや環境変数は使用しないでください。
- -I-, --include-barrier (禁止)(deprecated)¶
本オプションよりも前に
-Iで追加されたディレクトリ群は#include "file"(二重引用符)の形式で include された場合のみ検索対象となり、#include <FILE>(鍵括弧)の場合は検索されません。また、本来は最優先となる、ソースファイルが存在するディレクトリを#include "file"の検索対象から外します。本オプション以後に指定された-Iは通常通りの動作となります。将来的に廃止予定なので、新規のプロジェクトでは-iquoteを使用してください。(Clang では廃止されました。エラーになります。)
- -imacros <FILE>, --imacros <FILE>, --imacros=<FILE>¶
基本的には
-includeと同じ動作になりますが、<FILE>内のマクロ定義のみをプリプロセス処理に追加します。(ファイルの内容は一切追加されません。)この追加は-includeを含む、全ての#includeに優先します。
- -iprefix <DIRECTORY>, --include-prefix <DIRECTORY>, --include-prefix=<DIRECTORY>¶
-iwithprefix/-iwithprefixbeforeのためのプレフィックス<DIRECTORY>を指定します。<DIRECTORY>の最後はパスの区切り文字(/か\)で終了してください。
- -iquote <DIRECTORY>¶
#include "file"(二重引用符 = quote)の検索パスに<DIRECTORY>を追加します。(#include <FILE>の場合は対象になりません。)もし<DIRECTORY>が=で開始する場合は、=を sysroot(--sysrootと-isysrootを参照)で置き換えます。
- -isysroot <DIRECTORY>¶
ヘッダファイルを検索する際のルートディレクトリに
<DIRECTORY>を指定します。--sysrootに似ていますが、本オプションはヘッダファイルのみが対象となります。
- -isystem <DIRECTORY>¶
システムインクルード検索パスのリストの先頭に
<DIRECTORY>を追加します。-Iとほとんど同じですが、システムインクルード検索パスは-Iで追加されたリストの次に検索される点と、見つかったヘッダファイルがシステムヘッダ扱いとなる点が異なります。コンパイラや多くのツールはシステムヘッダを信頼できるものとし(例えば多くの警告を抑制する等)特別扱いします。(システムインクルード検索パスを-Iオプションで書き換えてしまうと混乱が生じるため、システムインクルードパスと同名のパスが-Iで指定された場合は無視されます。)本オプションは、通常は使用しないでください。
- -iwithprefix <DIRECTORY>, --include-with-prefix <DIRECTORY>, --include-with-prefix-after <DIRECTORY>, --include-with-prefix-after=<DIRECTORY>, --include-with-prefix=<DIRECTORY>¶
<DIRECTORY>に-iprefixで指定されたプリフィックスを連結したディレクトリをシステムインクルード検索パスの最後に追加します。(-idirafterと同様。)
プリプロセッサオプション¶
- -C, --comments¶
プリプロセッサ出力にソースコード中のコメントを残します。
- -fdollars-in-identifiers (非推奨)¶
ソースコード中の識別子に
$を使用可能にします。デフォルトは使用できません。(-fno-dollars-in-identifiers)
- -H, --trace-includes¶
ヘッダファイルの include 依存関係を出力します。
- -MD, --write-dependencies¶
Makefile の書式で、ヘッダファイルの依存関係を出力します。(デフォルトの出力先は標準出力で、
-MFで変更可能です。)以下の-Mで始まるオプション(M 系オプション)は Makefile を使う場合にのみ有用で、SOLID-IDE 使用時は不要です。
- -MG, --print-missing-file-dependencies¶
-MM、-Mでヘッダファイルの依存関係のみを調べる際、デフォルトではファイルが見つからなければエラーになりますが、本オプションを指定するとエラーにはせず、依存関係に追加します。(make の途中でヘッダファイルが生成される場合等で使用されます。)
- -MP¶
メインファイル以外の依存するファイルを Makefile の phony ターゲットとして出力します。(不要になったヘッダファイルを削除した際のビルドエラーを防ぐことができます。)
- -MT <TARGET>¶
通常、
foo.cファイルに対して M 系オプションで依存関係を出力した場合、ターゲット名はfoo.oのようになりますが、それを<TARGET>に変更できます。
- -traditional-cpp (obsolete)¶
標準化される前の C コンパイラのプリプロセッサの動作をエミュレートします。
- -trigraphs (禁止)(obsolete)¶
トライグラフシーケンスを有効にします。
-stdオプションで gnuXXX 以外を指定するか、本オプションを指定時以外は、トライグラフシーケンスは解釈されません。トライグラフは SOLID がサポートする英語と日本語環境では無意味な上、C++17 では仕様から削除されます。IDE の解析を妨げるので、以下のような表記は、使用しないでください。トライグラフの一覧(使用禁止)¶ トライグラフの表記
表される文字
??=#??([??/\??)]??'^??<{??!|??>}??-~
- -undef¶
ターゲットやコンパイラ固有の事前定義マクロを
#undefします。__STD_*等、言語仕様で定義されるマクロは残ります。
- -Wp,<OPTION>¶
プリプロセッサに
<OPTION>オプションを渡します。<OPTION>がカンマ(,)を含む場合、カンマで分割して複数のオプションとして渡します。
- -Xpreprocessor <OPTION>¶
プリプロセッサに
<OPTION>を渡します。<OPTION>にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。
コンパイラオプション¶
C 言語オプション¶
- -ansi, -std=<STANDARD>¶
コンパイルの際に使用する言語標準を指定します。 参照: C/C++ の言語規格について
- -fno-asm¶
asm、inline、typeofをキーワードとして認識しないようにします。(通常の識別子として扱われます。)本オプションを指定した場合でも、__asm__、__inline__、__typeof__は使用可能です。C++ では、asmとinlineは言語仕様に含まれていてtypeofのみが対象となるため、-fno-gnu-keywordsを指定する方が意味的に適切です。C99 ではinlineが言語仕様に含まれているのでasmとtypeofのみが対象となります。-stdオプションでgnu*以外を指定した場合、本オプションは暗黙的に指定されます。
- -ffreestanding (禁止)¶
組み込みではよく使われるオプションですが、SOLID は OS があるホスト環境であり、フリースタンディング環境ではないので、使用しないでください。
- -fgnu89-inline¶
c99 以降でのみ有効。gnu89 のインラインセマンティクスを使用します。以下のような動作となります。
static inline共通。通常の static 関数と同じ。(全てインライン展開された場合、関数の実体が消滅。)
- 非
inline修飾プロトタイプあり 共通。関数の実体は必ず残る。
inline関数の実体は必ず残る。(c99 セマンティクスでは必ず消滅。)
extern inline関数の実体は必ず消滅。(c99 セマンティクスでは必ず残る。)
- -fno-builtin¶
全てのビルトイン関数最適化を抑制します。
- -fno-builtin-<FUNCTION>¶
ビルトイン関数
<FUNCTION>の最適化を抑制し、<FUNCTION>関数が確実に呼び出されるようにします。例えば-fno-builtin-printfを指定するとprintf("XXX\n")をputs("XXX")に変換するような最適化を行いません。
C++ 言語オプション¶
- -fno-access-control (非推奨)¶
C++ のアクセス制御(
classのprivate等)を無効にします。クラスの単体テスト等、特別な目的以外では使用しないでください。
- -fno-elide-constructors (非推奨)¶
C++11 で許可された特定条件化でのオブジェクトのコピーの省略(最適化)を禁止し、必ずコピーコンストラクタが呼ばれるようにします。
- -fno-operator-names¶
C++ のオペレータの同義語として
and/bitand/bitor/compl/not/or/xorを使うことを禁止します。
- -fno-rtti¶
C++ の RTTI 情報の生成を禁止します。
- -fsized-deallocation¶
C++14 で導入されたサイズ付きデアロケーションを有効にします。GCC では C++14 以降でデフォルト有効ですが、Clang は本オプションを付けない限り有効になりません。(s008 の LLVM 18 まで。LLVM 19 からはデフォルト有効になります。)
インライン関数やクラスのインラインメンバの可視属性を
hiddenに設定します。可視属性を設定する意義は-fvisibilityオプションを参照してください。
警告オプション¶
- -fsyntax-only¶
プリプロセス、構文チェック、型チェックのみを行います。(コンパイルが通ることのみ確認。コンパイルは行いません。)
- -Wpedantic¶
C/C++ 標準に含まれない、コンパイラの拡張機能を無効にし、使用した場合は警告を出します。ただし本オプションは、標準に準拠したプログラムであることを保証するものではありません。例えば
int _Foo = 0;やint __foo = 0;というプログラム片は、規格により予約されていて、ユーザーコードが使用することはできない、アンダースコアから始まり、その直後に大文字またはアンダースコアがある名前を使用しているので規格違反ですが、本オプションでは検出できません。
- -pedantic-errors¶
-Wpedanticと似ていますが、コンパイラの拡張機能を使用した場合はエラーとして扱います。
デバッグオプション¶
- -g1¶
最小限のデバッグ情報(バックトレースに使用する関数と大域変数の行番号情報のみ)を出力します。ローカル変数のデバッグはできません。
- -g3¶
マクロ展開に関する情報等を出力します。非常に大量のデバッグ情報(主に文字列)が出力され、ELF のサイズが肥大化します。
- -gdwarf-5 (非推奨)¶
DWARF Version 5 規格のデバッグ情報を生成します。exeGCC s007(GCC 10.3.0)ではまだ実験的サポート段階なので使用しないでください。(Clang の本来のデフォルトですが、exeClang はパッチを当て、デフォルトを -gdwarf-4 に変更しています。)
最適化オプション¶
- -ffast-math (非推奨)¶
誤差よりも速度を優先し、生成されるコードが C/C++ の仕様(IEEE 仕様)に準拠しない動作となりますが、強力な浮動小数点数の最適化を行います。誤差対策が成されたコードでのみ、自己責任で使用してください。本オプションが必要となる代表的な状況は(IEEE 754 仕様に完全には準拠していない) ARM の NEON 命令をコンパイラに生成させたい場合となります。ただし一般的には NEON 命令等の特殊な高速化命令はプログラマが手書きしなければ十分な効果が得られないため、本オプションを使用する機会は限られたものとなるでしょう。この最適化はいかなる最適化レベルでも有効になりません。
- -finline-functions¶
全ての関数をインライン展開の対象とします。(必ず展開されるわけではありません。)
- -fmerge-all-constants (非推奨)¶
本オプションを指定すると
-fmerge-constantsも有効になり、基本的に同じ動作となりますが、コンパイル単位を超えて有効な点と、文字列以外(例えば初期化時に使用される配列定数等)のポインタが指す定数オブジェクトにも適用される点が異なります。-fmerge-constantsと同様に本オプションはプログラムを規格不適合にし、その影響はさらに大きくなるため、いかなる最適化レベルでも有効になりません。注釈
Clang 6.0 まで本オプションは最適化時にデフォルトで有効だったため、
-fno-merge-all-constantsで無効化しないと正しくコンパイルできないケースが実際にありました。https://lkml.org/lkml/2018/3/20/872
The optimization flag to merge constants (-fmerge-all-constants) is no longer applied by default.
—https://releases.llvm.org/7.1.0/tools/clang/docs/ReleaseNotes.html
- -fsigned-zeros¶
IEEE 仕様に従い +0.0 と -0.0 を区別した浮動小数点数演算を行います。(デフォルト)
- -fno-signed-zeros¶
浮動小数点数 0.0 の符号を無視した最適化を行います。
- -frounding-math, -fno-rounding-math¶
浮動小数点数の丸めモードを
FE_TONEARESTに仮定した最適化を行いません。デフォルトは-fno-rounding-mathで、FE_TONEARESTに仮定した最適化を行います。そのため以下のような fenv.h 関数のサンプルコードが最適化有効時に期待通り動作しません。
- -freciprocal-math (非推奨)¶
除算の特殊な最適化を有効にします。例えば
x/yはx * (1/y)に置き換えられ、この部分式1/yに対して共通部分式除去等の最適化が可能になる場合があります。ただし、この最適化を行うと精度が低下してしまう恐れがあるので、デフォルトでは行いません。(-fno-reciprocal-math)
- -funroll-loops¶
コンパイル時に繰り返し回数が決定しているループ処理を展開します。
- -fno-unroll-loops¶
ループ展開をしません。(デフォルト)
- -Ofast (非推奨)(deprecated)¶
標準規格に準拠しない最適化を行います。(
-ffast-mathなど、-O3でも有効にならない最適化を有効にする。)Clang 19 から deprecated になったので、もし本オプションを使用したい場合は、代わりに-O3 -ffast-mathを指定してください。
コード生成オプション¶
- -fcommon¶
変数を ELF ファイル中のどのセクションに配置するかは、C/C++ の言語仕様の範囲外です。多くのコンパイラでは、初期値のある大域変数は
.dataセクション、0 初期化された大域変数は.bssセクションに配置されます。GCC と Clang は、未初期化の大域変数をとりあえず common(.comm)セクションに配置し、GNU ld リンカー(およびその互換リンカー)が最後にまとめる(多重定義エラーにならない)という処理を行います。s005 以前のデフォルトです。(s006 以降は-fno-commonの解説を参照。)
- -fno-common¶
本オプションを指定した場合、未初期化の大域変数は
.bssセクションに配置されます。(-fcommonの解説を参照。)必ず 1 つの大域変数だけが非extern宣言で、他は全てextern宣言である必要があります。注釈
s006 以降(GCC 10/Clang 12 以降)のデフォルトです。これは非互換の変更なので、s005 以前はビルドできていたプロジェクトでリンクエラーが発生する可能性があります。その場合は適切にソースコードを修正するか、修正できない場合は
-fcommonを指定してプロジェクト全体をリビルドしてください。
- -ffixed-<reg>(非推奨)¶
<reg>レジスタを予約し、使用しません。GCC は<reg>に任意のレジスタを指定可能(マニュアルに制限の記載無し)ですが、Clang は以下のパターンのみ使用可能(マニュアルに記載あり)です。AArch64/RISC-V
x1 から x31 まで。
ARM
r9
使用するレジスタによっては ABI を破壊する可能性があるので、呼び出し規約で引数や戻り値等に使用するレジスタ、スタックポインタ等固定用途レジスタは指定しないでください。
- -fno-jump-tables (非推奨)¶
switch 文をコンパイルする際にジャンプテーブルを生成しません。
- -ftrapv (非推奨)¶
符号付き整数の加減乗算でオーバーフロー、アンダーフローの検出を行います。GCC は命令を生成する代わりに libgcc の関数を呼び出してチェックを行うので、動作は libgcc の実装に依存します。(SOLID 環境では検出時に
abort()を呼び出します。)Clang ではチェックコードを生成し、デフォルトでは検出時に未定義命令を実行して例外を発生させます。Clang でのみ、-ftrapv-handler=関数名で任意の関数を呼び出すように指定可能です。非常にパフォーマンスが低下するのでデバッグ時以外には指定しないでください。
- -fwrapv¶
例えば
if (i+1 > i)という比較は数学的には常に成り立つので、デフォルト(-fno-wrapv)では削除(最適化)されます。しかしコンピュータ上では 2 の補数表現を使用するため、iの型がintで値がINT_MAXの場合 wrap around して 0 となり、この比較は偽になる可能性があります。本オプションは整数がオーバーフローしないということを前提にした最適化を抑制します。(デフォルトは-fno-wrapvで、常に整数がオーバーフローしないことを前提とした最適化を行います。)
- -fverbose-asm¶
-S指定時や-save-temps時に出力されるアセンブラソースにコメントを出力します。
AArch64 専用オプション¶
- -momit-leaf-frame-pointer¶
leaf 関数(他の関数を呼び出さない関数)のためのフレームポインタの保存を省略します。デフォルトは
-mno-omit-leaf-frame-pointerで常に保存します。
ARM 専用オプション¶
- -mlong-calls¶
関数呼び出しを、レジスタに 32bit 絶対アドレスをロードした後にブランチするコードにコンパイルします。ブランチ先が± 64 MB を超える場合、オフセットアドレスベースのブランチはリンクに失敗する場合があり、その際に指定します。デフォルトは
-mno-long-calls(通常のコンパイル)です。
- -mrestrict-it¶
Thumb コード生成時、ARMv8-A で deprecate された形式の IT ブロックを生成しません。ARMv8 Thumb モードではデフォルトです。(何らかの理由で生成する場合は
-mno-restrict-itを指定。)
開発者オプション¶
- -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=<ARG>¶
<ARG>はcwd,objのいずれか。コンパイルの中間結果をファイルとして残します。
cwdの場合はカレントワーキングディレクトリ(Current Working Directory)にファイルを生成し、objの場合は-oで指定されたファイルと同じ場所に生成します。=指定を省略時はcwdとなります。
- -time (未サポート)¶
コンパイル、アセンブル、リンクにかかった時間を出力します。Windows 環境では無視されます。
アセンブラオプション¶
- -Wa,<OPTION>¶
アセンブラに
<OPTION>オプションを渡します。<OPTION>がカンマ(,)を含む場合、カンマで分割して複数のオプションとして渡します。
- -Xassembler <OPTION>¶
アセンブラに
<OPTION>を渡します。<OPTION>にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。
リンカーオプション¶
- -Xlinker <OPTION>¶
リンカーに
<OPTION>を渡します。<OPTION>にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。
- -z <KEYWORD>¶
リンカーに
<KEYWORD>を渡します。SOLID 環境で指定可能な値は GNU ld の-zオプションと同じです。
GCC のみ指定可能なオプション¶
注釈
長い歴史を持つ GCC は互換性を保つために膨大なオプションを指定可能になっており、このドキュメントで全てをカバーすることはできません。また、SOLID 環境の、2 種類のコンパイラをサポートするという優れた特徴を崩さないためにも、基本的に Clang でのみ使用可能なオプションの代替と成るオプションのみをここでは載せています。
- -gstabs, -gstabs+ (非推奨)(obsolete)¶
stabs 形式のデバッグ情報を出力します。SOLID のデバッガはサポートしていますが、現在の GCC や Clang の高度な最適化を表現するには力不足な古い規格で、満足なデバッグができません。
- -fmerge-constants¶
コンパイル単位内の同一の値を持つ文字列や浮動小数点数などの定数をマージ(単一の実体を参照するように最適化)します。最適化有効時(
-O1,-O2,-O3,-Os)にデフォルトで有効になります。コンパイル単位を超える最適化は-fmerge-all-constantsで行うことができ、こちらは GCC/Clang 両方で使用できます。注釈
C 規格では、異なるポインタ変数が指す定数オブジェクトは、異なるアドレスを参照しなければいけないため、ポインタが指す定数オブジェクトのマージを認めていません。本オプションは文字列定数に限定されているため比較的影響は少ないと思われますが、規格に厳密なコードを開発したい場合は
-fno-merge-constantsを指定してください。
Clang のみ指定可能なオプション¶
注釈
Clang は GCC とは異なる設計思想を持ち、コンパイラ・アセンブラとしてだけではなく、IDE の入力補完やソースコード解析ツールへの応用が可能な設計になっていて、実際に SOLID の IDE でも使用しています。そのため警告やエラーメッセージ等の様々な設定(diagnostics)や、ソースコードの様々な解釈を可能とする豊富なオプションを指定可能ですが、SOLID 環境では、あらかじめ IDE との連携を考えて、最適と思われるそれらのオプション指定を自動的に行うようになっています。ユーザーがそれらのオプションを任意に追加した場合、IDE での対応が難しいため、本ドキュメントでは問題が起こる可能性があるオプションは載せておりません。
- -emit-llvm¶
-Sと同時に指定された場合は LLVM IR(コンパイラの中間表現)をテキスト形式、-cと同時に指定された場合はバイトコード形式で出力します。LLVM IR のテキスト表現にはコンパイラがプログラムをどのように解析したかという結果が全て記述されているので、デバッグ時に有用な場合があります。
- -stdlib=<ARG>, --stdlib=<ARG>, --stdlib <ARG> (禁止)¶
<ARG>はlibstdc++,libc++,platformのいずれか。C++ 標準ライブラリを選択します。exeGCC は libstdc++、exeClang は libc++ に固定で変更はできないため、指定しないでください。
- -unwindlib=<ARG>, --unwindlib=<ARG>(禁止)¶
<ARG>はlibgcc,libunwind,platform,noneのいずれか。C++ 例外の実装に使用する unwind ライブラリを選択します。exeGCC は libgcc、exeClang は libunwind に固定で変更はできないため、指定しないでください。
- -rtlib=<ARG>, --rtlib=<ARG>, --rtlib <ARG>(禁止)¶
<ARG>はlibgcc,compiler-rt,platformのいずれか。コンパイラランタイムライブラリを選択します。exeGCC は libgcc、exeClang は compiler-rt(libclang_rt.builtins.<ARCH>.a)に固定で変更はできないため、指定しないでください。(exeGCC 付属の libcompiler_rt は、Clang をサポートするために libgcc に含まれていない compiler-rt の関数のみを抽出した特別版です。必ず libgcc と一緒にリンクしなければいけない仕様です。)
- -cxx-isystem <DIRECTORY>¶
C++ モードのシステムインクルード検索パスに
<DIRECTORY>を追加します。-isystemとの違いは C++ モードでのみ有効な点です。
- -faligned-allocation (exeGCC のみ禁止)¶
C++17 の aligned allocation 関数を有効にします。exeGCC は C++17 未サポートなので使用しないでください。(本オプションにより
std::aligned_alloc()を使用するとリンクエラーが発生します。)
- -fborland-extensions (禁止)¶
__pascal等の Borland 拡張を有効にします。Pascal(Delphi)をサポートしない SOLID 環境では無意味なので使用しないでください。
- -fno-cxx-exceptions¶
C++ の例外機能を無効にします。
-fno-exceptionsとの違いは C++ モードでのみ有効な点です。(C の時は無視されます。)
- -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¶
インラインアセンブラ内のコメントを取り除きます。
- -fstandalone-debug¶
コンパイル単位内で使用されていない型も含む、完全なデバッグ情報を出力します。(ヘッダファイルには大量の型情報が含まれますが、通常はその極一部しか使用されません。)デフォルトは、バイナリサイズ削減のため、コンパイル単位内で使用されている型のみデバッグ情報を出力する等、様々なデバッグ情報のサイズ最適化を行います。(
-fno-standalone-debug)
- -fpascal-strings (禁止)¶
先頭 1 バイトに文字数が入った Pascal 文字列を
"\pテキスト"のような書式でサポートします。Pascal(Delphi)をサポートしない SOLID 環境では無意味なので使用しないでください。
- -frelaxed-template-template-args (exeGCC のみ禁止)¶
C++17 のクラステンプレートのテンプレート引数推論を有効にします。exeGCC は C++17 未サポートなので使用しないでください。
- -fno-strict-return, -fstrict-return¶
-fno-strict-returnは、C++ モードで、非 void 関数の最後にreturnが無い場合でも、C と同様のコード(戻り値は未定義)を生成し、trap しません。デフォルトは unreachable として扱い trap 命令を生成する-fstrict-returnです。(Clang はテストで発見しやすいように、未定義挙動を含むコードを意図的に壊す傾向があります。)
- -fstrict-vtable-pointers¶
C++ オブジェクトの仮想関数テーブルについて厳格なルールを適用(例えば vptr はオブジェクトの生存期間中は不変)し、脱仮想関数化等の最適化を行います。
- -ftrap-function=<FUNCTION>¶
trap 命令を生成する代わりに関数
<FUNCTION>を呼び出します。trap 命令が生成される例は-fstrict-return等を参照してください。
- -fshow-overloads=<ARG>¶
<ARG>はbest,allのいずれか。関数オーバーロードの解決が失敗した時の候補の表示を指定します。デフォルトは
allです。
- -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 最適化を行います。これにより、レジスタの使用が最適化される可能性がありますが、デバッグ情報の混乱やリンカーによる最適化の阻害等の副作用もあります。アグレッシブな最適化
-O3,-Ofast,-Ozの時のデフォルトです。
- -mno-global-merge¶
global merge 最適化(
-mglobal-mergeを参照)を行いません。一般的な最適化-O0,-O1,-O2,-Osの時のデフォルトです。
- -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>にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。