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