高度なオプション

ここでは 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 と同様。)

-iwithprefixbefore <DIRECTORY>, --include-with-prefix-before <DIRECTORY>, --include-with-prefix-before=<DIRECTORY>

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

プリプロセッサオプション

-C, --comments

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

-CC, --comments-in-macros

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

-dD

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

-dI

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

-dM

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

-fdollars-in-identifiers (非推奨)

ソースコード中の識別子に $ を使用可能にします。デフォルトは使用できません。( -fno-dollars-in-identifiers

-H, --trace-includes

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

-MD, --write-dependencies

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

-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 で特別な意味を持つ文字($ 等)が含まれていた場合、適切にエスケープします。

-P, --no-line-commands

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

-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

asminlinetypeof をキーワードとして認識しないようにします。(通常の識別子として扱われます。)本オプションを指定した場合でも、__asm____inline____typeof__ は使用可能です。C++ では、asminline は言語仕様に含まれていて typeof のみが対象となるため、-fno-gnu-keywords を指定する方が意味的に適切です。C99 では inline が言語仕様に含まれているので asmtypeof のみが対象となります。-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++ のアクセス制御(classprivate 等)を無効にします。クラスの単体テスト等、特別な目的以外では使用しないでください。

-fno-elide-constructors (非推奨)

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

-fno-gnu-keywords

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

-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 からはデフォルト有効になります。)

-fvisibility-inlines-hidden (非推奨)

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

警告オプション

-fsyntax-only

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

-Wpedantic

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

-pedantic-errors

-Wpedantic と似ていますが、コンパイラの拡張機能を使用した場合はエラーとして扱います。

デバッグオプション

-g1

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

-g2

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

-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 関数のサンプルコードが最適化有効時に期待通り動作しません。

#pragma STDC FENV_ACCESS のサンプルコード

-freciprocal-math (非推奨)

除算の特殊な最適化を有効にします。例えば x/yx * (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 の時は無視されます。)

-fdebug-macro

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

-fdouble-square-bracket-attributes

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

-fno-double-square-bracket-attributes

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

-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 等の最適化で有効になります。

-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 等を参照してください。

-ftrapv-handler=<FUNCTION>

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

-fshow-overloads=<ARG>

<ARG>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 最適化を行います。これにより、レジスタの使用が最適化される可能性がありますが、デバッグ情報の混乱やリンカーによる最適化の阻害等の副作用もあります。アグレッシブな最適化 -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, 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> にスペースを含めることはできないので、その場合は複数回本オプションを指定してください。