2013年06月27日

GCC のプラグインを作ってみる

昨日の記事で GCC 4.7 をインストールしたので、ついでに Plugins 機能を試してみました。



環境は、同じく Ubuntu Linux 12.04 64bit で、PPA レポジトリに apt-get のパスが通っていることと、GCC 4.7 がインストール済みであることを前提にします。

プラグインをビルドするためには、GCC のヘッダなどが必要です。Ubuntu の PPA から apt-get でインストールできたので、非常に楽でした。ヘッダのパスは -print-file-name=plugin で確認できます。
$ sudo apt-get install gcc-4.7-plugin-dev
$ gcc-4.7 -print-file-name=plugin
/usr/lib/gcc/x86_64-linux-gnu/4.7/plugin
(プラグインをサポートしてないバージョンの GCC や、プラグインの SDK がインストールされていない場合、単に "plugin" としか表示されません。これで Makefile 中などでエラーチェックができそうです。)

追記: プラグインは GCC 4.5 から gcc-4.5-plugin-dev をインストールすれば使えるようです。PPA は不要で、素の Ubuntu の GCC でも動きそうです。(未確認)
まずは、以下のような、何もしない、最小限のプラグインを書いてみました。(test_gcc_plugin.c)
#include "gcc-plugin.h" /* must be the first */
#include "tm.h"         /* main_input_filename */

#include <stdio.h>

int plugin_is_GPL_compatible;

/* gcc_data  - event-specific data provided by GCC
   user_data - plugin-specific data provided by the plug-in.  */
void test_callback(void *gcc_data, void *user_data)
{
    printf("enter %s()\n", __func__);
    printf("main_input_filename: %s\n", main_input_filename);
}

int plugin_init(struct plugin_name_args *info, struct plugin_gcc_version *version)
{
    if (info != NULL) {
        printf("base_name: %s\n", info->base_name);
        register_callback(info->base_name, PLUGIN_ALL_PASSES_START, test_callback, NULL/* user_data */);
    }
    return 0;
}
以下のようにしてコンパイルし、gcc-4.7 に読み込ませると、とりあえずちゃんと動いていることが確認できました。(コンパイルする C ファイルは何でも構いません。)
$ gcc-4.7 -I`gcc-4.7 -print-file-name=plugin`/include -fPIC -shared -O2 test_gcc_plugin.c -o test_gcc_plugin.so
$ gcc-4.7 -fplugin=./test_gcc_plugin.so test.c
base_name: test_gcc_plugin
enter test_callback()
main_input_filename: test.c
GCC の内部構造に触りたい時、本体に patch を当ててビルドする必要が無いので、これはとても楽ですね!

トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード