always_inline
奇妙な属性であり、非常に GCC 固有であり、おそらく GCC バージョン固有です (したがって、詳細な動作は GCC 4.5 と GCC 4.7 で同じではない可能性があります)。
GCC は多くの最適化パスを実行することで機能しています (-O0
これらのパスの一部が実行されていても、コードは発行されません)。通常、GCC-O1
コンパイルでは 200 の最適化パスが実行されます。
あなたgcc-4.7
のコードではコンパイルさえしないでください-O0
:
alw.c: In function ‘main’:
alw.c:7:5: warning: asm operand 1 probably doesn’t match constraints [enabled by default]
alw.c:7:5: error: impossible constraint in ‘asm’
GCC が何をしているかをより理解するために、それを実行するとgcc -fdump-tree-all
、ほとんどの GCC パスのいわゆる「ダンプ ファイル」(パスによって変換された内部表現の一部のテキスト表現) を取得できます。このようなダンプ ファイルは何百もあることに注意してください (悲しいことに、ダンプ ファイルの名前に含まれる数字は重要ではありません)。
なぜそんなことをしたいのか理解できません。マクロを作成するか、常に最適化することをお勧めします(最近の GCC は と の両方をtest
うまく処理します)。-g
-O1
考えられる代替手段は、プラグイン、またはより適切なMELT 拡張機能を使用して GCC を拡張することです (MELT は GCC を拡張するための高レベルのドメイン固有言語であり、GPLv3 ライセンスの GCC プラグインとして実装されます)。次に、test
関数を独自の GCCビルトインにすることができます。これは、GCC を拡張してビルトインとプラグマを追加できるためです。拡張機能は、特定のビルトインをインストールし、それらを適切に処理するためにいくつかの特定のパスを挿入します。(これは、GCC の内部をよく知っている場合でも、数日間の作業を意味します)。ビルトインは、通常、追加のターゲットプロセッサ固有の命令をインターフェイスするために使用されることに注意してください (ユース ケースと同様)。
最近の GCC (特に 4.6 と 4.7) はプラグインを受け入れます (プラグインが で構成されている場合--enable-plugins
)。gcc -v
特定の GCC がプラグインを受け入れているかどうかを確認してください。一部のディストリビューションは GCC プラグインのアイデアを好まないため (Suse やおそらく Redhat など)、GCC を受け入れるプラグインが含まれていません。
特定の Linux ディストリビューション (最近のもの) が GCC プラグインをまだサポートしていない場合は、バグ レポートを開いて、GCC 内でプラグインを有効にするようリクエストすることをお勧めします。GCC クロスコンパイラのサプライヤがプラグインをサポートしていない場合は、その機能を照会することもお勧めします。この機能は、数年前から FSF GNU Gcc に存在します (4.5 など)。
Debian または Ubuntu では、gcc-4.6-plugin-dev
orgcc-4.7-plugin-dev
パッケージをインストールすることをお勧めします。その後、 MELTプラグインをビルドして使用できるようになります (GCC 4.6 & 4.7 用の MELT 0.9.6 をすぐに、つまり 2012 年 7 月にリリースする予定です)。
GCC 4.6 または 4.7 を搭載した最新のディストリビューション (Debian、Ubuntu、Mandriva、ArchLinux など) には、プラグインで拡張可能な GCC があります。MELT はそのようなプラグインです (メタプラグインです。なぜなら、melt.so
それ自体がいくつかのことを行っているからですdlopen
)。プラグインを受け入れる GCC があり、いくつかのプラグイン (MELT など) をインストールするgcc -fplugin=melt
と、他のプラグイン固有のオプション ( MELT-fplugin-arg-melt-mode=
の your-melt-modeなど) を使用するだけで実行できます。