libclangでMPIの関数を抽出してみた
手作業だとめんどくさいし、間違えそうだということでlibclangを使ってみました。
こんなファイルstub.cを用意して、
#include <mpi.h>
mpi_extractorに食わせると、MPI関数の名前、返り値の型、引数の型がCSVで出力されます。
$ ./mpi_extractor stub.c MPI_Abort,int,MPI_Comm,int MPI_Accumulate,int,void *,int,MPI_Datatype,int,MPI_Aint,int,MPI_Datatype,MPI_Op,MPI_Win MPI_Add_error_class,int,int * MPI_Add_error_code,int,int,int * MPI_Add_error_string,int,int,char * [略]
clang のライブラリの方で遊んでみた
clang のコンパイラではなく、ライブラリの方で遊んでみた。使用した clang(+LLVM) のバージョンは Subversion レポジトリより取得した r127064 。ちょっと古いが気にしない。
clangのライブラリの方のドキュメントが見つけられなかったので、主にclang tutorialを参考にした。しかしながら、clang tutorialが書かれたのは2008年であり、現在の clang ではコンパイルエラーになるコードもある。
今回作成したのは、main関数が引数を取るか取らないかを出力するプログラムである (clang::FunctionDecl::isMain関数を使えば、ある関数がmain関数であるかどうか判定できるので楽できる)。clang::CompilerInstanceの使い方がこれでいいのか、かなり自信がない。以下ソースコード。
コンパイルは以下のようにする*1。 ただし、$(LLVMDIR)はLLVMがインストールされているディレクトリを表す。
$ clang -std=c++0x -fno-rtti -Wall -I$(LLVMDIR)/include \ -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -o maintype maintype.cpp $(LLVMDIR)/lib/lib*.a
*1:どのライブラリをリンクすればいいのか、調べるのがめんどかったので、全部リンクすればいいよねっていう(ry