いけむランド

はてダからやってきました

autotools と -emit-llvm

とある事情で LLVM について調査をすることになったのだが、とりあえずいくつかコンパイルしてみた時に気づいたことをつらつらと書いてみる。


どうも configure (というか autotools) はあくまでも native compiler を前提としているのではないかという気がしている。*1 というのも、

% CC=llvmc CFLAGS=-emit-llvm LD=llvm-ld ./configure
  :
(snip)
  :
checking for suffix of object files... bc
  :

などとしてみて、make すると

make  all-recursive
make[4]: *** No rule to make target `hoge.bc', needed by `libhoge.a'.  Stop.
make[3]: *** [all-recursive] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

みたいにオブジェクトの拡張子が .bc ということを configure で認識しているのに、サフィックスルールが対応してくれなかったりする。

それを乗り越えて、いよいよリンクしようとすると今度は llvm-ld を呼び出す方法がわからない。
どうも近頃の autotools は「コマンドライン引数の組み合わせに応じて、何でも gcc が良きに計らってくれる」と思っているのか、リンクコマンドにも CC を使おうとするみたいである。

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@

llvmc に -emit-llvm を指定してみるが、結局呼ばれるのは native の ld になるっぽい。

% llvmc -v -emit-llvm -save-temps main.c
llvm-gcc -x c -O2 main.c -c -emit-llvm -save-temps -o main.bc 
llc -f -O2 main.bc -o main.s 
llvm-gcc -c -x assembler main.s -o main.o 
llvm-gcc main.o -o a.out 

clang でやってみたが同じだった。

% clang -v -emit-llvm -save-temps main.c
clang version 1.1 (branches/release_27)
Target: x86_64-apple-darwin10
Thread model: posix
 "/usr/local/clang+llvm-2.7-x86_64-apple-darwin10/bin/clang" -cc1 -triple x86_64-apple-darwin10.0.0 -E -disable-free -main-file-name main.c -pic-level 1 -mdisable-fp-elim -munwind-tables -target-cpu core2 -v -resource-dir /usr/local/clang+llvm-2.7-x86_64-apple-darwin10/lib/clang/1.1 -fmessage-length 80 -stack-protector 1 -fblocks -fdiagnostics-show-option -fcolor-diagnostics -o main.i -x c main.c
clang -cc1 version 1.1 based upon llvm 2.7 hosted on x86_64-apple-darwin10
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/clang+llvm-2.7-x86_64-apple-darwin10/lib/clang/1.1/include
 /usr/local/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/local/clang+llvm-2.7-x86_64-apple-darwin10/bin/clang" -cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm-bc -disable-free -main-file-name main.c -pic-level 1 -mdisable-fp-elim -munwind-tables -target-cpu core2 -v -resource-dir /usr/local/clang+llvm-2.7-x86_64-apple-darwin10/lib/clang/1.1 -fmessage-length 80 -stack-protector 1 -fblocks -fdiagnostics-show-option -fcolor-diagnostics -o main.o -x cpp-output main.i
clang -cc1 version 1.1 based upon llvm 2.7 hosted on x86_64-apple-darwin10
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/clang+llvm-2.7-x86_64-apple-darwin10/lib/clang/1.1/include
 /usr/local/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/libexec/gcc/i686-apple-darwin10/4.2.1/ld" -dynamic -arch x86_64 -macosx_version_min 10.6.0 -o a.out -lcrt1.10.6.o -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64 -L/usr/lib/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 -L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. main.o -lSystem -lgcc

何とか autotools でもうちょっと楽に lli + *.bc 形式をビルドできないものだろうか。

*1:実際は cross compiler もあるんだけど。