libclangを使ってみる。

clangとは、LLVMをバックエンドとして使用するC、C++Objective-Cコンパイラです。

GCCとは何が違うかというと、コンパイルするだけではなくてIDEのように定義元にジャンプとか補完といった機能が作り易いように設計されています。

実際XCode 4にはこのclangが使われているらしい。

これらの機能はclangバイナリを直接実行することで使用できるが、そのままだと遅いのでlibclangという専用のライブラリが用意されている。

今回はこのlibclangをちょっと触ってみる。

まずはclangを下のページ見ながらインストール

http://clang.llvm.org/get_started.html

無事インストールできたら早速使ってみたいが、とにかくドキュメントがない。どうやら唯一のサンプルはllvm/tools/clang/tools/c-index-test.cだけみたいだ。後はPythonバインディングが用意されているのでそのサンプルが少しあるけど、できればRubyから使いたい。とりあえずc-index-testを実行して定義元にジャンプの機能を使ってみる。

$ clang -lclang c-index-test.c
$ ./c-index-test -cursor-at=/Users/shinichi/programming/llvm/tools/clang/tools/c-index-test/c-index-test.c:1840:14 c-index-test.c

上の例はc-index-test.cの1840行14列にカーソルがある状態で定義元にジャンプの機能を実行しろという意味になる。結果は以下のようになった。

MemberRefExpr=argc:1825:7 SingleRefName=[1840:15 - 1840:19] RefName=[1840:15 - 1840:19]

ちゃんとthread_info構造体のargcメンバの位置が結果として表示されている。素晴らしい!!

せっかくだからlibclang使ってRedcar用のC/C++/Objectve-Cプラグイン作ろうかな~。