Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-09-23

llvmrubyが動いた!!

20:17 |  llvmrubyが動いた!!を含むブックマーク  llvmrubyが動いた!!のブックマークコメント

いろいろ、やってみて何とかllvmrubyのJITを動かすことが出来ました。やったことは、次の通りです。

  • llvmrubyのオリジナルはRSTRING(obj)->ptrなどの構造体を直接参照しているが、RSTRING_PTR(obj)など新しいアクセスマクロに書き換えた
  • cygwin1.dllとcygruby190.dllを明示的にloadするようにした。こうすることで、前日の話題したエラーが出なくなります
  • rb_ary_storeの型が違っていたので変更した

ようやくJITの実験が出来ます。うれしい!うれしい!

よくみるとかなりの部分のバイトコードの変換が出来ているみたいなので、変換ルーチンを作ると結構動くんじゃないかなと期待しています。

Cygwinで動かすためのパッチを載せておきます。

--- a/llvm_module.cpp
+++ b/llvm_module.cpp
@@ -2,6 +2,7 @@
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Analysis/Verifier.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include "llvm/System/DynamicLibrary.h"
 #include <fstream>
 #include <sstream>
 
@@ -92,6 +93,11 @@ VALUE
 llvm_execution_engine_get(VALUE klass, VALUE module) {
   CHECK_TYPE(module, cLLVMModule);
 
+
+  // Load dll Modules for ruby
+  sys::DynamicLibrary::LoadLibraryPermanently("cygwin1.dll");
+  sys::DynamicLibrary::LoadLibraryPermanently("cygruby190.dll");
+
   Module *m = LLVM_MODULE(module);
   ExistingModuleProvider *MP = new ExistingModuleProvider(m);
 
@@ -123,7 +129,7 @@ VALUE
 llvm_module_read_bitcode(VALUE self, VALUE bitcode) {
   Check_Type(bitcode, T_STRING);
 
-  MemoryBuffer *buf = MemoryBuffer::getMemBufferCopy(RSTRING(bitcode)->ptr,RSTRING(bitcode)->ptr+RSTRING(bitcode)->len);
+  MemoryBuffer *buf = MemoryBuffer::getMemBufferCopy(RSTRING_PTR(bitcode),RSTRING_PTR(bitcode)+RSTRING_LEN(bitcode));
   Module *module = ParseBitcodeFile(buf);
   delete buf;
   return Data_Wrap_Struct(cLLVMModule, NULL, NULL, module);
diff --git a/llvm_value.cpp b/llvm_value.cpp
index 25a3fd2..dab1c47 100644
--- a/llvm_value.cpp
+++ b/llvm_value.cpp
@@ -13,7 +13,7 @@ llvm_value_get_constant(VALUE self, VALUE type, VALUE v) {
 
 VALUE 
 llvm_value_get_float_constant(VALUE self, VALUE v) {
-  return llvm_value_wrap(ConstantFP::get(Type::FloatTy, RFLOAT(v)->value));
+  return llvm_value_wrap(ConstantFP::get(Type::FloatTy, RFLOAT_VALUE(v)));
 }
 
 VALUE
diff --git a/ruby_vm.rb b/ruby_vm.rb
index 63e4f7c..6285c8e 100644
--- a/ruby_vm.rb
+++ b/ruby_vm.rb
@@ -266,7 +266,7 @@ class RubyVM
     @rb_ary_new = @module.external_function('rb_ary_new', ftype(VALUE, []))
     @rb_hash_new = @module.external_function('rb_hash_new', ftype(VALUE, []))
     @rb_hash_aset = @module.external_function('rb_hash_aset', ftype(VALUE, [VALUE, VALUE, VALUE]))
-    @rb_ary_store = @module.external_function('rb_ary_store', ftype(VALUE, [VALUE, LONG, VALUE]))
+    @rb_ary_store = @module.external_function('rb_ary_store', ftype(VOID, [VALUE, LONG, VALUE]))
     @rb_to_id = @module.external_function('rb_to_id', ftype(VALUE, [VALUE]))
     @rb_ivar_get = @module.external_function('rb_ivar_get', ftype(VALUE, [VALUE, ID]))
     @rb_ivar_set = @module.external_function('rb_ivar_set', ftype(VALUE, [VALUE, ID, VALUE]))
トラックバック - http://d.hatena.ne.jp/miura1729/20080923/1222168646