LLVMをWindowsXPのCygwinに入れる

DWMに掲載された(FPGA向けの)プロセッサ特集記事を見ていて,ハードウェア設計に終始していてソフトウェア開発環境が手薄すぎて,正直これでは使えないなーって思うことしばし.
そんなわけでThe LLVM Compiler Infrastructure Project

環境

OSはWindowsXPcygwinはバージョン 1.5.25-11.

Cygwinでパッケージのインストール

gnu make, gcc, texinfo, flex, bison, m4, autoconfi, automake, libttol, libiconv, diffutils の最新バージョンをインストール.

ソースコードの入手

http://llvm.org/releases/download.html#2.2から, llvm-2.2.tar.gz と llvm-gcc4.0-2.2.source.tar.gz を入手.
適当な作業ディレクトリにそれぞれ展開.

$ tar xzvf llvm-2.2.tar.gz
$ tar llvm-gcc4.0-2.2.source.tar.gz
展開とコンパイル

llvmコンパイル, /usr/local/llvm-2.2 にインストール.

$ cd llvm-2.2
$ ./configure --prefix=/usr/local/llvm-2.2
$ make
$ make install

llvm-gccコンパイル,展開したアーカイブREADME.LLVMを見てやるべきなのだけど,ちょっと勝手流に /usr/local/llvm-gcc-4.2-2.2 にインストール.

$ cd llvm-gcc4.2-2.2.source
$ mkdir work (作業ディレクトリ名は適当なものをつける)
$ cd work
$ ../configure --enable-languages=c,c++ --program-prefix=llvm- --enable-llvm=`pwd`/../../llvm-2.2/Release/
$ make
$ make install

先ほどコンパイルしたllvmの場所を指定する"--enable-llvm"オプションを忘れると,llvmの中間コードを出せない普通のgccができてしまう."--enable-llvm"は絶対パスで指定するために"pwd"コマンドを使っている.コマンドを囲うのは,シングルクオーテーションではなくてバッククオーテーション(シングルクオーテーションとは傾きの方向が逆のもの.私のキーボードでは@のキーの上にある)なので間違えないように注意.
コンパイルに数時間かかるみたいです.気長に待ちます.

動く?

Getting Started with the LLVM System — LLVM 9 documentationの手順で動作確認が取れればOK.

$ /usr/local/llvm-gcc-4.2-2.2/bin/llvm-gcc --emit-llvm hello.c -o hello.bc
$ /usr/local/llvm-2.2/bin/lli hello.bc
ERROR: Program used external function '__main' which could not be resolved!
Aborted

というわけでJITでは動きません.Mingw32のバイナリ版llvm-2.2でも動きません.ですがアセンブラへの変換や中間コードのダンプ(中間コードのバイナリからテキストへの変換)およびllvm-gccからネイティブな実行ファイルの作成は問題なくできます.
http://www.nabble.com/Question-on-link-error-td15494096.htmlのやり取りを見ると2.2がリリースされた後の2月15日の時点でこの問題は解決していないようで,2.3を待つかレポジトリから最新版を入手するかしなければいけないようです.このレベルで問題があるのとみると,よっぽどCygwinでの利用者は少ないのかもしれません.

次回

LLVMが出した中間コードをターゲットの機械語に変換するところまでいきましょう.

何も考えずに作業して遭遇したエラーのメモ書き

次に,llvm-gccコンパイルで,何も考えずにllvm-gcc4.2-2.2.source.tar.gz で:

$ cd llvm-gcc4.2-2.2.source
$ ./configure --enable-languages=c,c++,java; make
GNUmakefile:16: /CoreOS/Standard/Standard.make: No such file or directory
make: *** No rule to make target `/CoreOS/Standard/Standard.make'.  Stop.

ちゃんとドキュメントを読まないといけないです.作業ディレクトリを作りコンパイル
"--enable-languages"オプションが"c,c++,java"だとgc1.exeのリンクエラーで失敗.そのためllvm-gcc4.0-2.2.source.tar.gz で"c,c++"オプションにした.

H8のクロスコンパイル環境を構築したときの経験をすっかり忘れて役に立たない鳥頭なところ痛感.