きりかノート 3冊め

おあそびプログラミング

Clangでruby-1.8.7をコンパイルしてみる

サポート外なのは承知の上なのです…

いつまでもApplegcc-4.2 (NOT LLVM)に頼ってるのも不安なので、ここ数日いろいろ試してみた。とりあえずまとめ。

Xcode clang 結果
4.3.3 3.1 -O0 -std=c89ならOK
4.2.1 3.0 (同上)
4.1 2.1 動作しない
  • ruby-1.8.7-p358|p369
  • Mac OS X 10.7.3
  • clangのバージョンは"Apple clang version 3.1"などの数字。

make test-allがgcc-4.2と同等にパスすることをOKと定義して、Xcode 4.2以降のclangでCFLAGS="-O0 -std=c89"とした場合はOKになる。

最適化した場合

最適化した場合に起きる問題をいくつかリストアップ。

make途中で[BUG]。以下のエラーで死ぬ。

   /usr/bin/clang -pipe -O2 -arch x86_64  -fno-common -pipe -fno-common
   -DRUBY_EXPORT -arch x86_64 -L. -L/opt/local/lib -arch x86_64
   main.o dmydln.o libruby-static.a -lpthread -ldl -lobjc   -o miniruby
   ./lib/fileutils.rb:1428: [BUG] unexpected local variable
   ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-darwin11]

   make: *** [.rbconfig.time] Abort trap: 6

make testのbignumが通らない。

   not ok bignum 5 -- ./sample/test.rb:1279
   not ok bignum 7 -- ./sample/test.rb:1281
   not ok bignum 8 -- ./sample/test.rb:1282
   not ok bignum 9 -- ./sample/test.rb:1284
   not ok bignum 12 -- ./sample/test.rb:1292
   test failed

ソケットを開くと(?)SEGV。drbとかhttpサーバをあげようとすると落ちる。

対策

1.9にならうなら、volatileやRB_GC_GUARD()なんかなんだけど、該当箇所を見つける方法がわからん。

bignumはどうにかなるかもな気がするので、まずはそこからかなあ。

おまけ - 最適化しない場合のパフォーマンス

みんな大好きフィボナッチをてきとーに流してみた感じだと、gcc-4.2 -O2のrubyと比較して最適化しないclangのrubyは+40%くらいの実行時間だったような(メモ忘れ)。意外と差が小さいなあと思いました。