CygwinでLLVMのlliが動かない(その1)

Linux (Debian Lenny)では"Hello World"が動くのを確認できた。

まー、これでLinux上で遊べばいいのだが、やっぱりCygwinで動かないのは気になる。

再現率は100%だし、数日前に、「ソースコードを快適に読むための GNU GLOBAL 入門 () () ()」なんてのを読んだのもあって、C++をほとんど知らんにもかかわらず、いきなり追跡モードに。

まず、

> lli test/ExecutionEngine/hello.bc 
ERROR: Program used external function 'puts' which could not be resolved!
Aborted

が出る原因は、「http://d.hatena.ne.jp/jmax/20090311/p1」のコメントに書かれていた通り、dlopenのライブラリ名にNULLが渡されると正常に動作しないこと。細かいことを言うと、CygwinのdlopenにNULLを渡すと、cygwin1.dllのものとは異なるよくわからないアドレスが返って来るようだ。

この問題を解消するには、DynamicLibrary::LoadLibraryPermanentlyで、FilenameがNULLならcygwin1.dllに置き換えるのが良いと思う。

で、この問題が解決すれば動くだろう、と思ったら……。

assertion "Inserted && "Pass registered multiple times!"" failed: file "Pass.cpp", line 149

orz よくわからんのでデバッガで追い掛けてみたのだが、やっぱりわからず。printfならぬcerrを突っ込んで検証してみると、lib/VMCore/PrintModulePass.cppの以下の行:

static RegisterPass<PrintModulePass>
X("print-module", "Print module to stderr");

が2回実行されて落ちているらしい。ちょっと待て、static!? 何故2回実行されるんだ。

というところまでで本日は時間切れだが、この問題、(スキル不足で)解消できなさそーな気がしてきた……。