clangを試してみる。

clangは簡単にいうと、LLVM専用のフロントエンドでCとかC++とかが扱えるらしい。LLVM-GCCが上手くいかないので、こんどはこっちを試してみる。コンパイル方法についてはClang - Getting Startedを参照。

llvmコンパイル

まずは、LLVMsvnのrepoからもらってきてコンパイル

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm_trunk
cd llvm_trunk
./configure --prefix=$HOME/opt --enable-optimized --build=powerpc-unknown-linux-gnu
make -j2
make install

ちなみに取得したrevisionは54992。

clangをコンパイル

次にclangをsvnのrepoからもらってくる。

cd tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

チェックアウトしたrevisionは54998だった。

インストールガイドに指示がある通り、includeパスを直書きするため、gccの使っているインクルードパスを調べる。

touch empty.c
gcc -v empty.c -fsyntax-only
... 略 ...
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/powerpc-unknown-linux-gnu/4.1.2/include
 /usr/include
End of search list.
GNU C version 4.1.2 (Gentoo 4.1.2 p1.1) (powerpc-unknown-linux-gnu)
        compiled by GNU C version 4.1.2 (Gentoo 4.1.2 p1.1).
GGC heuristics: --param ggc-min-expand=44 --param ggc-min-heapsize=27323
Compiler executable checksum: 922ca30f21edbfcd351f4dd12b7e97b3

/usr/lib/gcc/powerpc-unknown-linux-gnu/4.1.2/includeが多分それなので、clang/Device/clang.cppの1095行目あたりに追加する。

    AddPath("/usr/lib/gcc/powerpc-unknown-linux-gnu/4.1.2/include", System,
            false, false, false, Headers);

後はてきとーにビルド。

cd clang
make
make install

実験。

そして実験。
なにもしないtest.cを作って、

int main(void)
{
	return 0;
}

コンパイルしてtest_llvm.sに出力する。

clang test.c -emit-llvm -o - | llvm-as | opt -std-compile-opts | llc -march=cellspu > test_llvm.s
cat test_llvm.s
	.text


	.align	3
	.global	main
	.type	main, @function
main:
	il	$3, 0
	bi	$lr
	.size	main,.-main

	.ident	"(llvm 2.2+) STI CBEA Cell SPU backend"

SPUのアセンブリが出てきた。