高度なオプション
ここでは 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
https://releases.llvm.org/7.1.0/tools/clang/docs/ReleaseNotes.html
The optimization flag to merge constants (-fmerge-all-constants) is no longer applied by default.
- -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>
にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。