llvm

ちょっと llvm に興味があったんだがなかなか進展しなかった。
OSX だと macports に llvm, llvm-gcc があるな。 debian だと sid オンリー。さらに会社の某所だと、野良 build かバイナリ転がすか・・・。 gcc フロントエンドの build が微妙にうまく通らないんだよな・・・。

Cのコードだと特に問題ないが、 C++ で書いただけで何故かハマる。 header と libstdc++ のパスを明示してやってやっと通る。

yagimac{yagi(s000)}2316: cat ttest.cc                                    zsh
#include 

int main(void) {
  std::cout << "TEST" << std::endl;
}
yagimac{yagi(s000)}2317: cat Makefile                                    zsh
CXX1=g++-mp-4.2
CXX2=llvm-g++-4.2 -I/usr/include/c++/4.0.0/i686-apple-darwin9/ -L/usr/lib/gcc/i686-apple-darwin9/4.0.1 -emit-llvm

all: ttest ttest.bi

ttest: ttest.cc
        $(CXX1) -o $@ $<

ttest.bi: ttest.cc
        $(CXX2) -o $@ -c $<


test:
        echo "native"
        ./ttest
        echo "via lli"
        lli ttest.bi
yagimac{yagi(s000)}2318: make all                                        zsh
g++-mp-4.2 -o ttest ttest.cc
llvm-g++-4.2 -I/usr/include/c++/4.0.0/i686-apple-darwin9/ -L/usr/lib/gcc/i686-apple-darwin9/4.0.1 -emit-llvm -o ttest.bi -c ttest.cc
yagimac{yagi(s000)}2319: make test                                       zsh
echo "native"
native
./ttest
TEST
echo "via lli"
via lli
lli ttest.bi
TEST
yagimac{yagi(s000)}2320: file ttest ttest.bi                             zsh
ttest:    Mach-O executable i386
ttest.bi: data

llvm-ld でリンクできる。

yagimac{yagi(s000)}2331: make all                                        zsh
llvm-ld -o ttest2 ttest.bi
yagimac{yagi(s000)}2332: make test                                       zsh
echo "native"
native
./ttest
TEST
echo "via lli"
via lli
lli ttest.bi
TEST
echo "direct"
direct
./ttest2
TEST
yagimac{yagi(s000)}2333: file ttest2*                                    zsh
ttest2:    Bourne shell script text executable
ttest2.bc: data
yagimac{yagi(s000)}2334: cat ttest2                                      zsh
#!/bin/sh
lli=${LLVMINTERP-lli}
exec $lli \
    $0.bc ${1+"$@"}

16:56:06 - 10.04.08 - kuroyagi - その他雑記 - 4351x