2008-09-23
llvmrubyが動いた!!
|いろいろ、やってみて何とかllvmrubyのJITを動かすことが出来ました。やったことは、次の通りです。
- llvmrubyのオリジナルはRSTRING(obj)->ptrなどの構造体を直接参照しているが、RSTRING_PTR(obj)など新しいアクセスマクロに書き換えた
- cygwin1.dllとcygruby190.dllを明示的にloadするようにした。こうすることで、前日の話題したエラーが出なくなります
- rb_ary_storeの型が違っていたので変更した
ようやくJITの実験が出来ます。うれしい!うれしい!
よくみるとかなりの部分のバイトコードの変換が出来ているみたいなので、変換ルーチンを作ると結構動くんじゃないかなと期待しています。
--- 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
リンク元
- 15 http://www.rubyist.net/~kazu/samidare/
- 5 http://209.85.171.104/translate_c?hl=en&sl=ja&tl=en&u=http://d.hatena.ne.jp/miura1729/20080923/1222175356&usg=ALkJrhi2hsR7OuFyg2KUou7qrkuY1y18vQ
- 3 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP277JP278&q=RFC+1213+
- 2 http://www.google.com/search?client=safari&rls=ja-jp&q=llvmruby&ie=UTF-8&oe=UTF-8
- 1 http://a.hatena.ne.jp/fujita-y/
- 1 http://a.hatena.ne.jp/h_sakurai/
- 1 http://counter.hatena.ne.jp/takihiro/log?cid=1&date=&type=
- 1 http://d.hatena.ne.jp/authorNari/?of=10
- 1 http://d.hatena.ne.jp/gamella/20080329/1206760587
- 1 http://d.hatena.ne.jp/keyword/コンパイル