[macruby-changes] [1404] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 9 12:09:18 PDT 2009
Revision: 1404
http://trac.macosforge.org/projects/ruby/changeset/1404
Author: lsansonetti at apple.com
Date: 2009-04-09 12:09:14 -0700 (Thu, 09 Apr 2009)
Log Message:
-----------
experiment with the LLVM interpreter for #eval (disabled for now)
Modified Paths:
--------------
MacRuby/branches/experimental/eval.c
MacRuby/branches/experimental/load.c
MacRuby/branches/experimental/rakelib/builder.rb
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
MacRuby/branches/experimental/tool/compile_prelude.rb
MacRuby/branches/experimental/vm_eval.c
Modified: MacRuby/branches/experimental/eval.c
===================================================================
--- MacRuby/branches/experimental/eval.c 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/eval.c 2009-04-09 19:09:14 UTC (rev 1404)
@@ -195,7 +195,7 @@
return FIX2INT(n);
}
rb_vm_set_running(true);
- rb_vm_run(RSTRING_PTR(rb_progname), (NODE *)n, NULL);
+ rb_vm_run(RSTRING_PTR(rb_progname), (NODE *)n, NULL, false);
return ruby_cleanup(0);
}
Modified: MacRuby/branches/experimental/load.c
===================================================================
--- MacRuby/branches/experimental/load.c 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/load.c 2009-04-09 19:09:14 UTC (rev 1404)
@@ -287,7 +287,7 @@
if (node == NULL) {
rb_raise(rb_eSyntaxError, "compile error");
}
- rb_vm_run(fname_str, node, NULL);
+ rb_vm_run(fname_str, node, NULL, false);
}
void
Modified: MacRuby/branches/experimental/rakelib/builder.rb
===================================================================
--- MacRuby/branches/experimental/rakelib/builder.rb 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/rakelib/builder.rb 2009-04-09 19:09:14 UTC (rev 1404)
@@ -83,7 +83,7 @@
INSTALL_NAME = File.join(FRAMEWORK_USR_LIB, 'lib' + RUBY_SO_NAME + '.dylib')
ARCHFLAGS = ARCHS.map { |a| '-arch ' + a }.join(' ')
-LLVM_MODULES = "core jit nativecodegen"
+LLVM_MODULES = "core jit nativecodegen interpreter"
CFLAGS = "-I. -I./include -I/usr/include/libxml2 #{ARCHFLAGS} -fno-common -pipe -O3 -g -Wall -fexceptions"
CFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
OBJC_CFLAGS = CFLAGS + " -fobjc-gc-only"
@@ -235,4 +235,4 @@
end
end
-$builder = Builder.new(OBJS)
\ No newline at end of file
+$builder = Builder.new(OBJS)
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/roxor.cpp 2009-04-09 19:09:14 UTC (rev 1404)
@@ -3,7 +3,7 @@
#define ROXOR_COMPILER_DEBUG 0
#define ROXOR_VM_DEBUG 0
#define ROXOR_DUMP_IR_BEFORE_EXIT 0
-#define ROXOR_ULTRA_LAZY_JIT 0
+#define ROXOR_ULTRA_LAZY_JIT 1
#include <llvm/Module.h>
#include <llvm/DerivedTypes.h>
@@ -16,6 +16,7 @@
#include <llvm/Target/TargetData.h>
#include <llvm/ExecutionEngine/JIT.h>
#include <llvm/ExecutionEngine/JITMemoryManager.h>
+#include <llvm/ExecutionEngine/GenericValue.h>
#include <llvm/Target/TargetData.h>
#include <llvm/Target/TargetMachine.h>
#include <llvm/Target/TargetOptions.h>
@@ -399,6 +400,7 @@
ExistingModuleProvider *emp;
RoxorJITManager *jmm;
ExecutionEngine *ee;
+ ExecutionEngine *iee;
FunctionPassManager *fpm;
bool running;
@@ -441,6 +443,7 @@
RoxorVM(void);
IMP compile(Function *func);
+ VALUE interpret(Function *func);
bool symbolize_call_address(void *addr, void **startp,
unsigned long *ln, char *name, size_t name_len);
@@ -2223,6 +2226,7 @@
emp = new ExistingModuleProvider(RoxorCompiler::module);
jmm = new RoxorJITManager;
ee = ExecutionEngine::createJIT(emp, 0, jmm, true);
+ assert(ee != NULL);
fpm = new FunctionPassManager(emp);
fpm->add(new TargetData(*ee->getTargetData()));
@@ -2239,6 +2243,9 @@
fpm->add(createCFGSimplificationPass());
// Eliminate tail calls.
fpm->add(createTailCallEliminationPass());
+
+ iee = ExecutionEngine::create(emp, true);
+ assert(iee != NULL);
}
IMP
@@ -2277,6 +2284,15 @@
return imp;
}
+VALUE
+RoxorVM::interpret(Function *func)
+{
+ std::vector<GenericValue> args;
+ args.push_back(PTOGV((void *)GET_VM()->current_top_object));
+ args.push_back(PTOGV(NULL));
+ return (VALUE)iee->runFunction(func, args).IntVal.getZExtValue();
+}
+
bool
RoxorVM::symbolize_call_address(void *addr, void **startp, unsigned long *ln,
char *name, size_t name_len)
@@ -6811,41 +6827,41 @@
}
extern "C"
-IMP
-rb_vm_compile(const char *fname, NODE *node)
-{
- assert(node != NULL);
-
- RoxorCompiler *compiler = new RoxorCompiler(fname);
-
- Function *function = compiler->compile_main_function(node);
-
- delete compiler;
-
- return GET_VM()->compile(function);
-}
-
-extern "C"
VALUE
-rb_vm_run(const char *fname, NODE *node, rb_vm_binding_t *binding)
+rb_vm_run(const char *fname, NODE *node, rb_vm_binding_t *binding,
+ bool try_interpreter)
{
if (binding != NULL) {
GET_VM()->bindings.push_back(binding);
}
- IMP imp = rb_vm_compile(fname, node);
+ RoxorCompiler *compiler = new RoxorCompiler(fname);
+ Function *function = compiler->compile_main_function(node);
+ delete compiler;
if (binding != NULL) {
GET_VM()->bindings.pop_back();
}
+#if 0
+ // TODO the LLVM interpreter is not ready yet
+ if (try_interpreter) {
+ return GET_VM()->interpret(function);
+ }
+ else {
+ IMP imp = GET_VM()->compile(function);
+ return ((VALUE(*)(VALUE, SEL))imp)(GET_VM()->current_top_object, 0);
+ }
+#else
+ IMP imp = GET_VM()->compile(function);
return ((VALUE(*)(VALUE, SEL))imp)(GET_VM()->current_top_object, 0);
+#endif
}
extern "C"
VALUE
rb_vm_run_under(VALUE klass, VALUE self, const char *fname, NODE *node,
- rb_vm_binding_t *binding)
+ rb_vm_binding_t *binding, bool try_interpreter)
{
VALUE old_top_object = GET_VM()->current_top_object;
if (binding != NULL) {
@@ -6859,7 +6875,7 @@
GET_VM()->current_class = (Class)klass;
}
- VALUE val = rb_vm_run(fname, node, binding);
+ VALUE val = rb_vm_run(fname, node, binding, try_interpreter);
GET_VM()->current_top_object = old_top_object;
GET_VM()->current_class = old_class;
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/roxor.h 2009-04-09 19:09:14 UTC (rev 1404)
@@ -48,10 +48,10 @@
void *cache;
} rb_vm_method_t;
-VALUE rb_vm_run(const char *fname, NODE *node, rb_vm_binding_t *binding);
+VALUE rb_vm_run(const char *fname, NODE *node, rb_vm_binding_t *binding,
+ bool try_interpreter);
VALUE rb_vm_run_under(VALUE klass, VALUE self, const char *fname, NODE *node,
- rb_vm_binding_t *binding);
-IMP rb_vm_compile(const char *fname, NODE *node);
+ rb_vm_binding_t *binding, bool try_interpreter);
bool rb_vm_running(void);
void rb_vm_set_running(bool flag);
Modified: MacRuby/branches/experimental/tool/compile_prelude.rb
===================================================================
--- MacRuby/branches/experimental/tool/compile_prelude.rb 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/tool/compile_prelude.rb 2009-04-09 19:09:14 UTC (rev 1404)
@@ -80,7 +80,7 @@
rb_vm_run(prelude_name<%=i%>, rb_compile_string(
prelude_name<%=i%>,
rb_str_new(prelude_code<%=i%>, sizeof(prelude_code<%=i%>) - 1),
- 1), NULL);
+ 1), NULL, false);
% }
}
Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c 2009-04-09 05:58:22 UTC (rev 1403)
+++ MacRuby/branches/experimental/vm_eval.c 2009-04-09 19:09:14 UTC (rev 1404)
@@ -348,7 +348,7 @@
}
}
- return rb_vm_run_under(klass, self, file, node, b);
+ return rb_vm_run_under(klass, self, file, node, b, true);
}
static VALUE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090409/17c0e883/attachment.html>
More information about the macruby-changes
mailing list